我正在尝试验证我的脚本是否正确。基本上我试图通过使用(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
答案 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)
一般来说,如果想避免在任何数组中重复输入(所以想要使用唯一元素),那么你有很多解决方案。其中两个:
use List::MoreUtils qw(uniq);
my @unique = uniq @input_array;
以上是直截了当的。
my %helper;
my @unique = grep { ! $helper{$_}++ } @input_array;
如果helper hash中不存在该元素,则该元素是唯一的,否则只计算它..