Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中的foreach循环中查找和删除字符串中出现的重复值_Perl_Foreach - Fatal编程技术网

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

如何在perl中的foreach循环中查找和删除字符串中出现的重复值,perl,foreach,Perl,Foreach,我有一个foreach循环,里面有一个字符串: foreach my $val(sort keys %hash) { $string = $hash{$val}{'value'}; print "$string\n"; } 打印my$字符串的输出为: 我希望能够找到有两个重复值的地方,在本例中为“23422”,并将它们从字符串中完全删除。因此,当我打印字符串时,它将打印: 65464 32453 76654 21341 65437 6765

我有一个foreach循环,里面有一个字符串:

foreach my $val(sort keys %hash) {

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

print "$string\n";

}
打印my$字符串的输出为:

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

    65464
    32453
    76654
    21341
    65437
    67658

但是,由于foreach循环中的逻辑,我不确定如何进行此操作。我已经尝试过测试if语句来检查equals和notequals,但是没有效果,因为它没有检测到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\n" if $my_unique{$val} == 1

}
壳中的结果

$ 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 看到和


如果您希望保留散列并只打印所需的值,那么不要从散列中删除ing,只需打印,对于值计数为1的元素,注释掉的行中通常有多少数据是$hash?顺便说一句,它应该是keys%$hash或keys%hash@zdim大约8个键,8行。谢谢你捕捉到了这一点,我的代码中有这一点,但我正在手动将其输入堆栈溢出。谢谢。我想检查一下你的数据是否庞大,是什么让它具有挑战性 76654 67658 32453 65464 21341 65437