В Perl много скрытого поведения, гораздо больше, чем в большинстве других языков.Девиз Perl: «Есть больше, чем один, и потому, что существует так много неявного поведения, часто существует больше, чем один способ выразить одно и то же».
/foo/
вместо $_ =~ m/foo/
$x = shift
вместо $x = shift @_
while (defined($_=<ARGV>))
вместо while(<>)
и т. Д.
Какие выражения использоватьв значительной степени зависит от ваших местных стандартов кодирования и личных предпочтений.Более явные выражения напоминают читателю, что на самом деле происходит под капотом.Это может улучшить или не улучшить читаемость кода - это зависит от того, насколько хорошо осведомлена аудитория и используете ли вы хорошо известные идиомы.
В этом случае неявное поведение немного сложнее, чемпохоже на то.Иногда perl
будет неявно выполнять defined(...)
тест на результат оператора readline:
$ perl -MO=Deparse -e 'while($s=<>) { print $s }'
while (defined($s = <ARGV>)) {
print $s;
}
-e syntax OK
, но иногда это не будет:
$ perl -MO=Deparse -e 'if($s=<>) { print $s }'
if ($s = <ARGV>) {
print $s;
}
-e syntax OK
$ perl -MO=Deparse -e 'while(some_condition() && ($s=<>)) { print $s }'
while (some_condition() and $s = <ARGV>) {
print $s;
}
-e syntax OK
Предположим, что вы обеспокоеныо угловых случаях, которые это неявное поведение должно обрабатывать.Вы посвятили perlop
памяти, чтобы понять, когда Perl использует это неявное поведение, а когда нет?Понимаете ли вы различия в этом поведении между Perl v5.14 и Perl v5.6?Понимают ли люди, читающие ваш код?
Опять же, нет правильного или неправильного ответа о том, когда использовать более явные выражения, но аргумент в пользу использования явного выражения более силен, когда неявное поведение более эзотерично.