在if语句中声明一个标量?

时间:2011-05-06 14:28:22

标签: perl

为什么我不能在if语句中声明标量变量?它与变量的范围有关吗?

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

谁说你不能?

#! /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

那么,你的意思是哪一个?

答案 2 :(得分:3)

只是为了跟进我的评论。以下陈述完全合法:

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

由我的一位同事提供。

答案 3 :(得分:0)

有一个例外:您可能无条件声明变量并在不同条件下使用它。这意味着不允许以下内容:

my $x = ... if ...;