Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在perl中匹配行尾$;用chomp显示不同行为的打印_Regex_Perl - Fatal编程技术网

Regex 在perl中匹配行尾$;用chomp显示不同行为的打印

Regex 在perl中匹配行尾$;用chomp显示不同行为的打印,regex,perl,Regex,Perl,我正在读取一个文件,并为行匹配一个正则表达式,行的开头是一个十六进制数,后面是几个点分隔的十六进制值,后面是可选的数组名,可能包含一个选项索引。例如: 010c10 00000000.00000000.0000a000.02300000 myFooArray[0] 以下输入端子上的输出将吃掉第一个字符: 010000 00000000 foo 如果我删除了chomp,它会正确地打印Hey而不仅仅是ey 任何线索,谢谢 当匹配条件中存在最后一个$时,通过完全相同的脚本生成的其他文件(即没有额外的空

我正在读取一个文件,并为行匹配一个正则表达式,行的开头是一个十六进制数,后面是几个点分隔的十六进制值,后面是可选的数组名,可能包含一个选项索引。例如:

010c10 00000000.00000000.0000a000.02300000 myFooArray[0]

以下输入端子上的输出将吃掉第一个字符:

010000 00000000 foo

如果我删除了chomp,它会正确地打印Hey而不仅仅是ey

任何线索,谢谢

当匹配条件中存在最后一个$时,通过完全相同的脚本生成的其他文件(即没有额外的空格、格式等)不匹配

尽管您否认了这一点,但我确信您的文件在行尾之前包含一个空格字符。您应该使用来检查以显示每个文件记录的真实内容。像这样

use Data::Dump;
dd \$read_line;
这可能是最好的使用

$read_line =~ s/\s+\z//;
代替咀嚼。这将删除每行末尾的所有空格和制表符以及行尾,如回车符和换行符

如果我删除了chomp,它会正确地打印Hey而不仅仅是ey

看起来您正在Linux机器上工作,处理在Windows平台上生成的文件。Windows使用两个字符CR LF作为记录分隔符,而Linux只使用LF,因此chomp只删除尾随的LF,留下CR使字符串的开头被覆盖


如果不是因为尾随空格的第二个问题,t这里最好的解决方案是将chomp$read\u line替换为$read\u line=~s/\R\z//。与换行序列的Unicode思想相匹配,并在Perl5的版本10中引入。但是,前面提到的s/\s+\z//也将处理您的行尾,这应该是您所需要的。

Borodin是对的,\r\n是罪魁祸首

我使用了一个不那么优雅的解决方案,但它是有效的:

$rdLine =~ s/\r//g;
其次是:

chomp $rdLine;

您的$/设置为什么?尝试将输出管道连接到od-bc,您可能会找到原因\rchomp是不可移植的,因此如果您从不同的平台读取不同格式的文件,它们可能会使用不同的行尾。使用正则表达式来清理数据,比如$rdLine=~s{[\f\n\r]*$}{};。它清除传统的Mac、Windows和*nix/OSX行结尾。十六进制字符是[0-9A-Fa-f],而不是[0-9A-z]。您也可以使用just\p{hex}@jm666-感谢您建议尝试od-bc,原因是\r。感谢您的解释。这是一个DOS文件,它在最后使用了CR-LF,这就是你提到的罪魁祸首。这也导致打印中的前导H被删除,因为CR会将其带到行的开头并覆盖H。您提到的替换项修复了该问题。还感谢您提供的十六进制检测提示。
$read_line =~ s/\s+\z//;
$rdLine =~ s/\r//g;
chomp $rdLine;