Если я правильно понимаю документацию, reverse
обычно работает со списками.В контексте списка, используемого без аргументов, он возвращает пустой список и по умолчанию не назначает его нигде.В вашем примере, скажем, выводит неизмененные $_
;
Форсирование reverse
в скалярный контекст меняет его поведение и заставляет его переворачивать символьные строки и использует $_
по умолчанию.Поскольку say
может использоваться для печати списков, а также скаляров, он не навязывает свои аргументы в скалярный контекст.
Вероятно, Perl делает DWIM, только для заданных значений "I".
Разбивка того, что делает обратное, когда:
#!/usr/bin/env perl
use strict;
use v5.12;
my $inscalar = "foo bar";
# `reverse` is in list context, $in is coerced to a single-element list
my @outlist = reverse $inscalar;
# `reverse` is in scalar context, so it reverses strings
my $outscalar = reverse $inscalar;
say join(" | ", @outlist); # prints "foo bar"
say $outscalar; # prints "rab oof"
# the "normal" behaviour of `reverse`
my @inlist = qw(foo bar);
@outlist = reverse @inlist;
say join(" | ", @outlist); # prints "bar | foo"