【发布时间】:2019-01-02 04:31:09
【问题描述】:
免责声明:我已在 PerlMonks 交叉发布此内容。
在 Perl5 中,我可以快速轻松地打印出 \r\n Windows 风格行尾的十六进制表示:
perl -nE '/([\r\n]{1,2})/; print(unpack("H*",$1))' in.txt
0d0a
要在 Unix 上创建一个以 Windows 结尾的文件,如果您想进行测试,请创建一个带有单行和行结尾的 in.txt 文件。然后:perl -ni -e 's/\n/\r\n/g;print' in.txt。 (或在 vi/vim 中,创建文件并执行 :set ff=dos)。
我在 Perl6 中尝试了很多东西来做同样的事情,但无论我做什么都无法让它工作。这是我最近的测试:
use v6;
use experimental :pack;
my $fn = 'in.txt';
my $fh = open $fn, chomp => False; # I've also tried :bin
for $fh.lines -> $line {
if $line ~~ /(<[\r\n]>**1..2)/ {
$0.Str.encode('UTF-8').unpack("H*").say;
}
}
输出0a,同样:
/(\n)/
/(\v)/
首先,我什至不知道我是否正确使用了unpack() 或正则表达式。其次,如何在 P6 中捕获换行符的两个元素(\r\n)?
【问题讨论】:
-
在 Perl5 中,我更喜欢
sprintf("%v02X", $s)。适用于任何字符串,而不仅仅是字节字符串。