perl打印声明

时间:2010-07-23 10:41:19

标签: perl

任何人都可以在下面的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); 

1 个答案:

答案 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
相关问题