Часть путаницы заключается в том, что разработчик использует переменную по умолчанию, $_
. Многие команды Perl (я бы сказал, около 1/3 из них) действуют на $_
, когда вы не указываете имя переменной в функции. Например, они синтаксически одинаковы:
my $uppercase_name = uc($_);
my $uppercase_name = uc;
В обоих случаях функция uc
напечатает строку в переменной $_
заглавными буквами. Фактически, даже оператор print
использует переменную $_
. Опять же, они оба одинаковы:
print $_;
print;
Не одобряется использование переменной по умолчанию в новых сценариях Perl, поскольку она не добавляет ясности программе и не ускоряет ее выполнение. Я переписал тот же фрагмент кода, который вы использовали, чтобы показать отсутствующую переменную $_
. Это может облегчить понимание кода:
open(FILE, "cat $fileName |") || die "could not open file";
while ($_ = <FILE>)
{
$_ =~ s/^\s+//;
my @line = split $_;
if ($line[0] !~ /\:/) {
$mark = 0;
}
my $var = $line[$mark];
## some other code
}
Обратите внимание, что оператор while
помещает значение прочитанной строки в переменную $_
и что команда substitute (s/^\s+//
) также работает с переменной $_
, Я надеюсь, что это немного прояснит код.
Теперь на ваши вопросы:
_ [W], что делать '|' и '||' стоять за?
||
означает или , как в том или ином . На практике или можно рассматривать как оператор if:
if (not open(FILE, "cat $fileName |")) {
die "could not open file";
}
То есть, если оператор open не удался, выполните оператор die
. Если оператору open удалось открыть файл, не выполняйте оператор die
.
В Perl теперь вы видите or
вместо ||
в таких случаях:
open(FILE, "cat $fileName |") or die "could not open file";
, что делает значение немного более очевидным: Откройте файл или убейте программу.
Один канал (|
) в конце имени файла означает выполнение команды в операторе открытия (cat $filename
) и чтение из вывода этой команды. Представьте себе что-то вроде этого:
open (COMMAND, "java -jar foo.war|") or die "Can't execute 'java -jar foo.war'";
Теперь я запускаю команду java -jar foo.war
и использую ее вывод в моем скрипте Perl.
Вы можете сделать это и наоборот:
open (MAIL, "|mail $recipient") or die "Can't mail $recipient";
print MAIL "Dear $recipient\n\n";
print MAIL "I hope everything is well.\n";
print MAIL "Sincerely,\n\nDavid";
close MAIL;
Я сейчас открываю команду mail $recipient
и пишу ей с помощью print
операторов. В этом случае я пишу $recipient
с простым сообщением.
Я не понимаю, что такое s / ^ \ s + //; используется для?
В оригинальной программе это было на одной строке:
s/^\s+//;
Я добавил отсутствующую переменную , которая должна немного прояснить это:
$_ =~ s/^\s+//;
Это команда замены в Perl. Он принимает переменную $_
и заменяет регулярное выражение ^\s+
ничем. Если вы не понимаете, что такое регулярные выражения, вам следует взглянуть на Perldoc tutorial на эту тему. В основном это удаление всех пробелов, табуляций и других форм пробела из начала строки.