任何人都可以在下面的perl程序中解释这个print语句。
#! /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 :(得分:1)
这是一个通过postfix modifyer表示的foreach循环,相当于以下常规循环:
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}}
表示将存储在$ 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