我正在编写这个循环,在初始化中我使用变量初始化而不是绝对值。为什么值不会改变?或者在for循环中是不允许的?
enter code here
for($i = $one, $i > $top_level,$i--)
{
print $i,"\n";
print "One is:",$one,"\n";
}
为什么我不能分配$ i = $ 1。 变量$ one不断变化,这就是我将$ i声明为$ 1的原因。当我打印变量的各个值时,值是正确的,只是在for循环中没有赋值。
答案 0 :(得分:6)
使用分号,而不是逗号。
for($i = $one; $i > $top_level; $i--)
{
print $i,"\n";
print "One is:",$one,"\n";
}
Avoid C-Style loops in perl,如果可能的话。
for my $i (reverse $top_level..$one) {
print $i,"\n";
print "One is:",$one,"\n";
}
答案 1 :(得分:3)
for()语句中的分隔符是“;”,而不是“,”。
答案 2 :(得分:3)
你不小心偶然发现使用逗号而不是分号。观察添加第三个print语句时会发生什么:
print "\$_=[$_]\n";
以$one
为1,我得到:
$_=[0]
...
$_=[]
...
$_=[1]
这是因为列表中有三个项。首先,你想做什么,看起来像这样:
for my $i ( $one..( $top_level - 1 )) {
在此循环中,$i
设置为范围的每个成员,然后执行循环。如果我们不提供变量,perl会将其分配给$_
。
for ( $one..( $top_level - 1 )) {
并且perl不会等待编译列表,所以在它第一次执行之前它会经历所有条款。
$i = $one;
# push actual $i returned by expression $i = $one
push @a, $i;
# result = [ $i=1 ]
# push boolean false => ''
push @a, ( $i > $top_level );
# result = [ $i=1, '' ]
# push the return of $i--, NOT $i
push @a, ( $i );
# result = [ $i=1, '', 1 ]
# decrement $i
$i--;
# result = [ $i=0, '', 1 ]
您可以使用TIE-ed标量找到它:
package Monitored;
sub TIESCALAR {
my ( $class, $name, $value ) = @_;
return bless { name => $name, value => $value }, $class;
}
sub FETCH {
my $self = shift;
Carp::carp "Reading \$$self->{name}...";
return $self->{value};
}
sub STORE {
my $self = shift;
my $value = shift;
Carp::carp "Storing \$$self->{name}=${\(defined( $value ) ? $value : 'undef')} ";
$self->{value} = $value;
}
主线中的初始化:
my $one = 1;
tie my $i, 'Monitored', 'i';
tie my $top_level, 'Monitored', 'top_level', 5;
for($i = $one, $i > $top_level,$i--) # line 30
{
print "*LOOP*\n";
#print "\$i=$i\n"; <-- commented out to reduce noise
#print "\$one=$one\n";
print "\$_=[$_]\n"; # line 35
}
然后在运行循环时输出为:
Storing $i=1 at - line 30
Reading $top_level... at - line 30
Reading $i... at - line 30
Reading $i... at - line 30
Reading $i... at - line 30
Storing $i=0 at - line 30
*LOOP*
Reading $i... at - line 35
$_=[0]
*LOOP*
$_=[]
*LOOP*
$_=[1]
请注意,在第35行,我们只有一次在循环开始后访问$i
。
答案 3 :(得分:1)
你到底想要做什么?这是一个正常的'for'循环还是你想做一些异国情调。注意使用分号,而不是逗号。在任何循环中使用逗号都会完全不同:每次运行每一段代码。
通常情况是:
$one = 1;
for($i = $one; $i > $top_level;$i--)
{
print $i,"\n";
print "One is:",$one,"\n";
}
是Perl对吗?