[英]Why is my Perl loop off by one at the end?
我有這個程序不能按預期工作。 幫我。
我想打印一行標題。
如果輸入為4
,我想輸出1|2|3|4
。
它並不是全部工作,如果我硬編碼$count
值它部分工作但最后一個數字丟失。
sub printC {
my $count = @_;
# count = 4 # works partially only prints 1|2|3
for(my $i=1;$i<$count;$i++) {
print "$i|";
}
print $i;
}
$count = 2;
&printC($count);
print "\n";
問題出在這里:
my $count = @_;
賦值發生在標量上下文中,它將數組@_
的元素數分配給$count
,大小寫為1
,因為您將1
參數傳遞給函數。
要解決此問題,您可以:
my ($count) = @_;
要么
my $count = $_[0];
這是另一個問題:
for(my $i=1.....
^^
通過使用my
,你做了$i
局部的身體for
,它會無法使用外面 。 因此,你在for
之外的最終print
不會印刷任何東西。 要解決此問題,請在循環外部聲明$i
:
sub printC {
my ($count) = @_;
my $i;
....
總是要寫點
use strict;
在您的程序的頂部,使您能夠捕獲此類錯誤。
執行函數功能的perl方法是:
print join('|',1..$count);
一個真正的Perl黑客可能會寫這樣的東西:
sub printC {
my $count = shift;
print join "|", (1 .. $count);
}
一旦你理解了它是如何工作的,你會發現你已經學到了更多關於Perl的知識。 :-)
一旦你離開for
循環, $i
就不存在了for
因為它聲明了它的位置。
你可以做到
sub printC {
my ($count) = @_;
my $i;
for ($i = 1; $i < $count; $i++) {
print "$i|";
}
print $i;
}
更簡單:
sub printC {
my ($count) = @_;
print join("|", 1 .. $count) . "\n";
}
“更多Perlish”的另一點是不使用C風格for
循環。 有幾乎從來沒有需要使用C風格for
Perl編寫的。
代替
for(my $i=1;$i<$count;$i++) { ... }
使用
for my $i (1 .. $count) { ... }
它們幾乎是等價的,除了后一版本更容易閱讀並且更能抵抗一個一個錯誤。 (原因你的代碼只打印1|2|3
代替1|2|3|4
是因為在你的C風格測試for
在檢查$i<$count
時,它應該是$i<=$count
- for (list)
完全避免使用C風格for
循環,這是一個非常常見的錯誤。)
另外,不要使用&
子調用的前綴。 這是Perl 4的延續,Perl 5中不再需要它,並且有可能你不知道並且可能不想要的副作用。 只需使用printC($count)
代替&printC($count)
。
但是,是的,在這種特殊情況下, join
可能比一個更好的方法for
,無論如何。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.