-2

異なる名前の配列がいくつかあります。以下は私のアレイ名です。

@node_level1_1_1=read_array_level2(@node_level1_1);
@node_level1_2_1=read_array_level2(@node_level1_2);
...
@node_level1_11_1=read_array_level2(@node_level1_11);

@node_level1_1_1 から @node_level1_11_1 までの配列を別のサブルーチン関数で解析したいのですが、このコードを書いてみましたがうまくいきませんでした。

for ($j=1; $j < 12; $j++) {

  my $var= output_data_xml_nodes(4,@node_level1_$j_1);

}

コードを実行すると、次のエラーがスローされます。

./html_parser1.pl 行 153、"@node_level1_$j_1" 付近でスカラーが見つかりました ($j_1 の前に演算子がありませんか?) ./html_parser1.pl 行 153、"@node_level1_$j_1" 付近で構文エラー の実行。 /html_parser1.pl はコンパイル エラーにより中止されました。

配列のインクリメントはありますか。教えてください。

ありがとう、アナンド

4

2 に答える 2

3

もっと複雑なデータ構造を使用する必要があると思います。変数名を作成することは (でno strict 'refs'; @{construct string here}) 可能ですが、それは悪であり、間違っていて、維持できないなどです。そして、それはグローバル変数でのみ動作します *身震い*

コード例は次のようになります。

my @new_node;
$new_node[1][1][1]  = read_array_level2($old_node[1][1]);
$new_node[1][2][1]  = read_array_level2($old_node[1][2]);
...;
$new_node[1][11][1] = read_array_level2($old_node[1][11]);

またはより良い場合は、ループを使用してください

my @new_node;
for my $i (1 .. 12) {
    $new_node[1][$i][1] = read_array_level2($old_node[1][$i])
}

ただし、ほとんどの場合、配列ではなく配列参照を扱うことになります。読んで再読

と友達。

于 2012-12-12T06:45:31.433 に答える
1

1 つの方法は、ハッシュを使用することです。

use strict;
use warnings;

my @array_1 = (1, 11);
my @array_2 = (2, 22);
my %arrays  = ( 
  array_1 => [ @array_1],
  array_2 => [ @array_2]
);

for my $i (1, 2) {
  print join(",", @{$arrays{"array_$i"}}), "\n";
}

もう 1 つの方法は、eval を使用することです。

use strict;
use warnings;

my @array_1 = (1, 11);
my @array_2 = (2, 22);

for my $i (1, 2) {
  my $array_ref = eval('\@'."array_$i");
  print join(",", @$array_ref), "\n";;
}
于 2012-12-12T06:34:14.593 に答える