Какое значение подчеркивания в Perl ($ _, @_)? - PullRequest
40 голосов
/ 28 августа 2010

Я новичок в Perl, и я использовал их вот так

$_

foreach (@list) {
    print "$_\n";
}

@_

sub search {
    my ($no, @list) = @_;
}

Как именно это подчеркиваниепеременные работают в Perl?Какие еще конструкции полезны?

Ответы [ 3 ]

51 голосов
/ 28 августа 2010

Это вопрос такого рода, который указывает, что вы действительно должны читать книгу, и, возможно, остальные теги perl faqs .

Тем не менее, $_ - это контекстная переменная, которая неявно создается некоторыми конструкциями и неявно используется некоторыми встроенными функциями.Вот несколько примеров:

while(<>) {
    next if /^#/;
    last if /^q(?:uit)?$/;
    say "Howdy!" if /^hello$/;
}

Это делает большую работу по установке и проверке переменной $_ и эквивалентно:

while(defined($_ = <>)) {
    next if $_ =~ /^#/;
    last if $_ =~ /^q(?:uit)?$/;
    say "Howdy!" if $_ =~ /^hello$/;
}

Другие конструкции, которые устанавливают $_:: foreach циклы, given блоки, map и grep операции и catch блоки в Try :: Tiny .

Другие конструкции, использующие $_это: голые операторы print;, оператор подстановки s/// и оператор транслитерации tr///.

Я бы посоветовал: пока вы изучаете Perl, не используйте неявно $_.Запишите все полностью (как во втором примере выше), чтобы закрепить в уме то, что на самом деле происходит.Точно так же, как когда вы изучаете иностранный язык, вы должны научиться говорить правильно и осторожно, прежде чем вы начнете понимать язык.$_ полезен для написания более короткого и лаконичного кода и может быть на самом деле более понятным, если сосредоточиться на продолжающейся обработке, а не на переменных, для которых она выполняется, но только после того, как вы узнаете в качестве второй природы, какие операции используют $_,В противном случае это просто запутанный беспорядок.

Как уже упоминалось, @_ - это список аргументов для подпрограммы.

4 голосов
/ 01 августа 2013

Это специальные переменные в Perl. См. Perl - Специальные переменные .

1 голос
/ 29 июня 2019

Этот вопрос всегда возникает, потому что это per-auto-magic (я придумал этот термин).

foreach (@array_list){
  print $_ . "\n";
}

Эквивалентно:

foreach my $item (@array_list){
  print $item . "\n";
}

Разница в том, что когда переменная не указана для цикла, perl автоматически устанавливает значение по умолчанию $_ для предоставления каждого элемента.

Аналогично, при вызове подпрограмм (или методов - {подпрограмма в объекте}) perl помещает аргументы в подпрограмму в массиве @_, поскольку аргументы всегда будут списком.

С другой стороны, когда встроенная подпрограмма (или любая хорошо написанная подпрограмма) требует аргументов и вызывается без аргументов, она обычно будет работать на $_ или @_ в зависимости от того, ожидает ли она один или несколько аргументов , Некоторые подпрограммы / методы (или функции) могут работать как со скалярными, так и со списковыми значениями, и они по умолчанию обычно используют скалярный контекст и функции по умолчанию $_. Иногда имя проясняет, что оно ожидает список (массив или хэш), а затем его значение по умолчанию @_ в качестве входных данных.

Имейте в виду, что оборотная сторона говорит о входных подпрограммах, и их вывод зависит от дополнительных факторов. Фактически, выходы подпрограммы обычно устанавливают $_ или @_ просто, возвращая скалярное значение или список значений.

Для получения дополнительной информации о том, как написать подпрограмму, которая возвращает значения на основе контекста, ознакомьтесь с wantarray, и вот хорошее описание этого: https://www.perl.com/pub/2006/02/23/advanced_subroutines.html/

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