试图理解这个s / \ r?\ n $ // perl正则表达式

时间:2014-10-16 00:15:44

标签: regex perl

所有perl大师!我有以下代码片段,并且有一个我想要了解的特定行。一直在阅读并设法理解它是一个perl正则表达式。但是,我无法理解每个人的目标。如果我错了,我会纠正我。

这个特殊部分用于从HEX文件中读取EDID内容。我相信以前的家伙试图做的是取出任何空间和下一行。但不完全确定。

for (my $int=1;$int<9;$int++){
my $line = <$info>;
$line =~ s/\r?\n$//;
chomp $line;
$line =~ s/\s+//g;
if ( $line eq "00000000000000000000000000000000" ){ 
    print "bad EDID information in file $file --- all 0's\r\n";
    close $info;
    close $OUTFILE;
    exit 1;
}


print $OUTFILE $line
}

现在,这部分是让我失望的部分。

$line =~ s/\r?\n$//;

我想要了解的是......什么是s / \ r? \ n $ //正在做。我相信\ n是下一行。但不确定其他的。任何评论或帮助都是受欢迎的。

3 个答案:

答案 0 :(得分:2)

如果您还不知道,s///是替换运算符。

模式匹配可选的回车符,后跟换行符序列和字符串的结尾。

\r?  # '\r' (carriage return) (optional)
\n   # '\n' (newline)
 $   # before an optional \n, and the end of the string

答案 1 :(得分:2)

hwnd's answer事实上是正确的,它没有解释为什么这个正则表达式。

Windows and Unix (including OS X) use different ways to express the end of a line。正则表达式删除这两种类型,确保无论哪种类型的机器生成文件或哪种类型的文件正在读取它都能正常工作。

Windows和许多Internet协议使用回车符(ASCII 015)和换行符(ASCII 012);这来自when computer displays were electric typewriters and had to be told to move the print head (the carriage) back to the first column (carriage return) and then advance a line (line feed)。 Unix只使用换行符(ASCII 012)。正则表达式中的回车符是\r\015。换行(又名换行)为\n\012

$是多余的,换行符将在行的末尾,并且可能应该删除。

chomp的调用是多余的。 chomp会删除当前操作系统的类型换行符。在Unix上,它将删除\n,在Windows上它将删除\r\n(它实际上将删除$/的值)。但是,如果您在Unix计算机上使用Windows文件,反之亦然,则它将无法适应文件类型。正则表达式更安全。

$line =~ s/\s+//g; /g使其尽可能多地匹配,删除行中任何位置的所有空格。由于回车符和换行符是空格,因此chomps/\r?\n$//都是多余的。

所有三行都可以缩减为$line =~ s{\s+}{}g

答案 2 :(得分:2)

您的前任编写了相当于chomp的内容,该内容适用于Windows和Linux文本文件。前者有CR LF行结尾"\r\n",后者只有LF "\n"

一个更好的方法来写这个,假设你对尾随制表符或空格不感兴趣,那就是s/\s+$//,因为CR和LF都是&#34;空格&#34;。

更好的是,如果你可以保证你在Perl 5的10或更高版本上运行(将use 5.010放在程序的顶部),那就是s/\s+\z//

或者,如果你想保留尾随空格但删除行终止符,s/[\r\n]+\z//会为你做这个,并且还会处理老式的Mac文本文件,它们只有CR端。