2016-08-08 11 views
-2

私はperlの初心者です。また、CSVファイル、JSON文字列、配列、ハッシュを扱っています。逆を参照しているPerl配列

私はこのコードを書いていますが、エラーが出ます。私はforeachループで$header_copyを使いたいです。

1. my @headers=qw/January February March April May June/; 
    2. my $header_copy=\@headers; 
    3. print("$header_copy->[2]"); # Prints "March" Correctly 
    4. print("$header_copy[2]"); #Gives Error. 

エラー:

Global symbol "@header_copy" requires explicit package name at line 4

そして私はループの中の$ header_copyを使用したい:のような:

foreach $i ($header_copy){ **code..** } 
+0

なぜこの行.... my $ header_copy = \ @ headers; – lordkain

+0

これは単なる例で、私はcsvファイルを読み込んで、$ header_copyに似た配列参照形式のcsv行を与えたいと思っていました。 –

+0

破壊するのが安全な真のコピーが必要な場合は、2つの回答のどちらも意図したとおりに動作しません。 – Zaid

答えて

0
# reads data 
my @headers=qw/January February March April May June/; 

# use a foreach loop and store local copy of item nr in $headeritem_copy 
foreach my $headeritem_copy (@headers) { 
    print("$headeritem_copy\n"); 
} 
3

あなたに\@headersを使用して@headers配列の参照を取っています$header_copy。したがって、それにアクセスする前に、逆参照する必要があります。配列リファレンスを反復処理に適し - -

  • 配列リファレンス@ { }を使用してから単一の項目をaccesingに最適

    1. Arrow operator(->)使用:

      はそれのために(それよりも実際にはそれ以上)の2つの方法があります。

    $header_copy[2]は、逆参照なしで配列参照から要素にアクセスしているため、エラーが発生します。インタプリタは、配列に@header_copyという配列がないと仮定しています。プログラムの下

    両方のアプローチを要約したものです。

    #!/usr/bin/perl 
    use strict; 
    use warnings; 
    
    # define @ headers 
    my @headers = qw/January February March April May June/; 
    
    # taken refrence of @headers array into $header_copy 
    my $header_copy = \@headers; 
    
    # dereferencing using arrow(->) operator 
    print $header_copy -> [2],"\n"; 
    
    # derefrencing for iteration using @{...} 
    foreach(@{ $header_copy }) { 
        print $_,"\n"; 
    } 
    
  • +0

    Thanxで違いを知らせます。これは私が欲しかったものです! –

    +0

    @ TheGr8Adakron:これが答えであれば、それを受け入れてください。これを行うには、左の緑色のチェックマークをクリックして、質問に回答済みとマークされ、回答者があなたを助ける信用を得るようにします。 – halfer

    0
    my @headers=qw/January February March April May June/; 
    my $header_copy=\@headers; 
    print("$header_copy->[2]"); # Prints "March" Correctly 
    

    デリファレンス特定のインデックス

    print("@{$header_copy}->[2]"); #Gives Error. 
    
    +0

    あなたの 'print()'ステートメントのいずれかで引用文字を使う必要はありません。 –

    +0

    'print(" $ header_copy [2] "); #Gives Error。 "という質問にユーザーが同じことを言い、ここでコピーして貼り付けた。 – ssr1012

    +0

    私は元の質問にコメントをコピーしました:-)しかし、一般的に、私は答えを与えるときにそのような小さなものをきれいにするのが好きです。 –

    1

    エラーPerlのある 'グローバルシンボルは、 "..." 明示的なパッケージ名が必要です' 「宣言されていない変数を使用しようとしています。宣言されていない変数の名前が表示されます。この場合は@header_copyです。

    コードを見ると、@header_copyという配列の宣言はありません。ああ、$header_copyというスカラー変数があります。配列(配列@headers)への参照が含まれています。しかし、これは@header_copyという配列には接続していません。

    なぜ、Perlはあなたが配列@header_copyを使いたいと思いますか?コードの最後の行では、$header_copy[2]を使用します。つまり、配列の第3要素は@header_copyです。そして、それはエラーを生成します(私が既に指摘したように)あなたはその配列を持っていません。

    前の行では、$header_copy->[2]を使用しています。 ->[...]は、参照がある配列の要素を検索する正しい方法なので、うまくいきます。

    実現する重要なことは、$header_copy->[2]$header_copy[2]という2つの全く異なるものを意味し、2つの全く異なる変数を指します。

    また、参照先の配列に戻る方法(これは「逆参照」と呼ばれます)も尋ねられます。それは簡単です。一般的に、あなたは使用:

    @{ expression that returns an array reference } 
    

    だから、あなたの場合には、それは次のようになります。

    @{ $header_copy } 
    

    しかし、あなたの式がスカラー変数である場合には、そのように、括弧を省略することにより、それを簡素化することができますそれは次のようになります。

    @$header_copy 
    

    だから、あなたが望む:

    foreach my $i (@$header_copy) { 
        ... 
    } 
    
    関連する問題