Как напечатать класс символов Perl?
Сегодня утром я проверял код и наткнулся на код, который был неправильным, но я не мог понять, почему.
$line =~ /^[1-C]/;
Эта строка должна была вычисляться до шестнадцатеричного символа между 1
а также C
, но я предполагаю, что эта строка не делает этого. Вопрос не в том, что соответствует, а в том, что это соответствует? Могу ли я распечатать все символы в классе символов? Что-то вроде ниже?
say join(', ', [1-C]);
Увы,
# 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
3 ответа
Он соответствует каждой кодовой точке от U+0030 ("1") до U+0043 ("C").
Простой ответ заключается в использовании
map chr, ord("1")..ord("C")
вместо
"1".."C"
как вы можете видеть в следующей демонстрации:
$ 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
Если у вас установлен Unicode:: Tussle, вы можете получить тот же вывод из следующей команды оболочки:
unichars -au '[1-C]'
Вы можете быть заинтересованы в том, чтобы тратить время на просмотр таблиц кодов Unicode. (Этот конкретный диапазон охватывается "Базовая латиница (ASCII)".)
Это простая программа для проверки диапазона этого регулярного выражения:
use strict;
use warnings;
use Test::More qw(no_plan);
for(my $i=ord('1'); $i<=ord('C'); $i++ ) {
my $char = chr($i);
ok $char =~ /^[1-C]/, "match: $char";
}
Сгенерируйте этот результат:
ok 1 - match: 1
ok 2 - match: 2
ok 3 - match: 3
ok 4 - match: 4
ok 5 - match: 5
ok 6 - match: 6
ok 7 - match: 7
ok 8 - match: 8
ok 9 - match: 9
ok 10 - match: :
ok 11 - match: ;
ok 12 - match: <
ok 13 - match: =
ok 14 - match: >
ok 15 - match: ?
ok 16 - match: @
ok 17 - match: A
ok 18 - match: B
ok 19 - match: C
1..19
[1-9A-C] соответствует шестнадцатеричному числу от 1 до C
[a char
-an another char
] сопоставить все символы между двумя символами в таблице Unicode