使用split将字符串转换为perl中的hash

时间:2013-05-19 17:19:36

标签: perl

$hashdef = "Mouse=>Jerry, Cat=>Tom, Dog=>Spike";

%hash = split /,|=>/,$hashdef;

print "$_=>$hash{$_}" foreach(keys %hash);


Mouse=>JerryDog=>SpikeCat=>Tom

我是perl的新手可以解释我能够知道的分割函数里面的正则表达式被用作两者的选择,但我仍然感到困惑

%hash = split /|=>/,$hashdef;

我得到了ouput

S=>pe=>J=>eT=>or=>rm=>,y=>,u=>sM=>og=>D=>oC=>ai=>kt


%hash = split /,/,$hashdef;
Mouse=>Jerry=>Cat=>TomDog=>Spike=>

请解释上述条件

3 个答案:

答案 0 :(得分:6)

split的第一个参数定义了所需元素之间的区别。

/,|=>/匹配逗号(,)或等号,后跟大于号(=>)。他们只是文字,他们没什么特别的。

/|=>/匹配零长度字符串或等号后跟大于号的符号,并且在零长度字符串上拆分只是将字符串拆分为单个字符;因此,在您的哈希值中,M将映射到ou将映射到s,等等。它们在您的输出中出现混乱,因为哈希没有确定的顺序。

/,/只是在逗号上拆分。您正在创建一个将Mouse=>Jerry映射到Cat=>TomDog=>Spike的哈希值。

答案 1 :(得分:1)

$hashdef = "Mouse=>Jerry, Cat=>Tom, Dog=>Spike";
my %hash = eval( "( $hashdef )" );
print $hash{'Mouse'}."\n";

eval将字符串作为Perl表达式执行。这不会使用split,但我认为这是一个很好的方法来处理从你的字符串中获取哈希的帖子中所概述的情况,因为你的字符串碰巧是形成良好的Perl,所以我在这里添加它。

答案 2 :(得分:0)

sub hash2string {
   my $href = $_[0];
   my $hstring="";
   foreach (keys %{$href}) {
      $hstring .= "$_=>$href->{$_}, ";
   }
   return substr($hstring,0,-2);
}

sub string2hash {
   my %lhash;
   my @lelements = split(/, /,$_[0]);
   foreach (@lelements) {
      my ($skey,$svalue) = split(/=>/,$_);
      $lhash{$skey} = $svalue;
   }
   return %lhash;
}