2011-08-03 23 views
1

循環我寫這個循環,其中在初始化我使用的是可變intializing,而不是一個絕對的value.Why不確實的價值變化?還是不允許在for循環中?在Perl

enter code here 
for($i = $one, $i > $top_level,$i--) 
    { 
     print $i,"\n"; 
     print "One is:",$one,"\n"; 
    } 

爲什麼我不能指定$ i = $ one。 變量$ 1保持不斷變化,這就是爲什麼我聲明$ i爲$ one的原因。當我打印變量的各個值時,這些值是正確的,只是在for循環中該值沒有被賦值。

+2

我不明白你在這裏得到什麼。如果你告訴我們'$ one','$ top_level'和你想要的輸出是什麼,那麼它可能會有所幫助,以及「值」意味着什麼? – Quentin

回答

1

你到底想要做什麼?這是一個正常的'for'循環還是你想做一些異國情調。請注意使用分號,而不是逗號。在任何循環中使用逗號都會完全不同:每次運行每一位代碼。

通常情況下這將是:

​​

這是Perl的吧?

+0

是的,我意識到我的錯誤。謝謝... – kunal

3

的爲()語句內的分離器是 「;」,而不是 「」。

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"; 
} 
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標:在運行環路輸出

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 
    } 

然後:

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; 
} 

而這個初始化在主線

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] 

請注意,只有一個TI我在第35行,我們在循環開始後訪問$i

+0

非常感謝....這是非常翔實的。 – kunal