【问题标题】:Perl Script only displaying first line of text filePerl 脚本只显示文本文件的第一行
【发布时间】:2013-08-30 20:59:36
【问题描述】:

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

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

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

【问题讨论】:

标签: perl


【解决方案1】:

这不是吗:

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

close F;

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

while(<F>) {
   # do something
}
close(F);

【讨论】:

    【解决方案2】:

    您正在尝试做的是这样的,它将在第一个 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;
    

    【讨论】:

      【解决方案3】:

      您似乎正在尝试使用@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]}++
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-08
        • 1970-01-01
        相关资源
        最近更新 更多