Что делает эта функция Perl? - PullRequest
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; 
}

Меня больше интересуют shift и push и chomp.

Ответы [ 3 ]

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

Редактировать: Вы опубликовали дополнительный код, я тоже это прокомментирую.

#!/usr/bin/perl 
#The first line (has to be first, hence this comment comes after) allows the linux shell to know 
#this is a perl program, and to call perl to execute it.

#use strict: allow stricter checking of perl syntax. You should always do this.
use strict; 

#declare a global variable called hash - not a very good name...
my %hash; 

#call the method with 'first.txt' as argument
&Parse('first.txt'); 
&Parse('second.txt');  #same thing, different parameter


my $outputpath = 'output.txt'; 

#destroy the file declared above if it exists
unlink ($outputpath); 

# open the file for append (could simple have opened for output and not used the unlink above...)
open (OUTPUT, ">>$outputpath") || die "Failed to open OUTPUT ($outputpath) - $!"; 

#print a line to output 
#the line comes from a foreach loop
#the foreach loop runs over the hash, sorted by key
#each hash entry contains an array, this array is converted by a string using the JOIN function
# the join function will paste the elements of the array into a string, seperated by a tab
print OUTPUT "$_ \t" . join("\t", @{$hash{$_}}) . "\n" foreach (sort keys %hash); 

#Close the outputfile
close (OUTPUT) || die "Failed to close OUTPUT ($outputpath) - $!"; 

Эта программа, вероятно, была написана некоторое время назад - Modern Perl выглядит немного иначе и имеет несколько лучших практик, которых еще нет.

Не используйте это как пример того, как писать на Perl. Может быть, Ether перепишет это для вас, если вы мило улыбнетесь:)

#declare a sub
sub Parse { 
    # the parameters given to a sub are stored in @_. 
    #shift without arguments takes the first element from @_
    my $inputpath = shift; 
    #opens the file "inputpath" into fileglob INPUT. 
    #If this fails, quit with an error message
    open (INPUT, "<$inputpath") || die "Failed to open INPUT ($inputpath) - $!"; 

    #loop over the file one line at the time, putting each line in $_
    while (<INPUT>) { 

        #chop = remove last character. chomp = remove last character if it is a CRLF. 
        #Without arguments, works on $_ 
        chomp; 

        #split the $_ variable (containing the row) 
        #into an array based on the tab character
        my @row = split(/\t/, $_); 

        # take the first element into col1
        my $col1 = $row[0]; 

        # shift it (remove the first element)
        shift @row; 

        # actually both rows above can be just written as one statement:
        my $col1 = shift @row;

        #the $hash variable is probably a global hashref defined somewhere above...
        #the $hash hashref now contains a bucket named with the 'col1' value
        # the value of that bucket is the array of the row we just read
        push(@{$hash{$col1}}, @row); 

        # end the while loop
    } 

    #close the file or die
    close (INPUT) || die "Failed to close INPUT ($inputpath) - $!"; 

    #end the method
    return 1; 
}
3 голосов
/ 23 июля 2010

Просмотрите документацию .

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

Если у вас установлена ​​нормальная установка perl, вам помогут следующие команды командной строки:

perldoc -f shift
perldoc -f push
perldoc -f chomp

Тебе тоже понравится:

perldoc perlfunc
perldoc perlvar

Не пропустите perlvar часть о $_, иначе вы никогда не поймете, что такое Perl.

Вы постепенно заметите, что perl не объектно-ориентирован, он поддерживает объекты, но это довольно странная реализация. Perl более ориентирован на выполнение работы , а работа обычно связана с извлечением или переводом некоторого набора данных.

Perl one liners - самые мощные командные строки, которые вы когда-либо будете писать:

perl -pe 's/(\d*)/$1*10/ge'

Проверьте переключатели -p, -e, -n и -i в perldoc perlrun

(Это одна из главных причин, по которой Perl 6 был запланирован как основная перезапись, только сейчас он находится в разработке с всегда и планируется выпустить на следующий день после Duke Nukem Forever )

shift в любом случае похоже на some_array.pop(1) Python или some_array.shift() javascript и т. Д.

push походит на some_array.append(junk) Python или some_array.push(more_junk) javascript и т. Д.

chomp действительно своеобразен и на самом деле является кроссплатформенной версией chop: он удаляет символ конца строки из строк, которые были прочитаны из stdin. Это своего рода хак, чтобы преодолеть этот маленький бриллиантовый оператор <> (проверьте perldoc perlop - раздел «Операторы ввода / вывода») недостаток: бриллиант читает stdin или аргумент файла командной строки построчно, но не удаляет \n. (ни \r\n)

chomp удаляет их после этого. (chop удаляет только \n и оставляет \r в покое.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...