如何在perl中的foreach循环中查找和删除字符串中重复值的出现

时间:2018-10-16 19:29:19

标签: perl foreach

我有一个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循环中执行的值。

2 个答案:

答案 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

请参见deletevalues

如果您宁愿保留哈希并仅打印所需的值,那么对于值计数为delete的元素(注释行),而不是从哈希中1进行打印< / p>