如何打印Perl角色类?

Eri*_*sum 5 regex perl character-class

我今天早上在代码审查中遇到了一些错误的代码,但我不明白为什么.

$line =~ /^[1-C]/;
Run Code Online (Sandbox Code Playgroud)

这行被假设为评估为1和之间的十六进制字符C,但我认为这一行不会这样做.问题不在于匹配,但这匹配的是什么?我可以打印出角色类中的所有角色吗?像下面的东西?

say join(', ', [1-C]);
Run Code Online (Sandbox Code Playgroud)

唉,

# Examples:
say join(', ', 1..9);
say join(', ', 'A'..'C');
say join(', ', 1..'C');

# Output
Argument "C" isn't numeric in range (or flop) at X:\developers\PERL\Test.pl line 33.

1, 2, 3, 4, 5, 6, 7, 8, 9
A, B, C
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 16

它匹配从U + 0030("1")到U + 0043("C")的每个代码点.

简单的答案是使用

map chr, ord("1")..ord("C")
Run Code Online (Sandbox Code Playgroud)

代替

"1".."C"
Run Code Online (Sandbox Code Playgroud)

正如您在以下演示中所看到的:

$ perl -Mcharnames=:full -E'
   say sprintf " %s  U+%05X %s", chr($_), $_, charnames::viacode($_)
      for ord("1")..ord("C");
'
 1  U+00031 DIGIT ONE
 2  U+00032 DIGIT TWO
 3  U+00033 DIGIT THREE
 4  U+00034 DIGIT FOUR
 5  U+00035 DIGIT FIVE
 6  U+00036 DIGIT SIX
 7  U+00037 DIGIT SEVEN
 8  U+00038 DIGIT EIGHT
 9  U+00039 DIGIT NINE
 :  U+0003A COLON
 ;  U+0003B SEMICOLON
 <  U+0003C LESS-THAN SIGN
 =  U+0003D EQUALS SIGN
 >  U+0003E GREATER-THAN SIGN
 ?  U+0003F QUESTION MARK
 @  U+00040 COMMERCIAL AT
 A  U+00041 LATIN CAPITAL LETTER A
 B  U+00042 LATIN CAPITAL LETTER B
 C  U+00043 LATIN CAPITAL LETTER C
Run Code Online (Sandbox Code Playgroud)

如果安装了Unicode :: Tussle,则可以从以下shell命令获得相同的输出:

unichars -au '[1-C]'
Run Code Online (Sandbox Code Playgroud)

您可能有兴趣浪费时间浏览Unicode代码图表.(此基本拉丁语(ASCII)包含此特定范围.)