【发布时间】:2020-12-26 04:11:08
【问题描述】:
我逐行遍历文件,挑选出以 asterix 开头的行:*。我的简单正则表达式适用于文件的第一行以外的所有行。
DESIRED BEHAVIOR 是:正则表达式应该正确匹配以星号开头的行。
实际行为是:如果星号出现在文件的第一行,则正则表达式无法匹配。
我的调试尝试包括:
-
在文件开头添加空行。结果:以前丢失的行,现在位于文件的第二行,正则表达式正确匹配。
-
从正则表达式中删除
\A,只匹配asterix。正则表达式现在正确匹配文件的第一行。 -
尝试使用
^而不是\A。文件的第一行仍然无法匹配。
重现的最少代码:
while (<$input_fh>) {
chomp;
$line = $_;
if ($line =~ /\A\*/) {
...
}
}
输入文件由可能以或不以星号开头的文本行组成。
【问题讨论】:
-
您的文件中不包含 BOM 吗?
-
因为一个BOM长于一个字节(实际字节数取决于编码)。
-
当您遇到这些问题时,使用Data::Dumper 或Devel::Peek 检查字符串可以说明这些问题。
-
Data::Dumper 和
$Data::Dumper::Useqq = 1;是你想要的。 (Devel::Peek 可以帮助调试 XS 模块。不是这里的问题。) -
您还可以使用核心
B模块中的perlstring函数来查看Perl 认为您的字符串是什么。use B "perlstring"; printf "read line: %s\n", perlstring $line;