Я собираюсь ответить на вопрос, который (я думаю) лежит в основе вашего вопроса - не вопрос, который вы задали.
Мне кажется, что вы разбираете параметры командной строки. Поэтому используйте синтаксический анализатор командной строки, а не заново для этого. Getopt::Long является частью стандартного дистрибутива Perl.
#!/usr/bin/perl
use strict;
use warnings;
# We use modern Perl (here, specifically, say())
use 5.010;
use Getopt::Long 'GetOptionsFromString';
use Data::Dumper;
my %options;
my $str = '-test aa_aa -machine aab-baa-aba -from ccc';
GetOptionsFromString($str, \%options, 'test=s', 'machine=s', 'from=s');
say Dumper \%options;
Как правило, вы будете использовать функцию GetOptions()
, как вы разбираете параметры командной строки, которые доступны в @ARGV
. Я не уверен, как параметры оказались в вашей строке, но для этой ситуации есть полезная функция GetOptionsFromString()
.
Обновление: Чтобы объяснить, почему ваш код не работает.
$str = "-test aa_aa -machine aab-baa-aba -from ccc";
$str =~ /-test\s*(.*)\s*/;
Вы захватывая, что соответствует (.*)
. Но .*
жадный. То есть, он соответствует как можно большему количеству данных.И в этом случае это означает, что он соответствует до конца строки. Есть (по крайней мере!) Несколько способов исправить это.
1/Сделать матч не жадным, добавив ?
.
$str =~ /-test\s*(.*?)\s*/;
2/Более подробно о том, что вы ищете, - в этом случае не-пробельные символы.
$str =~ /-test\s*(\S*)\s*/;
Это будет работать для тестовых данных: 'Perl -e«использовать строгий; использовать предупреждения; my $ str = "-test aaaa -machine bbb-from ccc"; while ($ str = ~ m/(\ w +)/g) {print $ 1. "\ n"; } '' – AbhiNickz