小编use*_*349的帖子

通过键盘(代码页65001,UTF-8)不接受变音符号由perl脚本读取

请让我首先说明这个问题与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 batch-file

10
推荐指数
1
解决办法
536
查看次数

什么是Perl 6等效的Perl 5命令binmode(STDOUT,':unix:encoding(utf8):crlf')?

这是我目前使用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')?

在此先感谢您的帮助.

utf-8 perl6

6
推荐指数
0
解决办法
175
查看次数

在Perl程序中轻松访问模式匹配的捕获数组

我的问题是:如何在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)

regex arrays perl

1
推荐指数
1
解决办法
77
查看次数

标签 统计

perl ×2

arrays ×1

batch-file ×1

perl6 ×1

regex ×1

utf-8 ×1