Perl6:使用正则表达式捕获字符串中的Windows换行符

您所在的位置:网站首页 perl可以做什么 Perl6:使用正则表达式捕获字符串中的Windows换行符

Perl6:使用正则表达式捕获字符串中的Windows换行符

2023-03-14 11:15| 来源: 网络整理| 查看: 265

免责声明:我在PerlMonks上交叉发布了这个帖子.

在Perl5中,我可以快速轻松地打印出\r\nWindows样式行结尾的十六进制表示:

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 ~~ /(**1..2)/ { $0.Str.encode('UTF-8').unpack("H*").say; } }

输出 0a,如:

/(\n)/ /(\v)/

首先,我甚至不知道我正在使用unpack()正确的正则表达式.其次,如何\r\n在P6中捕获换行符的两个元素()?

1> Brad Gilbert..:

Perl 6会自动为您分配线分隔符.这意味着当你尝试进行替换时它不存在.

如果存在组合字符,Perl 6还会创建合成字符.因此,如果您想要输入的基数16表示,请使用编码'latin1'或使用方法$*IN返回Buf.

这个例子只是将CRLF附加到每一行的末尾. (0D 0A即使没有行终止符,最后一行也将始终结束)

perl6 -ne 'BEGIN $*IN.encoding("latin1"); #`( basically ASCII ) $_ ~= "\r\n"; #`( append CRLF ) put .ords>>.fmt("%02X");'

您还可以关闭autochomp行为.

perl6 -ne 'BEGIN { $*IN.encoding("latin1"); $*IN.chomp = False; }; s/\n/\r\n/; put .ords>>.fmt("%02X");'


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3