我有几行文本,我正在尝试使用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"
答案 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的说法,以及它们的位置与输入文件的行结尾一致: