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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在perl中的foreach循环中的字符串中查找和删除重复值的出现相关的知识,希望对你有一定的参考价值。

我有一个带有字符串的foreach循环:

foreach my $val(sort keys %hash) {

$string = $hash{$val}{'value'};

print "$string
";

}

打印我的$string的输出是:

23422
65464
32453
76654
21341
65437
23422
67658

我希望能够找到有两个重复值的位置,在本例中为“23422”并完全从字符串中删除它们。因此,当我打印字符串时,它将打印:

    65464
    32453
    76654
    21341
    65437
    67658

由于foreach循环内部的逻辑,我不知道如何解决这个问题。我已经尝试过测试if语句以检查equals而不是equals但是它无济于事,因为它没有检测到在foreach循环中执行它的值。

答案

您可以将结果存储在另一个哈希变量中,然后在条目唯一时打印。

看一下这个:

$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
" if $my_unique{$val} == 1

}

结果在shell中

$ perl -f dup_delete.pl
65437
65464
21341
67658
32453
76654
另一答案

进行传递以计算每个值的出现次数,然后检查散列并删除其值大于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-ing,对于其值计数为1(注释掉的行)的元素

以上是关于如何在perl中的foreach循环中的字符串中查找和删除重复值的出现的主要内容,如果未能解决你的问题,请参考以下文章

如何跳过“foreach”循环的迭代?

如何使用 foreach 循环在列表中的短语之间添加分隔符?

如何循环遍历 Perl 目录中的文件? [复制]

如何在 foreach 循环中验证元素是不是在集合中的最后一个?

perl之文本文件的嵌套循环

hash 在 perl 中的用法(转载)