尽管我知道匹配在那里,但Perl脚本不能匹配数组中的字符串

时间:2014-09-22 14:41:49

标签: arrays perl

我有一个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

第二组结果表明与我匹配,或者至少是我对它的看法。

拔出我的头发试图找到我在这里做错了什么。我确定答案是正确的,我还没有看到它。

1 个答案:

答案 0 :(得分:6)

在尝试打印变量和数组的内容以进行测试时,始终使用Data::Dumper。使用print不会在字符串中显示会导致不匹配的不可见空格。在上面的代码中,Dumper输出是:

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

$VAR2末尾的空格导致了不匹配。