Все, у меня есть следующий код:
Readonly my $CTRL_CHARS => qr{[|!?*]}xsm;
my ($dbix_object, $alias, $cardinality) = ($object =~ qr{
^ # Start of the line
([^|*?!]*) # Anything that isn't a relationship control character
# i.e. | (indicating an alias)
# * (indicating many_to_many)
# ? (indicating might_have)
# ! (indicating has_one)
\|? # Possible |, indicating an alias follows
([^|!?*]*?) # Possible alias (excludes all the control characters above)
([|!?*]?)$ # Possible control character
}oxsm);
Я бы хотел заменить рвоту пунктуацией в регулярном выражении шаблоном, определенным как $CTRL_CHARS
. Однако, когда я ставлю что-то вроде: [^$CTRL_CHARS]
, Perl жалуется, потому что это расширилось как [^(?msx-i:[|!?*])]
. Понятно, что Perl подгоняет под неправильный диапазон символов x-i
.
Одним из решений будет использование следующего:
Readonly my $CTRL_CHARS => qr{[|!?*]}xsm;
Readonly my $NON_CTRL_CHARS => qr{[^|!?*]}xsm;
Там есть повторение, которое мне не нравится ... но они близко друг к другу, так что, может быть, это не так уж и плохо.
Я хотел бы знать, есть ли простой способ инвертировать значение $CTRL_CHARS
, либо для определения $NON_CTRL_CHARS
, либо для непосредственного использования в регулярном выражении.
Другим подходом было бы определение класса персонажа, но я не знаю, как это сделать, и не могу найти ни одного простого лайнера, чтобы сделать это (я думаю, это должен быть простой лайнер, чтобы оправдать она)