2010-07-23 256 views
0

任何人都可以在下面的perl程序中向我解釋此打印語句。perl打印語句

#! /usr/bin/perl 
use strict; 

my %hash; 

&Parse('first.txt'); 
&Parse('second.txt'); 

my $outputpath = 'output.txt'; 
unlink ($outputpath); 
open (OUTPUT, ">>$outputpath") || die "Failed to open OUTPUT ($outputpath) - $!"; 
print OUTPUT "$_ \t" . join("\t", @{$hash{$_}}) . "\n" foreach (sort keys %hash); 
close (OUTPUT) || die "Failed to close OUTPUT ($outputpath) - $!"; 

sub Parse { 
    my $inputpath = shift; 
    open (INPUT, "<$inputpath") || die "Failed to open INPUT ($inputpath) - $!"; 
    while (<INPUT>) { 
     chomp; 
     my @row = split(/\t/, $_); 
     my $col1 = $row[0]; 
     shift @row; 
     push(@{$hash{$col1}}, @row); 
    } 
    close (INPUT) || die "Failed to close INPUT ($inputpath) - $!"; 
    return 1; 
} 

這是語句:

print OUTPUT "$_ \t" . join("\t", @{$hash{$_}}) . "\n" foreach (sort keys %hash); 
+0

將打印通過鍵排序的哈希值,由製表符的文件輸出分隔,每行開頭的鍵值名 – knittl 2010-07-23 10:51:04

+1

你們是不是要學習編程語言一次完整的程序?你爲什麼不閱讀文檔來組裝你的基本詞彙? – Svante 2010-07-23 12:56:02

+0

這是功課嗎? – Ether 2010-07-23 16:23:25

回答

1

這是一個foreach循環通過postfix modifyer表示,這相當於下面的正循環:

foreach (sort keys %hash) { 
    print OUTPUT "$_ \t" . join("\t", @{$hash{$_}}) . "\n"; 
} 

由於沒有循環變量,使用默認的$_變量(在後綴循環中,不能使用命名的循環變量,與常規變量不同)。因此,爲了使其更易於閱讀:

foreach my $key (sort keys %hash) { 
    print OUTPUT "$key \t" . join("\t", @{$hash{$key}}) . "\n"; 
} 

@{$hash{$key}}裝置採取存儲在$散列{$鍵}數組引用並使其成爲一個真正的陣列,並且join("\t", @{$hash{$key}})採用該陣列,並把它在一個製表符分隔串。

因此,對於散列中的每個鍵(按照字母數字順序排序),您將打印鍵名,後跟一個空格和一個製表符,然後是arrayref(製表符分隔)的內容,即該鍵有價值,其次是換行。

E.g.如果哈希爲("c" => [1,2,3], "b => [11,12,13]),它會打印:

b [TAB]11[TAB]12[TAB]13 
a [TAB]1[TAB]2[TAB]3