И @foo[0]
, и $foo[1]
являются допустимыми конструкциями Perl.
$foo[EXPR]
(где EXPR
- произвольное выражение, вычисленное в скалярном контексте), возвращает один элемент, указанный в результате выражения.
@foo[LIST]
(где LIST
- произвольное выражение, вычисленное в контексте списка), возвращает каждый элемент, указанный в результате выражения.
(В отличие от других сообщений, такого нетвещь как $foo[LIST]
в Perl. При использовании $foo[...]
выражение всегда вычисляется в скалярном контексте.)
Хотя @foo[1]
является допустимым выражением, опыт показывает, что эта конструкция обычно используется неправильно,когда было бы более уместно сказать $foo[1]
.Поэтому предупреждение - не исключение - выдается, когда предупреждения включены, и вы используете эту конструкцию.
Что это означает:
my @foo = ( "foo", "bar", "baz" );
$foo[0] 0 eval'ed in scalar cx. Returns scalar "foo". ok
@foo[1] 1 eval'ed in list cx. Returns scalar "bar". Weird. Warns.
@foo[0,2] 0,2 eval'ed in list cx. Returns scalars "foo" and "baz". ok
$foo[0,2] 0,2 eval'ed in scalar cx. Returns scalar "baz". Wrong. Warns.
$foo[@foo] @foo eval'ed in scalar cx. Returns undef. Probably wrong.
Единственная причина, по которой я мог придуматьиспользовать @foo[SCALAR]
в качестве lvalue где-то, что различает скалярный / списочный контекст.Предположим, что
sub bar { wantarray ? (42,19) : 101 }
$foo[0] = bar();
присвоит значение 101
1-му элементу @foo
, но @foo[0] = bar();
присвоит значение 42
.Вместо этого было бы гораздо более распространенным использовать ($foo[0]) = bar()
.
Части поста Защищено авторским правом mob на тех же условиях, что и этот сайт.
Эта публикация посвящена многочисленным проблемам мобов. post , включая 1) неправильное использование LIST
для обозначения чего-то иного, чем произвольное выражение в контексте списка, 2) притворяется, что parens создает списки, 3) притворяется, что есть разница между скалярами возврата и возвратомсписок и 4) делая вид, что нет такой вещи, как нефатальная ошибка.