-1


 foreach (@v) { s/^\s+//; s/\s+$// }
        push @{$data[$x]}, @v;
      }
エラーが発生します:グローバル変数@dataには明示的なパッケージ名が必要です–「my」を追加する方法がわかりません。

しかし、私もこのコード行を理解していません、

  • v要素をdata[x]にプッシュしています。しかし、@はどのように機能しますか。{}がハッシュに使用されていることを理解しています。
4

2 に答える 2

4

my字句スコープの変数を宣言します。が新しい場合を除いて、名前が付けられている新しい変数がないように見えるため、ここでは適切ではないようです。@data新しい場合は、my移動する必要があります。

push @{(my @data)[$x]}, @v;

これは、語彙スコープが@dataすぐに消えるので、ほとんど役に立たないか、より明確かつ有用になります。

my @data;
push @{$data[$x]}, @v;

ここ@dataで、は少し広い範囲にあります。


perlreftut説明します@{...}。なしmyで、

push @{$data[$x]}, @v;

$x配列のth要素を取得し、@dataそれを配列参照として扱い、それに追加@vすることを意味します。

例えば、

my @data = (
    [],          # 0
    ['a'],       # 1
    ['b'],       # 2
    ['c', 'd'],  # 3
);
my $x = 2;
my @v = ('e', 'f');

push @{$data[$x]}, @v;
# @data = (
#     [],               # 0
#     ['a'],            # 1
#     ['b', 'e', 'f'],  # 2
#     ['c', 'd'],       # 3
# );
于 2012-08-27T04:12:17.030 に答える
1

@dataあなたはそれに押し込んでいるのと同時に定義しようとしていますか?myこれ以上の情報がなければ、それが何のためにあるのかは不明です。

ラッパーは、@{}「中括弧内のものはarrayrefなので、今は実際の配列として扱います」と述べています。pushコマンドは、配列のすべての要素を@v配列の$x'番目の要素にコピー@dataする必要があります。これは配列参照である必要があります。

于 2012-08-27T04:05:11.300 に答える