perl 如何在不使用中间变量的情况下将散列转换为数组?

thtygnil  于 2023-04-21  发布在  Perl
关注(0)|答案(4)|浏览(167)

如何在不使用中间变量的情况下临时将hash转换为array
例如,在下面的代码中,“@arr”变量是一个存储转换后的哈希的数组。

my %scientists = (
    "Newton"   => "Isaac",
    "Einstein" => "Albert",
    "Darwin"   => "Charles",
);

my @arr = %scientists;
print $_ . " " foreach @arr; # "Newton Isaac Darwin Charles Einstein Albert"

我并不想在这里完成任何具体的事情,只是想知道是否有可能在没有中间变量的情况下将散列转换为数组

print ref(\@arr); # print array

同样,是否有一个东西可以取代“”,以便以下是可能的

print ref(<syntax>%scientists%<sytax>) # should print array.
w80xi6nr

w80xi6nr1#

在列表上下文中,%hash产生标量的键值对。
例如,%scientists产生六个标量"Newton", "Isaac", "Einstein", "Albert", "Darwin", "Charles",尽管顺序可以变化。
这适用于my @arr =的右侧。

my @arr = %scientists;

它也适用于foreach循环的列表。

print $_ . " " for %scientists;

然而,大多数时候,人们会使用keys( %scientists )而不仅仅是%scientists

say "$_ $scientists{ $_ }" for keys( %scientists );

对于底部的问题,您可以使用

say ref( [ %scientists ] );

[ ... ]大致相当于do { my @anon = ...; \@anon }
换句话说,它仍然创建一个数组,但该数组是匿名的。

iyr7buue

iyr7buue2#

这个问题的措辞似乎不一致--它询问的是一个数组,实际上似乎想要一个列表,但讨论也没有明确支持这一点。也许它是在探索如何在不创建变量的情况下“序列化”或字符串化哈希。下面是一些选项
打印我经常使用的哈希

say "$_ => $h{$_}" for keys %h;

或者,使其总是处于相同的顺序,

say "$_ => $h{$_}" for sort keys %h;

这种方法可用于构建键值对的列表或字符串。

map { "$_ => $h{$_}" } keys %h;   # list of key-value strings

可以进一步操作的内容。(使用hashref时,它是keys %$hr$h->{$_}。)
而且,“转储程序”库为我们解包数据结构

use Data::Dump qw(pp);

my $fmt_str = pp \%h;  # formatted string. for formatted print use 'dd'

需要安装Data::Dump包。一个核心模块,应该与Perl一起安装,是Data::Dumper(函数Dumper返回格式化字符串)。还有其他模块。

u1ehiz5o

u1ehiz5o3#

您希望转换执行什么操作?
如果你只想要钥匙你可以做

my @lastnames = keys %scientists;

如果你只想要你能做的值

my @firstnames = values %scientists;

如果你想让它们混合成键/值对,就这么做吧

my @names = %scientists;

需要记住的是,由于散列是无序的,因此您不知道将返回什么顺序。

2fjabf4q

2fjabf4q4#

你的措辞有点混乱(数组vs列表),但我认为你真正想要的是将%Hash变量转换为列表,以便dump它,而没有中间的@array变量。
这里是调试器中的一个快速演示:
print ref();# print array

DB<7> use Data::Dumper

  DB<8> print Dumper \%h
$VAR1 = {
          'Einstein' => 'Albert',
          'Darwin' => 'Charles',
          'Newton' => 'Isaac'
        };

  DB<9>

注意:Data::Dumper是核心,即每个Perl版本都可用。
我个人更喜欢Data::Dump,它需要从CPAN安装。

相关问题