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

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

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

Mouse=>JerryDog=>SpikeCat=>Tom

我是 Perl 的新手。任何人都可以解释拆分函数中的正则表达式吗?我能够知道|是用作两者的选择,但我仍然感到困惑。

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

我得到输出

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


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

请解释上述情况。

4

3 回答 3

6

split的第一个参数定义了你想要的元素之间的区别。

/,|=>/匹配逗号 ( ,) 或等号后跟大于号 ( =>)。它们在这里只是文字,没有什么特别之处。

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

/,/只是用逗号分开。您正在创建一个映射Mouse=>Jerry到任何内容Cat=>Tom的哈希Dog=>Spike

于 2013-05-19T17:24:04.803 回答
1
$hashdef = "Mouse=>Jerry, Cat=>Tom, Dog=>Spike";
my %hash = eval( "( $hashdef )" );
print $hash{'Mouse'}."\n";

eval 将字符串作为 Perl 表达式执行。这不使用拆分,但我认为这是处理您在从字符串中获取哈希的帖子中概述的情况的好方法,因为您的字符串恰好是格式正确的 Perl,所以我在这里添加了它。

于 2013-05-19T18:59:28.047 回答
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;
}
于 2015-03-05T12:19:39.807 回答