Подтвердить что ты не робот

Как проверить, была ли инициализирована скалярная переменная Perl?

Является ли лучший способ проверить, инициализирована ли скалярная переменная в Perl, используя defined?

my $var;

if (cond) {
    $var = "string1";
}

# Is this the correct way?
if (defined $var) {
    ...
}
4b9b3361

Ответ 1

Perl не предлагает способ проверить, была ли инициализирована переменная.

Однако скалярные переменные, которые не были явно инициализированы некоторым значением, по умолчанию имеют значение undef. Вы правы в defined, являющемся правильным способом проверить, имеет ли переменная значение undef.

Там несколько других способов. Если вы хотите назначить переменную, если она undef, что указывает ваш пример кода, вы можете, например, использовать perl defined-or operator:

$var //= 'a default value';

Ответ 2

Это зависит от того, что вы пытаетесь сделать. Правильный способ 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
}

Другой длинный способ сделать это - создать класс и флаг, когда переменная была изменена, что необязательно.

Ответ 3

Если вам все равно, пусто или нет, это так. В противном случае вы можете проверить

if ( length( $str || '' )) {}

Ответ 4

Это зависит от того, что вы планируете делать с переменной, независимо от того, определена она или нет; с Perl 5.10 вы можете сделать это (от perl51000delta):

Был реализован новый оператор//(определенный-или). Следующее выражение:

 $a // $b

просто эквивалентно

defined $a ? $a : $b

и утверждение

$c //= $d;

теперь можно использовать вместо

$c = $d unless defined $c;

Ответ 5

'defined' возвращает true, если переменная имеет реальное значение.

В стороне, в хеше, это может быть правдой:

if(exists $h{$e} && !defined $h{$e})