5

今朝、コード レビューを行っていて、間違ったコードを見つけましたが、その理由はわかりませんでした。

$line =~ /^[1-C]/;

1この行はとの間の 16 進文字に評価されると想定されていました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
4

3 に答える 3

16

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 コード表を参照して時間を無駄にすることに興味があるかもしれません。(この特定の範囲は、「Basic Latin (ASCII)」でカバーされています。)

于 2013-04-30T19:26:36.623 に答える
0

[1-9A-C] は、1 から C までの 16 進数に一致するものです。

[ a char- an another char] Unicode テーブル内の 2 つの文字の間のすべての文字に一致します

于 2013-04-30T19:28:27.990 に答える