оператор печати Perl - PullRequest
       1

оператор печати Perl

0 голосов
/ 23 июля 2010

Может кто-нибудь объяснить мне это утверждение для печати в следующей программе 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); 

1 Ответ

1 голос
/ 23 июля 2010

Это цикл 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 (разделенного табуляцией), который имеет значение для этого ключа, за которым следует символ новой строки.

например. если хеш был ("c" => [1,2,3], "b => [11,12,13]), он вывел бы:

b [TAB]11[TAB]12[TAB]13
a [TAB]1[TAB]2[TAB]3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...