Как проверить, была ли инициализирована скалярная переменная Perl? - PullRequest
32 голосов
/ 18 сентября 2010

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

my $var;

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

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

Ответы [ 5 ]

33 голосов
/ 18 сентября 2010

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

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

. Существует несколько других способов.Если вы хотите присвоить переменной значение undef, которое, как кажется, указывает ваш пример кода, вы можете, например, использовать оператор perl определен-или:

$var //= 'a default value';
10 голосов
/ 18 сентября 2010

Это зависит от того, что вы пытаетесь сделать. Правильный 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's falsy, in which case set to 'foo'
  5)   $var ||= "foo";                        # retain value of $var unless it's falsy, in which case set to 'foo' (same as previous line)
  6)   $var = $var // "foo";                  # set to $var unless it's undefined, in which case set to 'foo'
  7)   $var //= "foo";                        # 5.10+ ; retain value of $var unless it's 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's been changed
my $var = "foo";
{...}
if ($var eq "foo"){
   ... # do something
} else {
   ... # do something else
}

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

5 голосов
/ 18 сентября 2010

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

if ( length( $str || '' )) {}
3 голосов
/ 18 сентября 2010

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

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

 $a // $b

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

defined $a ? $a : $b

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

$c //= $d;

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

$c = $d unless defined $c;
1 голос
/ 18 сентября 2010

'определено' вернет истину, если переменная имеет действительное значение.

В качестве отступа в хэше это может быть истиной:

if(exists $h{$e} && !defined $h{$e})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...