【问题标题】:BEGIN and END in PerlPerl 中的开始和结束
【发布时间】:2019-09-17 22:04:50
【问题描述】:

我正在尝试从BEGIN 块中的文本文件中获取一些特定模式的数据,并将它们打印到END 块中,如下所示:

perl -0777wnE'
BEGIN{
    while(/<mark>(.*?)<\/mark>/g){
        $hw=$1; 
        $seen{$hw}++;
    }
} 
END{
    for $key (keys %seen){
        say "$key";
    }
}
' "demo.txt" > "demo2.txt"

但它不会在 demo2.txt 文件中打印任何内容,并且会给出以下警告:

在 -e 第 3 行的模式匹配 (m//) 中使用未初始化的值 $_。

但是,如果我将 while 块放在 BEGIN 块之外,如下所示:

perl -0777wnE'
while(/<mark>(.*?)<\/mark>/g){
    $hw=$1; 
    $seen{$hw}++;
}
END{
    for $key (keys %seen){
        say "$key";
    }
}
' "demo.txt" > "demo2.txt"

然后得到预期的结果。

【问题讨论】:

  • 摆脱 n 开关以供初学者使用

标签: regex perl


【解决方案1】:

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

perl -nE 'BEGIN { say $ARGV }'

【讨论】:

  • 谢谢@choroba 我想知道是否需要先从整个文档中准备好一些数据,然后再进行任何实际数据处理,例如替换等。
  • @jonah_w:那么不要使用-n,而是根据需要手动迭代文件。
  • 我尝试将while(/&lt;mark&gt;(.*?)&lt;\/mark&gt;/g) 放在END 块中,它给出了相同的警告。只有这一次 $ARGV 在END 中时才有值。
  • 是的,但是当 -n-p 存在时,ARGV 位于 END 块中的 EOF。
猜你喜欢
  • 2021-04-14
  • 2022-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多