如何在BEGIN块之外正确声明哈希?

Phi*_* A. 2 perl

考虑这个简单的程序.你能解释为什么在取消注释前两行之后输出会有所不同吗?我的哈希发生了什么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 ";
  }
'
Run Code Online (Sandbox Code Playgroud)

输出:

key1 unmatched 
key2 unmatched 
key3 matched
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 5

perl -ln 包装代码,以便你最终得到

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

注意你如何%hash为每一行创建一个新的?如果您想使用use strict;,则使用包变量.

perl -lne'
    use strict; use warnings;
    our %hash;
    BEGIN { $hash{key3} = "value"; }
    ...
'
Run Code Online (Sandbox Code Playgroud)

否则,你必须放弃-n.

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

PS - 正如你可能已经注意到的那样,chomp当使用-l和时都没用-n.