0

当我运行这个脚本时,它只输出我的文本文件的第一行。

它应该获取电子邮件地址列表并输出十个最常见的域。

例如,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] }}
4

3 回答 3

5

这不是:

while (<F>) {
    print $_;
{

close F;

在你的 while() 循环中关闭你的文件句柄,即在你的第一行之后?我怀疑你需要类似的东西:

while(<F>) {
   # do something
}
close(F);
于 2013-08-16T09:56:43.933 回答
4

你想要做的就是这样,它将在第一个 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;
于 2013-08-16T12:41:42.120 回答
0

您似乎正在尝试使用@mpapec 的答案:Script for a list of data on STDIN 返回最常见的值

您应该将 的内容传递Emails.txt到该命令中:

perl -ne '
  $s{$_}++ 
}{ 
  print map "$s{$_}: $_",
   (sort {$s{$b} <=> $s{$a}} keys %s)[0..9]
' Emails.txt

但是,此答案不适合提取域。为此,您需要将第一行替换为:

$s{(split /@/)[1]}++
于 2013-08-16T10:36:54.890 回答