Как получить только один захват из регулярного выражения Perl? - PullRequest
0 голосов
/ 01 декабря 2009

Есть ли более простой способ получить только один элемент из соответствия, кроме как выполнить следующее:

my $date = ($xml_file =~ m/(\d+)-sys_char/)[0];
# or
my $date = $1 if $xml_file =~ /(\d+)-sys_char/;

Есть ли флаг, указывающий, что m не возвращает массив, а только одно объединенное значение из всех совпадений $ #, поэтому я могу сделать:?

my $date = ($xml_file =~ mSOMEOPT/(\d+)-sys_char/);

удаление 0 с конца?

Ответы [ 2 ]

8 голосов
/ 01 декабря 2009

Вы хотите:

my ($date) = ($xml_file =~ m/(\d+)-sys_char/);

Это даст вам $1 в $date. Что касается второй части вашего вопроса, нет способа получить все пронумерованные совпадения в одной переменной, но вы можете получить их все в массив, например:

my @matches = ($xml_file =~ m/(\d+)-sys_char/);

Это фактически один и тот же синтаксис: когда левая часть совпадения, подобного этому, является массивом, то возвращается массив, содержащий все подспаривания. Первая версия превращает ($date) в одноэлементный массив, отбрасывая остальные суб-совпадения.

3 голосов
/ 01 декабря 2009
my ($date) = $xml_file =~ m/(\d+)-sys_char/;

if ( defined $date ) {

}
...