2012-07-10 50 views
0

我試圖讀取一個文件,然後打印while循環之外的輸出。有沒有辦法可以做到這一點?在perl中打印循環外部的散列

這是我在做什麼:

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; 
    } 

這將打印$datawhile循環中。有沒有辦法可以在while循環之外打印$data

+2

['的perldoc perldsc'](HTTP://的perldoc .perl.org/perldsc.html#訪問和打印對的一散列-OF-HASHES) – Zaid 2012-07-10 14:26:45

回答

1

我只是猜測你在這裏做什麼。如果我看看你的代碼, 你可能有一個帶逗號分隔記錄的文件,其中包含 書名?

如果是的話中,摘錄以下將打印的所有C語言的書籍,這應該是在第三場 您的輸入線,根據您的 ($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

1

將輸出累加到變量中並在循環結束後打印?

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