Mam ciągJak przechwytywać grupy dopasowań na przemian wyrażenia regularnego z podziałem?
my $foo = 'one#two#three!four#five#six';
z którego chcesz wyodrębnić części, które są rozdzielone albo przez #
lub !
. Jest to dość łatwe z split
:
my @parts = split /#|!/, $foo;
Dodatkowym wymogiem jest to, że również trzeba uchwycić wykrzykników. Dlatego starałem
my @parts = split /#|(!)/, $foo;
jednak ta zwraca albo wartość undef
lub wykrzyknik (który jest również jasno określone w specyfikacji Split).
Więc pozbyć się niechcianych undef
wartości z grep
:
my @parts = grep { defined } split /#|(!)/, $foo;
to robi to, co chcę.
Jednak zastanawiałem się, czy mogę zmienić wyrażenie regularne w taki sposób, że nie muszę również wywoływać grep
.
Sugeruję, że _keeping_ 'grep' nie jest złą rzeczą - czyni to znacznie bardziej oczywistym, co robi twój kod. Na przykład. 'my @parts = grep {nie/^ # $ /} split/(# |!) /, $ foo;' – Sobrique
+++ @Sobrique :) Po przeczytaniu mojego własnego kodu po pół roku pomaga, jeśli nie jest ' t obfuscated ... – jm666