1

我很不确定发生了什么。对于各种长度的@depths,代码通常有效。然而,在整个输出过程中,程序在某些时候会抱怨使用未初始化的值。

错误归咎于第 20 行:print $chars[$depths[$y]];

如果这是显而易见的事情,我会提前道歉,但我肯定错过了这个问题。我已经用谷歌搜索了大约一个小时,但没有运气,所以任何朝着正确方向的轻推将不胜感激!

完整代码:

#! /usr/bin/perl -w

use strict;
use warnings;

#my @chars  = ("0" .. "9");
#my @depths = (0) x 4;
my @chars   = ("0" .. "1");
my @depths  = (0) x 3;

my ($i, $x, $y);

for ($i = 0; $i < @chars ** @depths; $i++) {

    for ($y = 0; $y < @depths; $y++) {

        print $chars[$depths[$y]];
    }
    print"\n";

    $depths[$#depths]++;
    for($x = 0; $x < @depths; $x++) {

        if($depths[$x] == @chars) {

            $depths[$x-1]++;
            while($x < @depths) {

                $depths[$x++] = 0;
            }
        }
    }
}

输出:

000
001
010
011
Use of uninitialized value in print at a.pl line 15.
00
100
101
110
4

2 回答 2

1

我在您的代码中添加了一些打印语句,问题变得很明显。

#! /usr/bin/perl -w

use strict;
use warnings;

my @chars = ("0".."1");
my @depths = (0) x 3;

my $i;
my $x;
my $y;
for ($i = 0; $i < @chars**@depths; $i++)
{
        printf "m = %d\n", scalar(@depths);
        for ($y = 0; $y < @depths; $y++)
        {
            print "y:$y; d[y] = $depths[$y]\n";
            print " :$chars[$depths[$y]]:\n";
        }
        print"\n";

        printf "b[%d] ", $depths[$#depths];
        $depths[$#depths]++;
        printf "a[%d]\n", $depths[$#depths];
        for($x = 0; $x < @depths; $x++){
                if($depths[$x] == @chars){
                        $depths[$x-1]++;
                        while($x < @depths){
                                $depths[$x++] = 0;
                        }
                }
        }
}

输出是:

m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 0
 :0:
y:2; d[y] = 0
 :0:

b[0] a[1]
m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 0
 :0:
y:2; d[y] = 1
 :1:

b[1] a[2]
m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 1
 :1:
y:2; d[y] = 0
 :0:

b[0] a[1]
m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 1
 :1:
y:2; d[y] = 1
 :1:

b[1] a[2]
m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 2
Use of uninitialized value within @chars in concatenation (.) or string at perm.pl line 18.
 ::
y:2; d[y] = 0
 :0:

b[0] a[1]
m = 3
y:0; d[y] = 1
 :1:
y:1; d[y] = 0
 :0:
y:2; d[y] = 0
 :0:

b[0] a[1]
m = 3
y:0; d[y] = 1
 :1:
y:1; d[y] = 0
 :0:
y:2; d[y] = 1
 :1:

b[1] a[2]
m = 3
y:0; d[y] = 1
 :1:
y:1; d[y] = 1
 :1:
y:2; d[y] = 0
 :0:

b[0] a[1]

错误报告之前的行显示$depths[$y]为 2,但数组@chars仅包含索引为 0 和 1 的元素,因此警告是准确的。

于 2012-09-15T04:13:16.960 回答
1

可以将@depths其视为 N 基数(其中 N 是 的数量@chars),并且 的每个元素@depths都是一个数字。你试图在那个数字上加一个,但你失败了。

进位从最低有效位传播到最高有效位,因此您应该是循环而不是处理进位应该从最低有效位循环到最高有效位,但是您以相反的顺序进行操作。随着循环的推进,$x应该开始并减少。$#depth

让我们看一个例子。假设有 10 个符号 ( @chars == 10):

 456999   <- @depth
+     1
-------
 457000

所以你想增加不等于 的最右边的数字$#chars,并将所有等于 的最右边的数字设置为零$#chars。这是我的编码方式:

#!/usr/bin/perl -w

use strict;
use warnings;

my @chars = ("0".."2");
my @depths = (0) x 3;

OUTER: while (1) {
   print @chars[@depths], "\n";

   my $x = $#depths;
   while ($depths[$x] == $#chars) {
      $depths[$x] = 0;
      last OUTER if $x == 0;
      --$x;
   }

   ++$depths[$x];
}
于 2012-09-15T04:13:45.200 回答