perl脚本中的$ _值

时间:2012-08-30 13:14:55

标签: perl

我正在尝试验证我的脚本是否正确。基本上我试图通过使用(grep {$ _ ne $ 1} @ProtectSuperGroups)来避免在@ProtectSuperGroups中重复输入。

但是,我发现$ _是打印空白,这让我对此表示怀疑。

foreach my $group (@ProtectSuperGroups)
{
    chomp($group);
    chomp($group);

    my @ProtectSuperGroupLines = qx($p4 -ztag group -o $group);

    foreach my $line (@ProtectSuperGroupLines)
    {

        if ($line =~ /\.\.\.\s+Users\d{1,3}\s+(.*)$/) 
        {
            push(@ProtectSuperUsers, "$1");

        }

        if ( ($line =~ /\.\.\.\s+Subgroups\d{1,3}\s+(.*)$/) && ( grep { $_ ne $1 } @ProtectSuperGroups)) 
        {
            push(@ProtectSuperGroups, "$1");
        }

    }
}

打印$ _的示例程序也是空白的。

my @array = ( "catchme", "if", "you", "can" );
my $element = "catchme";
if (  grep { $_ eq $element } @array )
{
  print "$)\n"; 
  print "Here's what we found\n";
}
else
{
  print "Sorry, \"$element\" not found in \@array\n";
}

您能否请添加您的经验并建议我更好的解决方案。基本上我想避免在我的数组中推送名为@ProtectSuperGroups的重复条目。我的Perl版本是v5.8.8

3 个答案:

答案 0 :(得分:3)

if (  grep { $_ eq $element } @array )

grep内,$_是该块的本地。外部的$_不受影响。

所以为了你的例子,它应该被重写:

if ( grep { $_ eq $element } @array ) {
  print "$element\n";  # There was a typographical error. You used `$)`
  print "Here's what we found\n";
}

答案 1 :(得分:1)

在第一次拍摄时我没有看到你的错误,但是如果你想要防止重复,你可以在哈希中添加你的条目并在每次推送前检查,如果哈希值中存在该值

my %ProtectSuperGroups;
...
if ( ($line =~ /\.\.\.\s+Subgroups\d{1,3}\s+(.*)$/) && !exists $ProtectSuperGroups{$1} )
{
    push(@ProtectSuperGroups, "$1");
    $ProtectSuperGroups{$1} = 1;
}

答案 2 :(得分:0)

一般来说,如果想避免在任何数组中重复输入(所以想要使用唯一元素),那么你有很多解决方案。其中两个:

使用List :: MoreUtils

use List::MoreUtils qw(uniq);
my @unique = uniq @input_array;

以上是直截了当的。

使用帮助程序哈希

my %helper;
my @unique = grep { ! $helper{$_}++ } @input_array;

如果helper hash中不存在该元素,则该元素是唯一的,否则只计算它..