0

我正在尝试验证我的脚本是否正确。基本上,我试图通过使用( 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

4

3 回答 3

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";
}
于 2012-08-30T13:26:37.800 回答
1

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

my %ProtectSuperGroups;
...
if ( ($line =~ /\.\.\.\s+Subgroups\d{1,3}\s+(.*)$/) && !exists $ProtectSuperGroups{$1} )
{
    push(@ProtectSuperGroups, "$1");
    $ProtectSuperGroups{$1} = 1;
}
于 2012-08-30T13:22:00.453 回答
0

一般来说,如果想避免任何数组中的重复条目(所以想要唯一的元素),你有很多解决方案。他们两个人:

使用 List::MoreUtils

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

以上是直截了当的。

使用辅助哈希

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

如果元素不存在于辅助哈希中,则它是唯一的,否则只计算它..

于 2012-08-30T14:27:26.230 回答