我有一个Perl脚本,允许用户使用-p标志在命令行中输入参数列表作为参数。然后脚本中的子例程循环遍历一组较长的参数,并检查它们是否与使用-p标志传入的参数匹配。
由于可以在命令行中输入多个参数,因此字符串将存储在变量$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
第二组结果表明与我匹配,或者至少是我对它的看法。
拔出我的头发试图找到我在这里做错了什么。我确定答案是正确的,我还没有看到它。
答案 0 :(得分:6)
在尝试打印变量和数组的内容以进行测试时,始终使用Data::Dumper
。使用print
不会在字符串中显示会导致不匹配的不可见空格。在上面的代码中,Dumper输出是:
$VAR1 = {
'-parameter' => [
'streams_pool_size'
],
'-p' => $VAR1->{'-parameter'},
};
$VAR2 = 'streams_pool_size ';
$VAR2
末尾的空格导致了不匹配。