我有这个程序没有按预期工作。帮助我。
我想打印一行标题。
如果输入为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";
答案 0 :(得分:11)
问题在于:
my $count = @_;
分配发生在标量上下文中,它将数组@_
中的元素数量分配给$count
,您的情况为1
,就像您一样正在将1
参数传递给函数。
要解决此问题,您可以执行以下操作:
my ($count) = @_;
或
my $count = $_[0];
这是另一个问题:
for(my $i=1.....
^^
使用my
您已将$i
本地发送到for
的正文,并且 >它。因此,print
之外的最终for
不会打印任何内容。要解决此问题,请在循环外部声明$i
:
sub printC {
my ($count) = @_;
my $i;
....
始终要写点
use strict;
位于程序的顶部,可以捕获这些错误。
执行你的功能所做的 perl方式:
print join('|',1..$count);
答案 1 :(得分:5)
真正的Perl黑客可能会写这样的东西:
sub printC {
my $count = shift;
print join "|", (1 .. $count);
}
一旦你理解了它是如何工作的,你会发现你已经学到了更多关于Perl的知识。 : - )
答案 2 :(得分:1)
$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";
}
答案 3 :(得分:0)
“更多Perlish”的另一点是不使用C风格的for
循环。几乎从不需要在Perl中使用C风格的for
。
而不是
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
- 这是一个非常常见的错误,C风格的for
循环for (list)
完全避免。)
另外,请勿使用&
为您的子通话添加前缀。这是Perl 4的延续,Perl 5中不再需要它,并且有可能你不知道并且可能不想要的副作用。只需使用printC($count)
代替&printC($count)
。
但是,是的,在这种特殊情况下,无论如何join
可能比for
更好。