0

ファイルを読み取ろうとしていて、whileループの外側に出力を出力したいと思っています。あなたがそれをすることができる方法はありますか?

これは私がしていることです:

   my $booklistFile= file.txt;
   my $perlbook;
   my $javabook;
   my $cbook;
   my $data;

   open my $booklist, "<", $booklistFile or die "can not open the file";
   my %bookHash = ();

   while(<$booklist>)
   {
     ($perlbook, $javabook, $cbook) = split (',');
     $bookHash{$cbook} = $cbook;
     $data = $bookHash{$cbook} ;

     print $data;
   }

これにより、ループの$data内側が印刷されます。ループの外側でwhile印刷する方法はありますか?$datawhile

4

2 に答える 2

1

出力を変数に累積し、ループが終了した後に出力しますか?

my $data;
while(<$booklist>){
    ($perlbook, $javabook, $cbook) = split (',');
    $bookHash{$cbook} = $cbook;
    $data = $bookHash{$cbook} ;
    $output .= $data;
}
print $output;
于 2012-07-10T14:26:18.073 に答える
1

私はあなたがここで何をしようとしているのかを推測しているだけです。あなたのコードを見ると、おそらく本のタイトルを含むカンマ区切りのレコードを含むファイルがありますか?

その場合、以下のスニペットはすべてのCブックを印刷します。これは、入力行の3番目のフィールドにあるはずです。 ($perlbook, $javabook, $cbook) = split (',');

...
my $booklistFile= 'file.txt';
open my $bookhandle, '<', $booklistFile or die "can not open $!";
my %bookHash = ();

while(my $line = <$bookhandle>) {
   chomp $line;
   my @record = split /\s*,\s*/, $line;
   push @{ $bookHash{PERL} }, $record[0];
   push @{ $bookHash{JAVA} }, $record[1];
   push @{ $bookHash{C}    }, $record[2];
}

# print all c books alphabetically sorted
print join "\n", sort @{ $bookHash{C} };
...

これで、ループの後にCブックをソートされた順序で取得できます。

ループ部分は、ハッシュスライスを使用して繰り返しなしで書き込むこともできます。

   ...
   ...
   my @record = split /\s*,\s*/, $line;
   for my $category ( @bookHash{'PERL', 'JAVA', 'C'} ) {
      push @$category, shift @record
   }
   ...
   ...

よろしく、

rbo

于 2012-07-10T14:47:08.353 に答える