【问题标题】:How to find and delete occurrence of duplicate value in a string within a foreach loop in perl如何在perl的foreach循环中查找和删除字符串中重复值的出现
【发布时间】:2018-10-16 19:29:19
【问题描述】:

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

【问题讨论】:

  • $hash 中通常有多少数据? (顺便说一句,应该是keys %$hashkeys %hash
  • @zdim 大约 8 个键,所以 8 行。感谢您发现它,我的代码中有它,但手动将它输入到 Stack Overflow。
  • 谢谢。要求检查您的数据是否庞大,是什么使其具有挑战性

标签: perl foreach


【解决方案1】:

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

看看这个:

$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

}

shell 中的结果

$ perl -f dup_delete.pl
65437
65464
21341
67658
32453
76654

【讨论】:

    【解决方案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

    如果您希望保留散列并且只打印所需的值,那么对于值计数为 1(注释掉的行)的元素,而不是从散列中打印 delete-ing

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-17
      • 2015-09-22
      • 2017-02-23
      • 1970-01-01
      • 2020-04-19
      • 2015-11-16
      • 2011-04-15
      • 2017-10-23
      相关资源
      最近更新 更多