具有正则表达式和注释的Perl程序表现出奇怪的行为

时间:2014-03-02 03:08:09

标签: regex perl

我已经和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{&}{&amp;}g;
$text =~ s{<}{&lt;}g;
$text =~ s{>}{&gt;}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

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字符使程序执行正常。

enter image description here