Заставляя быть скаляром - PullRequest
6 голосов
/ 23 октября 2011
#!/usr/bin/perl
use Modern::Perl;
while (<>)
{ chomp;
say reverse;  
}

Приведенный выше код не работает, но когда я изменяю вторую последнюю строку на say scalar reverse;, он работает нормально.Почему я должен явно указывать скаляр?Perl DWIM не может быть?

Ответы [ 2 ]

6 голосов
/ 23 октября 2011

Если я правильно понимаю документацию, 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"
3 голосов
/ 23 октября 2011
Почему я должен явно указывать скаляр?

Поскольку задокументировано , reverse меняет порядок элементов списка аргументов при использовании в контексте списка. Например, reverse 'a', 'b', 'c' возвращает 'c', 'b', 'a'.

Не может ли Perl DWIM?

Да, он может делать то, что вы хотите (скалярное поведение, когда отсутствует выражение аргумента).

Хотя это может сбить с толку Я не могу представить ни одного другого оператора, который изменяет поведение, основываясь на отсутствии выражения аргумента (в отличие от просто отсутствия аргументов).

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