在perl中循环

时间:2011-08-03 14:54:36

标签: perl

我正在编写这个循环,在初始化中我使用变量初始化而不是绝对值。为什么值不会改变?或者在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循环中没有赋值。

4 个答案:

答案 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对吗?