2014-09-22 2 views
0

У меня есть скрипт 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 

второй набор результатов указывало бы на матч со мной, или, по крайней мере, это мое восприятие этого.

Вытягивая мои волосы, пытаясь найти то, что я делаю неправильно здесь. Я уверен, что ответ прямо из меня, и я его еще не видел.

+1

Можете ли вы привести несколько примеров ввода? Кроме того, нет необходимости в скобках в строке 'my $ pname = ($ 1);'. –

+1

Добавьте вывод к вопросу, 'use Data :: Dumper; print Dumper \% ARGV, $ pline' –

+0

Просто добавлен пример ввода и вывода. Я также добавлю код Dumper, чтобы увидеть, дают ли он разные результаты. – YonkeyDonk64

ответ

6

При попытке распечатать содержимое переменных и массивов при тестировании всегда используйте Data::Dumper. Использование print не отображает невидимые пробелы в строках, которые вызывают несоответствия. В приведенном выше коде, выходной Хранитель был:

$VAR1 = { 
      '-parameter' => [ 
          'streams_pool_size' 
          ], 
      '-p' => $VAR1->{'-parameter'}, 
     }; 
$VAR2 = 'streams_pool_size '; 

Пространство в конце $VAR2 вызывало несоответствие.

+3

Just Data :: Dumper недостаточно хорош; установите '$ Data :: Dumper :: Useqq = 1', чтобы фактически увидеть все символы однозначно (например, backspaces как« \ b ») – ysth