Если вы застряли с пре-5.10, то решения, представленные выше, не будут полностью повторять функцию say
. Например
sub say { print @_, "\n"; }
Не будет работать с такими вызовами, как
say for @arr;
или
for (@arr) {
say;
}
... потому что вышеуказанная функция не действует на неявную глобальную $_
, такую как print
и действительную say
функцию.
Чтобы более точно воспроизвести perl 5.10+ say
, вам нужна эта функция
sub say {
if (@_) { print @_, "\n"; }
else { print $_, "\n"; }
}
Который сейчас действует так
my @arr = qw( alpha beta gamma );
say @arr;
# OUTPUT
# alphabetagamma
#
say for @arr;
# OUTPUT
# alpha
# beta
# gamma
#
Встроенный в perl6 say
ведет себя немного по-другому. Вызов его с помощью say @arr
или @arr.say
не просто объединит элементы массива, но вместо этого напечатает их, разделенные разделителем списка. Чтобы повторить это в perl5, вы должны сделать это
sub say {
if (@_) { print join($", @_) . "\n"; }
else { print $_ . "\n"; }
}
$"
- это переменная разделителя глобального списка, или, если вы используете English.pm
, тогда это $LIST_SEPARATOR
Теперь он будет больше похож на perl6, вот так
say @arr;
# OUTPUT
# alpha beta gamma
#