2010-07-23 209 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