2

この簡単なプログラムを考えてみましょう。最初の 2 行のコメントを外した後、出力が異なる理由を説明できますか? 私のハッシュで何が起こっていuse strictますか? で動作するようにプログラムを修正する方法はuse strict?

echo -e "key1\nkey2\nkey3" | perl -lne '
  #use strict; use warnings;
  #my %hash;
  BEGIN { 
    $hash{'key3'} = "value";
  }   
  chomp;
  if ($hash{$_}) {
    print "$_ matched";
  } else {
    print "$_ unmatched ";
  }
'

出力:

key1 unmatched 
key2 unmatched 
key3 matched
4

2 に答える 2

5

perl -lnコードをラップして、最終的に

BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (<>) {
    chomp;
    use strict; use warnings;
    my %hash;
    BEGIN { $hash{key3} = "value"; }
    ...
}

%hash行ごとに新しいものを作成する方法に注目してください。を使用する場合use strict;は、パッケージ変数を使用します。

perl -lne'
    use strict; use warnings;
    our %hash;
    BEGIN { $hash{key3} = "value"; }
    ...
'

それ以外の場合は、ドロップする必要があります-n

perl -le'
    use strict; use warnings;
    my %hash = ( key3 => "value" );
    while (<>) {
        chomp;
        ...
    }
'

PS - お気づきかもしれませんが、 と のchomp両方-lを使用する場合は役に立ちません-n

于 2012-10-29T21:53:25.080 に答える
4

スイッチを使用すると、ステートメントを含む-nプログラム全体が暗黙的にwhile (defined($_=<ARGV>)) { ...ブロック内に配置されます。my %hash

perl -MO=Deparse -lne '
  use strict; use warnings; my %hash;
  BEGIN {
    $hash{'key3'} = "value";
  }
  chomp;
  if ($hash{$_}) {
    print "$_ matched";
  } else {
    print "$_ unmatched ";
  }
'

BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    use warnings;
    use strict 'refs';
    my %hash;
    sub BEGIN {
        $hash{'key3'} = 'value';
    }
    &BEGIN;
    chomp $_;
    if ($hash{$_}) {
        print "$_ matched";
    }
    else {
        print "$_ unmatched ";
    }
}
-e syntax OK

つまりmy %hash、ループの各反復で再宣言されます。これをワンライナーとして維持し、煩わしすぎないようにするには、パッケージ変数our %hashを作成することを宣言することを検討してください。%hash

于 2012-10-29T21:51:43.670 に答える