我有一个foreach循环,其中包含一个字符串:
foreach my $val(sort keys %hash) {
$string = $hash{$val}{'value'};
print "$string\n";
}
打印我的$string
的输出是:
23422
65464
32453
76654
21341
65437
23422
67658
我希望能够找到两个重复值(在这种情况下为'23422'),然后将其从字符串中完全删除。这样当我打印字符串时,它将打印:
65464
32453
76654
21341
65437
67658
但是由于foreach循环中的逻辑,我不确定该如何处理。我曾尝试测试if语句来检查是否等于,但无济于事,因为它没有检测到要在foreach循环中执行的值。
答案 0 :(得分:2)
您可以将结果存储在另一个哈希变量中,然后在条目唯一的情况下进行打印。
检查一下:
$hash{100}{'value'}=23422;
$hash{65464}{'value'}=65464;
$hash{32453}{'value'}=32453;
$hash{76654}{'value'}=76654;
$hash{21341}{'value'}=21341;
$hash{65437}{'value'}=65437;
$hash{102}{'value'}=23422;
$hash{67658}{'value'}=67658;
foreach my $val(sort keys %hash) {
$string = $hash{$val}{'value'};
$my_unique{$string}++
}
foreach my $val( keys %my_unique)
{
print "$val\n" if $my_unique{$val} == 1
}
结果进入外壳
$ perl -f dup_delete.pl
65437
65464
21341
67658
32453
76654
答案 1 :(得分:2)
通过计算每个值的出现次数,然后遍历哈希并删除所有值计数大于1的条目(该值出现在哈希的其他位置)
use warnings;
use strict;
use feature 'say';
my @data = qw(23422 65464 32453 76654 21341 65437 23422 67658);
# Make up a hash with above values
my %h = map { $_ => $data[$_] } 0..$#data;
# Get the count for each value
my %val_cnt;
++$val_cnt{$_} for values %h;
# Delete hash entries for which the value appears more than once
for (keys %h) {
delete $h{$_} if $val_cnt{$h{$_}} > 1;
# Or, to keep %h intact and only print
# say $h{$_} if $val_cnt{$h{$_}} == 1;
}
say join ' ', values %h;
打印
76654 67658 32453 65464 21341 65437
如果您宁愿保留哈希并仅打印所需的值,那么对于值计数为delete
的元素(注释行),而不是从哈希中1
进行打印< / p>