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

普遍的に、任意の配列で重複するエントリを避けたい場合 (一意の要素が必要な場合) には、多くの解決策があります。それらの2つ:

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 に答える