perl中奇怪的子程序交互,同时从星星中绘制金字塔

时间:2015-11-12 05:27:06

标签: perl

我不能完全确定要标题的是什么,但这是问题所在。我的目标是创建一个名为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星)。

该计划有什么问题?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

问题是两个子程序都在读取和修改相同的全局变量$i(也称为$::i$main::i),因此它们会相互干扰。

要解决此问题,您应该使用用my声明的局部变量;也就是说,改变这个:

for ($i = 1; $i <= ...; $i++) {

到此:

for (my $i = 1; $i <= ...; $i++) {

整个