У меня есть скрипт Perl, который позволяет пользователю вводить список параметров в качестве аргумента в командной строке с использованием флага -p. Подпрограмма в скрипте затем проходит через более длинный набор параметров и проверяет, соответствует ли какой-либо из параметров параметрам, переданным с флагом -p.Perl-скрипт не может соответствовать строке в массиве, несмотря на то, что я знаю, что есть
Поскольку в командной строке можно ввести несколько параметров, строки сохраняются в переменной $ARGV{'-p'}
(я использую Getopt::Euclid
). Я конвертирую эту переменную в массив и сохраняю ее в переменной с именем @parlist
. Однако, независимо от того, какой метод я использую, я никогда не могу заставить скрипт распознавать соответствие между строкой (хранимой в переменной) и элементом массива, даже когда я распечатываю содержимое обоих и вижу точные совпадения.
Мой код:
#parameter being matched as an argument of the subroutine
my $pline = $_[0];
#parameter list as command line argument
my @parlist = @{$ARGV{'-p'}};
print "parlist: @parlist\n";
#extract parameter name from parameter line
$pline =~ /^.*?\._*?(.*)=.*$/;
my $pname = ($1);
print "pname: $pname\n";
#this doesn't find a match
my %p = map {$_ => 1 } @parlist;
if (exists $p{$pname}) {
print "Found it!\n";
}
#neither does this
my $match = grep { $_ eq $pname } @parlist;
print "$match\n";
#this doesn't either
if (grep { /$pname/ } @{$ARGV{'-p'}}) {
print "Found it!\n";
}
Пожалуйста, обратите внимание, что регулярное выражение работает отлично. Две строки печати наверху позволяют мне подтвердить, что существует фактическое совпадение между переменной и массивом, но проверка соответствия по-прежнему не работает. Сценарий называется так:
./script -p streams_pool_size
Несколько петель через подпрограмму может выглядеть следующим образом:
parlist: streams_pool_size
pname: java_pool_size
parlist: streams_pool_size
pname: streams_pool_size
parlist: streams_pool_size
pname: nls_language
второй набор результатов указывало бы на матч со мной, или, по крайней мере, это мое восприятие этого.
Вытягивая мои волосы, пытаясь найти то, что я делаю неправильно здесь. Я уверен, что ответ прямо из меня, и я его еще не видел.
Можете ли вы привести несколько примеров ввода? Кроме того, нет необходимости в скобках в строке 'my $ pname = ($ 1);'. –
Добавьте вывод к вопросу, 'use Data :: Dumper; print Dumper \% ARGV, $ pline' –
Просто добавлен пример ввода и вывода. Я также добавлю код Dumper, чтобы увидеть, дают ли он разные результаты. – YonkeyDonk64