如何在Perl中连接重复哈希键的值?

如何在Perl中连接重复哈希键的值?,perl,Perl,我知道哈希中不可能有重复的键,但我的数据是这样的: Key Value SETUP_FACE_PROT great SETUP_FACE_PROT great2 SETUP_FACE_PROT great3 SETUP_FACE_PROT great3 SETUP_ARM_PROT arm SETUP_FOOT_PROT foot SETUP_FOOT_PROT foot2 SETUP_HEAD_PROT gogg

我知道哈希中不可能有重复的键,但我的数据是这样的:

Key                Value

SETUP_FACE_PROT    great
SETUP_FACE_PROT    great2
SETUP_FACE_PROT    great3
SETUP_FACE_PROT    great3
SETUP_ARM_PROT     arm
SETUP_FOOT_PROT    foot
SETUP_FOOT_PROT    foot2
SETUP_HEAD_PROT    goggle 
我想连接重复键的值,用
*
字符分隔。例如,我希望输出是这样的:

SETUP_FACE_PROT'=great*great2*great3',
SETUP_ARM_PROT='arm',
SETUP_FOOT_PROT='foot*foot2',
SETUP_HEAD_PROT='google'
到目前为止,我就是这样试图解决这个问题的:

foreach my $key ( sort keys %stuff ) 
{
   print "$key=\'", join( "*", @{ $stuff{$key} } ), "\'\n";
}
但是,如何将结果存储在变量中,以便将其传递给另一个子例程,而不是打印结果呢?我正在尝试创建一个新字符串,如下所示:

$newstring="
SETUP_FACE_PROT='great*great2*great3',
SETUP_ARM_PROT='arm',
SETUP_FOOT_PROT='foot*foot2',
SETUP_HEAD_PROT='google'  "

不能复制密钥,可以创建数组哈希

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my %stuff;

while (<DATA>) {
    my ( $key, $value ) = split;
    push( @{ $stuff{$key} }, $value );
}

print Dumper \%stuff;

foreach my $key ( sort keys %stuff ) {
    print "$key=\'", join( "*", @{ $stuff{$key} } ), "\'\n";
}

__DATA__
SETUP_FACE_PROT great
SETUP_FACE_PROT great2
SETUP_FACE_PROT great3
SETUP_FACE_PROT great3
SETUP_ARM_PROT arm
SETUP_FOOT_PROT foot
SETUP_FOOT_PROT foot2
SETUP_HEAD_PROT goggle
或者可以使用带有文件句柄的
print

my $results; 
open ( my $output, '>', \$results ); 
foreach my $key ( sort keys %stuff ) {
    print {$output} "$key=\'", join( "*", @{ $stuff{$key} } ), "\'\n";
}
close ( $output );
print $results;

最后我得到了一个答案

   use Data::Dumper;
   my %stuff;
   use Text::CSV;
   my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ });

   my $filenamex = 'duplicate2.csv';

   $checkstring ='';
    open(my $datab, '<', $filenamex) or die "Could not open '$filename' $!\n";
    $i=1;
    my %datan;
    while (my $linea = <$datab>) 
    {
      chomp $linea;
      @fieldsx = split ",",$linea;
      $key = $fieldsx[0];
      $value = $fieldsx[1];
     # print $key;
       push( @{ $stuff{$key} }, $value );
    }



 foreach my $key ( sort keys %stuff ) 
  {
   $checkstring = $checkstring.','.$key.'='. join( "*", @{ $stuff{$key} } );
  }

 print $checkstring;
使用数据::转储程序;
我的%的东西;
使用Text::CSV;
my$csv=Text::csv_XS->new({binary=>1,eol=>$/});
my$filenamex='duplicate2.csv';
$checkstring='';

打开(my$datab,'但我想返回该变量,而不是打印。有什么想法吗?以及如何将其存储在variable.whole result中。将其返回到哪里?这将生成与您的问题相同的输出。您不提供任何详细信息,因此我无法回答。同意。实际上,我说的不是打印:“$key=\”,join(“,@{$stuff{$key}),“\”\n”;我想]将其存储在变量中。因此,我将得到的最终结果是:SETUP_FACE_PROT='greatgreat2*great3',SETUP_FACE_PROT='arm',SETUP_FOOT_PROT='FOOT*foot2',SETUP_HEAD_PROT='google'如果您对所需的输出有进一步的说明,那么最好将其编辑到您的问题中。为什么要加载Text::CSV,创建Text::CSV解析器对象和不使用它吗?另外,Sobrique的是一个更干净的代码版本。为什么不使用它呢?好的。更新了答案,包含了一个包含数据的变量。
   use Data::Dumper;
   my %stuff;
   use Text::CSV;
   my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ });

   my $filenamex = 'duplicate2.csv';

   $checkstring ='';
    open(my $datab, '<', $filenamex) or die "Could not open '$filename' $!\n";
    $i=1;
    my %datan;
    while (my $linea = <$datab>) 
    {
      chomp $linea;
      @fieldsx = split ",",$linea;
      $key = $fieldsx[0];
      $value = $fieldsx[1];
     # print $key;
       push( @{ $stuff{$key} }, $value );
    }



 foreach my $key ( sort keys %stuff ) 
  {
   $checkstring = $checkstring.','.$key.'='. join( "*", @{ $stuff{$key} } );
  }

 print $checkstring;