在Perl中开始和结束

jon*_*h_w 1 regex perl

我正在尝试从文本文件中的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)

然后得到预期的结果。

cho*_*oba 5

当BEGIN块运行时(即,在编译源代码时),文件句柄尚未打开。您可以使用

perl -nE 'BEGIN { say $ARGV }'
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是当存在-n或-p时,ARGV在END块中的EOF处。 (2认同)