我已经和Perl玩了一段时间来测试掌握正则表达式中的示例 Jeffrey E.F.Friedl (第三版)。对于Perl的评论,我偶然发现了一个非常奇怪的行为。下面给出了作者用于" HTMLizing"文件中的文字。
undef $/; # Enter file slurp mode.
$text=<>; # Slurp up the first file given on the command line.
# Make characters safe.
$text =~ s{&}{&}g;
$text =~ s{<}{<}g;
$text =~ s{>}{>}g;
# Add paragraph tags.
$text =~ s{^\s*$}{<p>}mg;
# Turn email addresses into links.
$text =~ s {
\b
(\w[-.\w]*
\@
[-a-z0-9]+(\.[-a-z0-9]+)*\.(com|edu|info)
)
\b
}{<a href="mailto:$1">$1</a>}gix;
print $text;
当我尝试使用perl htmlizer.pl input.txt
运行此程序时,我收到以下错误。
Backslash found where operator expected at htmlizer.pl line 17, near ")
\"
(Missing operator before \?)
syntax error at htmlizer.pl line 13, near "w["
Unmatched right curly bracket at htmlizer.pl line 18, at end of line
Search pattern not terminated at htmlizer.pl line 18.
在这里,它变得非常奇怪。如果我删除# Turn email addresses into links.
评论,程序执行正常!我很惊讶为什么添加评论会影响程序的执行。
任何线索?我使用的是Perl v5.14.2
答案 0 :(得分:3)
如果我在评论后删除了换行符,那么我会收到这个确切错误(因此$text =~ s {
被注释掉了。)
不知何故,无论你在评论之后看到什么作为换行符都没有被perl视为这样。你在用什么编辑器?如有必要,请使用以下命令转储您的程序:
perl -wne'use Data::Dumper; $Data::Dumper::Useqq=$Data::Dumper::Terse=1; print Dumper $_' htmlizer.pl
并查看该行末尾的内容。
答案 1 :(得分:0)
原来,当我添加注释并点击Return键时,CR控制字符被添加,但不是LF字符。这让Perl翻译感到困惑。添加LF字符使程序执行正常。