0

このスクリプトを実行すると、テキスト ファイルの最初の行だけが出力されます。

電子メール アドレスのリストを取得し、最も出現頻度の高い 10 個のドメインを出力することになっています。

たとえば、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の答えを使おうとしているようです:最も一般的な値を返す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 に答える