【问题标题】:How do I convert an array to a hash in Perl?如何在 Perl 中将数组转换为哈希?
【发布时间】:2021-11-13 05:37:52
【问题描述】:

我有一个数组并尝试将数组内容转换为带有键和值的散列。索引 0 是键,索引 1 是值,索引 2 是键,索引 3 是值,依此类推

但它没有产生预期的结果。代码如下:

open (FILE, "message.xml") || die "Cannot open\n";

$var = <FILE>;

while ($var ne "")
{
 chomp ($var);
 @temp = split (/[\s\t]\s*/,$var);
 push(@array,@temp);
 $var = <FILE>;
}

$i = 0;
$num = @array;
    while ($i < $num)
{
 if (($array[$i] =~ /^\w+/i) || ($array[$i] =~ /\d+/))
 {
#   print "Matched\n";
#   print "\t$array[$i]\n";
  push (@new, $array[$i]);
 }
 $i ++;
}
print "@new\n";


use Tie::IxHash;
tie %hash, "Tie::IxHash";

%hash = map {split ' ', $_, 2} @new;

while ((my $k, my $v) = each %hash)
{
 print "\t $k => $v\n";
}

产生的输出不正确:

name Protocol_discriminator attribute Mandatory type nibble value 7 min 0 max F name Security_header attribute Mandatory type nibble value 778 min 0X00 max 9940486857
         name => Security_header
         attribute => Mandatory
         type => nibble
         value => 778
         min => 0X00
         max => 9940486857

在输出中,您可以看到哈希仅由一部分组成,而数组的另一部分并未在哈希中创建。

谁能帮忙?

【问题讨论】:

    标签: perl hashmap


    【解决方案1】:

    无非就是:

    %hash = @array;
    

    【讨论】:

    • 假设@array中的数据存储为key、value、key、value等
    • @Hawk 和他的选民:请花点时间阅读这个问题。 OP 已经在他/她的问题中说明了这一点。
    • 感谢@Hawk,对于我们这些只阅读标题并立即跳转到答案的人来说,这是一个非常有用的说明;)
    • 如何在没有额外变量的情况下进行转换?我试试这个 %{ @_ }{ key },但它不起作用((
    【解决方案2】:

    在相关说明中,将@array 的所有元素转换为%hash 的键。有些人最终来到这里可能真的想要这个......

    这允许使用存在函数:

    my %hash;
    $hash{$_}++ for (@array);
    

    【讨论】:

    • %hash = map { $_ =&gt; 1 } @array;(与您的解决方案不同,将多次出现的元素设置为1)。
    • @KeithThompson 的变体在功能上与my %hash; $hash{$_} = 1 for (@array); 相同。就速度/资源消耗而言,一个比另一个更可取吗?
    【解决方案3】:
    my %hash = map { $_ => 1 } @array
    

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 2011-02-23
      • 2015-11-26
      • 2014-07-23
      • 2019-10-27
      • 2019-05-23
      • 2012-07-15
      • 2012-10-29
      相关资源
      最近更新 更多