[英]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.