变量值不通过循环

时间:2014-01-31 18:47:28

标签: perl variables loops conditional

我有一个循环,通过检查文件数是否为常量来检查目录中的所有文件是否都上传到目录。

开始时,它知道目录中有$ before文件(“之前”再次查看)。

use strict;
use warnings;
my $after = 0;
my $before ="10";

until($before == $after) {
    #check again, which changes the value of $after.
    #Now....
    $after = "20"; 

    if ( $after == $before ) {
        print "After is before. Moving out of until because all files are there!\n";
    }
    else {
        print "After isn't before.\n";
        my $before = $after;#set $before to be the new value after the update
        my $after = 0; #this will be updated in the next update
        sleep 1;
    }
}

当我运行它时,它声称它在else{}之前将$ before设置为$ after,但事实上,$ before仍为10,因为它设置为之前,并且程序无休止地循环。

当我从my内删除else{}时,脚本正确运行:

use strict;
use warnings;
my $after = 0;
my $before ="10";

until( $before == $after ) {
    #check again, which changes the value of $after.
    #Now....
    $after = "20"; 

    if($after == $before) {
        print "After is before. Moving out of until because all files are there!\n";
    }
    else {
        print "After isn't before.\n";
        $before = $after;#set $before to be the new value after the update
        $after = 0; #this will be updated in the next update
        sleep 1;
    }
}

这是否意味着在else中定义为'my $ before'的$before与上面定义的'$ before'不是同一个变量?

1 个答案:

答案 0 :(得分:1)

编写代码时, 始终正确 。很难看出代码是如何执行的,并且当代码缩进时也会隐藏错误。此外,始终使用空格,不要加倍语句。 90%的编程都是维护,因此,为了使代码易于理解而进行的额外打字只需要花费大量时间来维护它。

我重新编写了代码,所以我可以阅读它。


当您使用my声明变量时,您将其声明为词法范围。这意味着它是在有限的背景下定义的。这是通常一件好事。这意味着当您不再需要变量时,变量就会消失。但是,它也意味着变量在您需要时会消失。

my个变量存在于定义它们的中。如果在while/until循环内定义,它们就在while循环中。退出while后,他们就会再见。 if语句或for循环也是如此。事实上,如果你只是放置大括号,那么my变量,如果在那些大括号中定义,它将在外面失去它的定义:

{
    my $foo = "bar";
}
print "$foo\n";   # Whoops, $foo is undefined!

如果需要一个变量存在于循环之外,则需要在该循环之外定义:

my $odd_count = 0;
for my $number ( @number_list ) {
    if ( $number % 2 ) { 
        $odd_count++;
    }
}
print "There are $odd_count numbers in my list\n";

如果您使用my重新声明变量,也可以重新定义变量:

use warnings;
use strict;
use feature qw(say);

my $foo = "bar";
{    # New block!
     say "Initial value of \$foo: $foo";
     my $foo = "foo";   # Using "my" on $foo
     say "Changed value of \$foo: $foo";
}
say "Final value of \$foo: $foo";

如果你运行它,你会得到:

Initial value of $foo: bar
Changed value of $foo: foo
Final value of $foo: bar

那是因为您已在块中重新声明$foo,因此您现在有一个新变量$foo,它将覆盖$foo的值,直到块结束。块结束后,the old $ foo`变量返回,其旧值为:

my $foo = "bar";
{    # New block!
     say "Initial value of \$foo: $foo";
     $foo = "foo";   # No "my" on $foo
     say "Changed value of \$foo: $foo";
}
say "Final value of \$foo: $foo";

如果你运行它,你会得到:

Initial value of $foo: bar
Changed value of $foo: foo
Final value of $foo: foo

在这种情况下,我删除了my。现在当我说$foo = "foo";时,我正在使用我在块外定义的$foo,所以一旦我离开块,$foo仍将具有旧值。