Есть ли аккуратный способ инвертировать встроенное сопоставление с образцом в регулярном выражении в Perl? - PullRequest
1 голос
/ 30 марта 2011

Все, у меня есть следующий код:

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, либо для непосредственного использования в регулярном выражении.

Другим подходом было бы определение класса персонажа, но я не знаю, как это сделать, и не могу найти ни одного простого лайнера, чтобы сделать это (я думаю, это должен быть простой лайнер, чтобы оправдать она)

1 Ответ

7 голосов
/ 30 марта 2011

Если $CTRL_CHARS гарантированно является классом char, тогда вы можете использовать

(?! $CTRL_CHARS . )

Но почему бы просто не определить

Readonly my $CTRL_CHARS => '|!?*';

[$CTRL_CHARS]
[^$CTRL_CHARS]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...