我有一个循环,通过检查文件数是否为常量来检查目录中的所有文件是否都上传到目录。
开始时,它知道目录中有$ 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'不是同一个变量?
答案 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
仍将具有旧值。