当我运行此脚本时,它只输出我的文本文件的第一行。
应该采用电子邮件地址列表并输出十个最常出现的域。
例如,Timmy @ yahoo.co.uk => 4 Joebloggs@hotmail.com => 3
#!D:\Perl\bin\perl
#Read file
open F, "<Emails.txt" or die $!;
while (<F>) {
print $_;
{
close F;
perl ne
$s{$_}++
}{
print map "$s{$_}: $_",
(sort {$s{$b} <=> $s{$a}} keys %s)[0..9] }}
答案 0 :(得分:5)
这不是:
while (<F>) {
print $_;
{
close F;
在你的while()循环中关闭你的文件句柄,即在你的第一行之后?我怀疑你需要这样的东西:
while(<F>) {
# do something
}
close(F);
答案 1 :(得分:4)
你要做的就是这样,它将在第1个while循环结束时关闭文件句柄 因此你只能获得第一线。因此你需要在文件句柄之外关闭它
open (FH ,'<',"text.txt") or die "can't open";
while(<FH>)
{
print $_;
close FH;
}
试试这个:
open (FH ,'<',"text.txt") or die "can't open";
while(<FH>)
{
print $_;
}
close FH;
答案 2 :(得分:0)
您似乎正在尝试使用@ mpapec的答案:Script for a list of data on STDIN returning most common values
您应该将Emails.txt
的内容传递给该命令:
perl -ne '
$s{$_}++
}{
print map "$s{$_}: $_",
(sort {$s{$b} <=> $s{$a}} keys %s)[0..9]
' Emails.txt
但是,这个答案不适合提取域名。为此,您需要将第一行替换为:
$s{(split /@/)[1]}++