试图理解Perl split()输出

时间:2011-05-24 15:40:52

标签: perl

我有几行文本,我正在尝试使用Perl的split函数转换为数组。问题是我在输出中得到了一些不寻常的额外字符,特别是下面的字符串“\ cM”(没有引号)。此字符串出现在原始文本中有换行符的位置;但是,(我相信)在我试图拆分的文本中删除了那些换行符。有人知道这种现象发生了什么吗?我在下面发布了一个例子。感谢。

这是我试图拆分的原始纯文本。我正在从文件中加载它,以防万一:

10b2obo12b2o2b$6b3obob3o8bob3o2b$2bobo10bo3b2obo4bo2b$2o4b2o5bo3b4obo
3b2o2b$2bob2o2bo4b3obo5b4obob$8bo4bo13b3o$2bob2o2bo4b3obo5b4obob$2o4b
2o5bo3b4obo3b2o2b$2bobo10bo3b2obo4bo2b$6b3obob3o8bob3o2b$10b2obo12b2o!

这是我应该进行拆分的Perl代码:

while(<$FH>) {
    chomp;
    $string .= $_;
    last if m/!$/;
}

@rows = split(qr/\$/, $string);
print;          # a dummy line to provide a breakpoint for the debugger

这是调试器到达“print”行时输出的内容。我试图处理的问题出现在第3,7和10行:

DB<10> p $string
2o5bo3b4obo3b2o2b$2bobo10bo3b2obo4bo2b$6b3obob3o8bob3o2b$10b2obo12b2o!
DB<11> x @rows
0  '10b2obo12b2o2b'
1  '6b3obob3o8bob3o2b'
2  '2bobo10bo3b2obo4bo2b'
3  "2o4b2o5bo3b4obo\cM3b2o2b"
4  '2bob2o2bo4b3obo5b4obob'
5  '8bo4bo13b3o'
6  '2bob2o2bo4b3obo5b4obob'
7  "2o4b\cM2o5bo3b4obo3b2o2b"
8  '2bobo10bo3b2obo4bo2b'
9  '6b3obob3o8bob3o2b'
10  "10b2obo12b2o!\cM"

3 个答案:

答案 0 :(得分:3)

调试器可能使用\cM来表示Ctrl-M,它也称为回车符(有时候是\r^M)。 Windows中的文本文件使用CR-LF(回车,换行)对来表示行的结尾。如果您在Unix系统上读取这样的文件,您的chomp将剥离Unix EOL(单行换行)但保留CR原样,最终您的文件中会出现迷路CR。

对于像你这样的文件,你可以删除所有尾随空格而不是使用chomp

while(defined(my $line = <$FH>)) {
    $line    =~ s/\s+$//;
    $string .= $line;
    last if($line =~ /!$/);
}

答案 1 :(得分:3)

您知道,更改文件输入分隔符会使此代码更简单。

$/ = '$';

my @rows = <$FH>;
chomp @rows;

print "@rows";

答案 2 :(得分:2)

您没有说明您使用的操作系统。 查看binmode及其对\ cM的说法,以及它们的位置与输入文件的行结尾一致:

http://perldoc.perl.org/functions/binmode.html