我不能完全确定要标题的是什么,但这是问题所在。我的目标是创建一个名为drawPyramids的子例程,它将从*中绘制一个金字塔,其行数取决于命令行参数。对于每一行,*的数量增加2,所以它变为1-3-5-7,依此类推。这就是我到目前为止所拥有的:
sub drawRow {
my $space = $_[0];
my $star = $_[1];
for ($i=0;$i<$space;$i++) {
print " ";
}
for ($i=0;$i<$star;$i++) {
print "*";
}
}
sub drawPyramid {
my $rows = $_[0];
my $x = 1;
for ($i=1;$i<=$rows;$i++) {
drawRow($rows-$i,$x);
print "\n";
$x+=2;
}
}
if(@ARGV == 0) { #check if user entered parameter by checking size of array
die "ERROR: Please supply command-line parameter\n";
}
foreach $a(@ARGV) { #check if number is negative
if ($a < 0) {
print "ERROR: Number must be non-negative\n";
}
}
$sp = @ARGV[0];
$st = @ARGV[1];
drawPyramid($sp);
假设我在我的CMD中将其作为perl pyramid.pl 5运行。预期结果是:
*
***
*****
*******
*********
在第一行的第一颗星之前有4个空格,3个空格......依此类推。但是,这就是我得到的:
*
***
*****
第五行有5颗星应该在星星开始前有2个空格,程序甚至不打印最后两行(有7和9星)。
该计划有什么问题?任何帮助表示赞赏。
答案 0 :(得分:2)
问题是两个子程序都在读取和修改相同的全局变量$i
(也称为$::i
或$main::i
),因此它们会相互干扰。
要解决此问题,您应该使用用my
声明的局部变量;也就是说,改变这个:
for ($i = 1; $i <= ...; $i++) {
到此:
for (my $i = 1; $i <= ...; $i++) {
整个