否定/反转字符 class 无法匹配 perl 中的方括号

negated / inverted character class fails to match square bracket in perl

在下面的语法中,在 perldoc 之后, 我希望每个不在拉丁 26 字母表中的字符都被转换为下划线 _.

但是,方括号不被识别为这个字符 class,正如我们看到的:

> printf '%s' 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-za-z]/_/g;'; echo;
dog[__]cat
> perl --version

This is perl 5, version 18, subversion 4 (v5.18.4) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

为了得到我想要的,我必须明确地提到方括号,像这样:

> printf '%s' 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-za-z]/_/g; s/[\[\]]/_/g;'; echo;
dog____cat

negation/inversion的概念看似简单;我错过了什么?

有没有更优雅的说法来实现我想要的,例如不使用两个顺序替换?

字符集 [^A-za-z] 包括 A-z 而不是 A-Z -- 也就是说,它包括大写字母 A 和小写字母 z 之间的所有 ASCII 字符],包括Za之间的标点:

⋮
X
Y
Z
[
\
]
^
_
`
a
b
c
⋮

[^A-za-z] 更改为 [^A-Za-z] 应该可以解决问题。

我的错误是双重的。

  1. hand-written 字符中的粗心错误,如响应者所指出的那样
  2. 我的无知 [:alpha:] posix class(也感谢回复者),虽然看过很多次,就是没学会
~/u/kh/bin> echo 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-Za-z]/_/g;'; echo;
dog____cat_
~/u/kh/bin> echo 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^[:alpha:]]/_/g;'; echo;
dog____cat_
~/u/kh/bin>