Является ли лучший способ проверить, инициализирована ли скалярная переменная в Perl, используя defined
?
my $var;
if (cond) {
$var = "string1";
}
# Is this the correct way?
if (defined $var) {
...
}
Является ли лучший способ проверить, инициализирована ли скалярная переменная в Perl, используя defined
?
my $var;
if (cond) {
$var = "string1";
}
# Is this the correct way?
if (defined $var) {
...
}
Perl не предлагает способ проверить, была ли инициализирована переменная.
Однако скалярные переменные, которые не были явно инициализированы некоторым значением, по умолчанию имеют значение undef
. Вы правы в defined
, являющемся правильным способом проверить, имеет ли переменная значение undef
.
Там несколько других способов. Если вы хотите назначить переменную, если она undef
, что указывает ваш пример кода, вы можете, например, использовать perl defined-or operator:
$var //= 'a default value';
Это зависит от того, что вы пытаетесь сделать. Правильный способ C
делать это - инициализировать переменные, когда они объявлены; однако Perl is not C
, поэтому одно из следующих может быть тем, что вы хотите:
1) $var = "foo" unless defined $var; # set default after the fact
2) $var = defined $var? $var : {...}; # ternary operation
3) {...} if !(defined $var); # another way to write 1)
4) $var = $var || "foo"; # set to $var unless it falsy, in which case set to 'foo'
5) $var ||= "foo"; # retain value of $var unless it falsy, in which case set to 'foo' (same as previous line)
6) $var = $var // "foo"; # set to $var unless it undefined, in which case set to 'foo'
7) $var //= "foo"; # 5.10+ ; retain value of $var unless it undefined, in which case set to 'foo' (same as previous line)
C способ делать вещи (не рекомендуется):
# initialize the variable to a default value during declaration
# then test against that value when you want to see if it been changed
my $var = "foo";
{...}
if ($var eq "foo"){
... # do something
} else {
... # do something else
}
Другой длинный способ сделать это - создать класс и флаг, когда переменная была изменена, что необязательно.
Если вам все равно, пусто или нет, это так. В противном случае вы можете проверить
if ( length( $str || '' )) {}
Это зависит от того, что вы планируете делать с переменной, независимо от того, определена она или нет; с Perl 5.10 вы можете сделать это (от perl51000delta):
Был реализован новый оператор//(определенный-или). Следующее выражение:
$a // $b
просто эквивалентно
defined $a ? $a : $b
и утверждение
$c //= $d;
теперь можно использовать вместо
$c = $d unless defined $c;
'defined' возвращает true, если переменная имеет реальное значение.
В стороне, в хеше, это может быть правдой:
if(exists $h{$e} && !defined $h{$e})