Thursday, January 14, 2010

Об автовивификации в Perl

Как известно, в Perl ссылки могут создаваться автоматически во многих случаях. Эта фича называется автовивификацией. В документации расплывчато говорится, что автовивификация имеет место быть в lvalue-контексте. Иными словами, если код подразумевает изменение значения переменной, то он может вызвать автовивификацию. Например:


use strict;
use Data::Dumper;
my $arr;
1 for @$arr;
print Dumper $arr # $VAR1 = [];

Казалось бы, никакого изменения элементов массива тут нет. Однако foreach создает тот самый lvalue-контекст, поскольку позволяет менять элементы массива (через переменную $_ по умолчанию). Таким же свойством обладают операторы grep и map.

Для сравнения:

use strict;
my $arr;
print @$arr;

Can't use an undefined value as an ARRAY reference at -e line 1.


Весьма странным в этом свете выглядит автовивификация при использовании функций defined и exists:


use strict;
my $x;
1 if exists $x->{key};
print $x; # HASH(0x86f37d0)


С другой стороны, если бы все было логично и не противоречиво, это был бы уже не Perl :)

No comments:

Post a Comment