1

$line の使用で宣言されていない変数エラーが発生する理由を理解するために、これを含む Web サイトのいくつかのスレッドを調べました。@lines 配列の各要素は文字列の配列です。

エラーは $line[$count] ステートメントの 25 行目と 27 行目にあります

use strict;
use warnings;

my @lines;
my @sizes;

# read input from stdin file into 2d array
while(<>)
{
    push(@lines, my @tokens = split(/\s+/, $_));
}

# search through each array for largest sizes in
# corresponding elements
for (my $count = 0; $count <= 5; $count++)
{
    push(@sizes, 0);
    foreach my $line (@lines)
    {   
        if(length($line[$count])>$sizes[$count])
        {
            $sizes[$count] = length($line[$count]);
        }
    }
}

必要に応じて完全なコードを投稿できますが、エラーはここのどこかにあるはずです。

4

1 に答える 1

1

問題はここにあります:

push(@lines, my @tokens = split(/\s+/, $_));

ある配列を別の配列にプッシュすると、すべての要素が最初の配列に追加されます。したがって、非常に長い一次元配列を作成しています。

これを修正するには、ブラケットを使用して配列参照を作成します。

push @lines, [ split(/\s+/, $_) ]; #No need for a temp variable.

また、配列参照にアクセスするには、参照解除する必要があります。これらの構文はどちらもオプションです。

    ${$line}[$count];
    $line->[$count];

2 番目の構文の方が読みやすいと思います。

更新: また、ファイルを調べている間に最長の長さを追跡すると、コードを簡素化できます。

use strict;
use warnings;
use List::Util qw/max/;

my @lines;
my @sizes = (0)x6;
while(<>)
{
    push @lines, [ my @tokens = split ];
    @sizes = map { max ( length($tokens[$_]), $sizes[$_] ) } 0..$#tokens;    
}

注:コアData::Dumperモジュールは、Perl で複雑なデータ構造を扱う場合に非常に重要なツールです。

use Data::Dumper;
print Dumper @lines;

これにより、指定した変数の完全な構造が出力されます。そうすることで、自分が思っていたことが実際に作成されたかどうかを確認できます。

于 2013-03-27T10:55:42.310 に答える