Резюме
- Булевы тесты
- Увеличение или уменьшение неопределенного значения
- Добавление к неопределенному значению
- Autovivification
- Другие мутаторы
Булевы тесты
Согласно документации perlsyn ,
Число 0
, строки '0'
и ''
, пустой список ()
и undef
все ложно в логическом контексте. Все остальные значения верны.
Поскольку неопределенное значение равно false, следующая программа
#! /usr/bin/perl
use warnings;
my $var;
print "A\n" if $var;
$var && print "B\n";
$var and print "C\n";
print "D\n" if !$var;
print "E\n" if not $var;
$var or print "F\n";
$var || print "G\n";
выводит D
- G
без предупреждений.
Увеличение или уменьшение неопределенного значения
Нет необходимости явно инициализировать скаляр в ноль, если ваш код будет увеличивать или уменьшать его хотя бы один раз:
#! /usr/bin/perl
use warnings;
my $i;
++$i while "aaba" =~ /a/g;
print $i, "\n";
Код выше выводит 3
без предупреждений.
Добавление к неопределенному значению
Подобно неявному нулю, нет необходимости явно инициализировать скаляры для пустой строки, если вы добавите к ней хотя бы один раз:
#! /usr/bin/perl
use warnings;
use strict;
my $str;
for (<*>) {
$str .= substr $_, 0, 1;
}
print $str, "\n";
Autovivification
Одним из примеров является "автовивификация". Из статьи Википедии :
Автовивификация - отличительная черта языка программирования Perl, включающая динамическое создание структур данных. Autovivification - это автоматическое создание ссылки на переменную при разыменовании неопределенного значения. Другими словами, автовивификация Perl позволяет программисту ссылаться на структурированную переменную и произвольные подэлементы этой структурированной переменной без предварительного явного объявления о существовании переменной и ее полной структуре.
Например:
#! /usr/bin/perl
use warnings;
my %foo;
++$foo{bar}{baz}{quux};
use Data::Dumper;
$Data::Dumper::Indent = 1;
print Dumper \%foo;
Несмотря на то, что мы не инициализируем промежуточные ключи явно, Perl позаботится о строительных лесах:
$VAR1 = {
'bar' => {
'baz' => {
'quux' => '1'
}
}
};
Без автовивификации код потребует больше шаблонов:
my %foo;
$foo{bar} = {};
$foo{bar}{baz} = {};
++$foo{bar}{baz}{quux}; # finally!
Не путайте автовивификацию с неопределенными значениями, которые она может выдавать. Например, с
#! /usr/bin/perl
use warnings;
my %foo;
print $foo{bar}{baz}{quux}, "\n";
use Data::Dumper;
$Data::Dumper::Indent = 1;
print Dumper \%foo;
получаем
Use of uninitialized value in print at ./prog.pl line 6.
$VAR1 = {
'bar' => {
'baz' => {}
}
};
Обратите внимание, что промежуточные ключи автоматически оживлены.
Другие примеры автовивификации:
К сожалению, Perl (пока!) Не автовифицирует следующее:
my $code;
$code->("Do what I need please!");
Другие мутаторы
В ответе на аналогичный вопрос , ysth сообщает
Некоторые операторы специально для вашего удобства намеренно пропускают «неинициализированное» предупреждение, поскольку они обычно используются в ситуациях, когда имеет значение 0 или «» значение по умолчанию для левого или единственного операнда.
Это: ++
и --
(до или после), +=
, -=
, .=
, |=
, ^=
, &&=
, ||=
.
Будучи «определенным или», //=
счастливо изменяет неопределенное значение без предупреждения.