我正在尝试从文本文件中的BEGIN块中获取某些特定模式的数据,并将其打印在END块中,如下所示:
perl -0777wnE'
BEGIN{
while(/<mark>(.*?)<\/mark>/g){
$hw=$1;
$seen{$hw}++;
}
}
END{
for $key (keys %seen){
say "$key";
}
}
' "demo.txt" > "demo2.txt"
Run Code Online (Sandbox Code Playgroud)
但是它不会将任何内容打印到demo2.txt文件中,并且会发出以下警告:
在-e第3行的模式匹配(m //)中使用未初始化的值$ _。
但是,如果我将while块放在block之外BEGIN,像这样:
perl -0777wnE'
while(/<mark>(.*?)<\/mark>/g){
$hw=$1;
$seen{$hw}++;
}
END{
for $key (keys %seen){
say "$key";
}
}
' "demo.txt" > "demo2.txt"
Run Code Online (Sandbox Code Playgroud)
然后得到预期的结果。
当BEGIN块运行时(即,在编译源代码时),文件句柄尚未打开。您可以使用
perl -nE 'BEGIN { say $ARGV }'
Run Code Online (Sandbox Code Playgroud)