在串联中使用未初始化的值<。>或字符串在xyz.pl第27行

时间:2015-02-11 08:22:28

标签: arrays perl

我正在编写这个perl程序,并希望根据for循环的值创建一个应该存储在输出文件中的数组。我是这个节目的新手。 这是我的代码

use strict;
use warnings;

open( my $out_fh, ">", "output.txt" ) || die("Cannot open file.\n");
my ( $x, $y, $i, $j, $k, $p, $q );
my ( @Xrow, @b, @b_l, @w );

print("Enter the number of rows:\n");
$p = <STDIN>;
chop($p);

print("Enter the number of columns:\n");
$q = <STDIN>;
chop($q);

$x    = 2**$p;
$y    = 2**$q;
@Xrow = ( @b, @b_l, @w );

for ( $i = 0; $i < $x * $y; $i = $i + 1 ) {
    for ( $j = 0; $j < $x; $j = $j + 1 ) {
        for ( $k = 0; $k < $y; $k = $k + 1 ) {

            $Xrow[$i] = "$b[$j],$b_l[$j],$w[$k]";
            foreach (@Xrow) {
                print $out_fh "$_\n";
            }
        }
    }
}

因此输出应该类似于例如p = q = 1

Xrow0 b0 b_l0 w0
Xrow1 b1 b_l1 w0
Xrow2 b0 b_l0 w1
Xrow3 b1 b_l1 w1

所以它应该在没有任何大括号和“=”

的输出文件中打印出来

但是我收到这样的错误

Use of uninitialized value in concatenation<.> or string at xyz.pl in line 27
Use of uninitialized value within @b in concatenation<.> or string at xyz.pl in line 27

1 个答案:

答案 0 :(得分:2)

您不会在任何地方填充数组,因此它们会保持空白。

但实际上,您不需要数组来获得所需的输出。

其他建议:

  • 首选chompchop

  • 在需要时声明变量,而不是在程序/子程序的顶部。

我是怎么做到的:

#!/usr/bin/perl
use warnings;
use strict;

open my $OUT, '>', 'output.txt' or die "Cannot open file.\n";

print "Enter the number of rows:\n";
my $p = <STDIN>;
chomp $p;

print "Enter the number of columns:\n";
my $q = <STDIN>;
chomp $q;

my $x = 2 ** $p;
my $y = 2 ** $q;

my $i = 0;
for (my $j = 0; $j < $x; $j = $j + 1) {
    for (my $k = 0; $k < $y; $k = $k + 1) {
        print {$OUT} "Xrow$i b$k b_l$k w$j\n";
        ++$i;
    }
}