请让我首先说明这个问题与perl钻石操作员接受直接键入键盘的输入有关.
如果我谈到perl钻石操作员接受输入已经被管道传输或来自文件中的文本,那么是的,这将是问题519309的重复 - 如何使用钻石操作员阅读Utf-8.
但是,这不是关于管道或文件数据,而是关于直接键入键盘的输入.因此,我认为,这个问题不是519309的重复.
以下是我的问题的详细信息:
我正在尝试在键盘上使用变音字符('ä','ö','ü',...).
我有一个非常简单的perl脚本,它接受来自键盘的一行,然后立即将其再次输出到屏幕:
如果我在代码页1252上使用变音字符,那么一切都按预期工作:
C:\>chcp 1252 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;"
Page de codes active : 1252
*** ü
--- ü
Run Code Online (Sandbox Code Playgroud)
但是,如果我在代码页65001(UTF-8)中使用相同的变音字符,那么我会收到未初始化的警告值,并且不接受变音符号:
C:\>chcp 65001 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;"
Page de codes active : 65001
*** ü
Use of uninitialized value $txt in print at -e line 1.
---
Run Code Online (Sandbox Code Playgroud)
如果我将变音符号输入我的perl程序,那么我没有问题:
C:\>chcp 65001 & echo ü | perl -CS …Run Code Online (Sandbox Code Playgroud) 这是我目前使用Perl 6运行的程序(Windows 7 x64下的Rakudo Star 2017.10,代码页chcp 65001)
use v6;
say chr(300) x 3, chr(301), 'UVW';
Run Code Online (Sandbox Code Playgroud)
我希望只有一行输出:
????UVW
Run Code Online (Sandbox Code Playgroud)
但我得到一个神秘的第二行输出('VW'):
????UVW
VW
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,当我将输出重定向到文件时,问题就消失了)
所以我的问题如下,如何让Perl 6输出一行? - (不幸的是,将输出重定向到文件不是我的选择)
附加信息:正如旧的Stackoverflow问题http://stackoverflow.com/questions/25585248中所见, 我对Perl 5的问题完全相同.Perl 5中的解决方案是注入一个命令
binmode(STDOUT, ':unix:encoding(utf8):crlf');
Run Code Online (Sandbox Code Playgroud)
所以我现在的问题如下:
什么是Perl 6等效的Perl 5命令binmode(STDOUT,':unix:encoding(utf8):crlf')?
在此先感谢您的帮助.
我的问题是:如何在Perl程序中轻松访问模式匹配的数组?(我知道有解决方案涉及split或/.../g,但我特别要求一种简单的方法来访问变量$ 1,$ 2,$ 3,...
(我认为应该有一个数组,类似于@ - 和@ +,但我找不到它)
这是我到目前为止(解决方案A涉及substr($ line,$ - [$ ],$ + [$ ] - $ - [$ ]),解决方案B涉及eval"\ $$ "),但我' d而是直接将变量$ 1,$ 2,$ 3作为数组访问:
use strict;
use warnings;
my $line = (join '', map { chr($_ + 64) } 1..26) x 10;
my $rstr = '';
$rstr .= '('.('.' x (rand(3) + 2)).')' for 1..rand(15) + 3;
unless ($line =~ m{\A $rstr}xms) {
die "No match";
}
print $rstr, "\n";
for (1..$#-) {
printf "A> %3d. -> …Run Code Online (Sandbox Code Playgroud)