如何在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
如果您更愿意保留哈希并且只打印所需的值,那么而不是从哈希中打印delete
-ing,对于其值计数为1
(注释掉的行)的元素
以上是关于如何在perl中的foreach循环中的字符串中查找和删除重复值的出现的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 foreach 循环在列表中的短语之间添加分隔符?