gpt4 book ai didi

regex - Perl6 : Capturing Windows newline in a string with regex

转载 作者:行者123 更新时间:2023-12-04 04:16:10 24 4
gpt4 key购买 nike

免责声明:我已经将其交叉发布在PerlMonks上。

在Perl5中,我可以快速轻松地打印出Windows风格的\r\n行尾的十六进制表示形式:

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)?

最佳答案

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");'

您还可以关闭自动选择行为。
perl6 -ne 'BEGIN {
$*IN.encoding("latin1");
$*IN.chomp = False;
};
s/\n/\r\n/;
put .ords>>.fmt("%02X");'

关于regex - Perl6 : Capturing Windows newline in a string with regex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37534194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com