Объявление скаляра внутри оператора if? - PullRequest
2 голосов
/ 06 мая 2011

Почему я не могу объявить скалярную переменную внутри оператора if? Это как-то связано с областью действия переменной?

Ответы [ 4 ]

8 голосов
/ 06 мая 2011

Каждый блок {...} в Perl создает новую область видимости.Сюда входят пустые блоки, блоки подпрограмм, блоки BEGIN, блоки структур управления, блоки структур циклов, встроенные блоки (map / grep), блоки eval и тела циклов модификатора оператора.

Если блок имеет инициализациюраздел, этот раздел рассматривается в рамках следующего блока.

if (my $x = some_sub()) {
    # $x in scope here
} 
# $x out of scope

В цикле модификатора оператора раздел инициализации не содержится в области действия псевдоблока:

$_ = 1 for my ($x, $y, $z);

# $x, $y, and $z are still in scope and each is set to 1
5 голосов
/ 06 мая 2011

Кто сказал, что ты не можешь?

#! /usr/bin/env perl

use warnings;
no warnings qw(uninitialized);
use strict;
use feature qw(say);
use Data::Dumper;

my $bar;

if (my $foo eq $bar) {
    say "\$foo and \$bar match";
}
else {
    say "Something freaky happened";
}

$ ./test.pl 
$foo and $bar match

Работает отлично! Конечно, это не имеет смысла, так как вы тоже сравниваете $foo? Не имеет значения.

Можете ли вы дать мне пример того, что вы делаете и какие результаты вы получаете?

Или, это больше, что вы имеете в виду?:

if (1 == 1) {
   my $foo = "bar";
   say "$foo";    #Okay, $foo is in scope
}

say "$foo;"    #Fail: $foo doesn't exist because it's out of scope

Так, кого ты имеешь в виду?

3 голосов
/ 06 мая 2011

Просто чтобы прокомментировать мой комментарий.Заявления, подобные следующим, совершенно законны:

if( my( $foo, $bar ) = $baz =~ /^(.*?)=(.*?)$/ ) {
  # Do stuff
}

Предоставлено одним из моих коллег.

0 голосов
/ 06 мая 2011

Существует исключение: вы не можете условно объявлять переменную и использовать ее в других условияхЭто означает, что следующее не разрешено:

my $x = ... if ...;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...