如何打印数组中的特定键(Perl)

时间:2017-10-15 17:35:56

标签: perl

我最近开始学习Perl,所以我对功能和语法不太熟悉。 如果我有一个Perl数组和一些变量,

#!/usr/bin/perl
use strict;
use warnings;
my @numbers = (a =>1, b=> 2, c => 3, d =>4, e => 5);
my $x;
my $range = 5;
$x = int(rand($range));
print "$x";

生成1-5之间的随机数,如何让程序打印实际的键(a,b,c等),而不仅仅是数字(1,2,3,4,5) ?

3 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。例如,将“numbers”声明为哈希而不是数组。请注意,键在每个键值对中排在第一位,在这里您要使用random int作为键:

my %numbers = ( 0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e' );

然后您可以使用以下方式查找“密钥”:

my $key = $numbers{$x};

请注意,rand( $x );返回的数字大于或等于零且小于$ x 。因此,如果您想要1-5范围内的整数,则必须在代码中添加1:此时您将获得0-4而不是1-5。

答案 1 :(得分:0)

看起来你想要进行反向查找,逐个值,与我们从哈希中得到的相反。由于哈希是一个列表,您可以reverse它,并使用生成的哈希按数字查找。

一些更正:您需要hash variable(不是数组),并且需要将1添加到rand整数生成器,以便拥有所需的1..5范围

use warnings;
use strict;
use feature 'say';

my %numbers = (a => 1, b => 2, c => 3, d => 4, e => 5);

my %lookup_by_number = reverse %numbers;  # values need be unique

my $range = 5;
my $x = int(rand $range) + 1;

say $lookup_by_number{$x};

如果不反转哈希值,您需要在values上迭代哈希值%numbers,针对$x对每个哈希值进行测试,以找到其密钥。

如果原始哈希值中的各种键有相同的值,则必须手动执行,因为reverse - ing会尝试创建具有重复键的哈希值,在这种情况下,只有最后一个键被保留。所以你会失去一些价值观。一种方式

my @at_num = grep { $x == $numbers{$_} } keys %numbers;

the post中,这被标记为重复。

但是你应该为反向查找构建一个数据结构,这样每次需要信息时都不会搜索列表。这可以是一个散列,其中键是唯一数字的列表,而它们的值是数组引用( arrayrefs ),其中包含来自原始散列的相应键

use warnings;
use strict;

my %num = (a => 1, b => 2, c => 1, d => 3, e => 2);  # with duplicate values

my %lookup_by_num;

foreach my $key (keys %num) {
    push @{ $lookup_by_num{$num{$key}} }, $key;
}

say "$_ => [ @{$lookup_by_num{$_}} ]" for keys %lookup_by_num;

打印

1 => [ c a ]
3 => [ d ]
2 => [ e b ]

显示复杂数据结构的一种好方法是通过Data::DumperData::Dump(或其他)。

表达式@{ $lookup_by_num{ $num{$key} } }为密钥%lookup_by_num提取$num{$key}的值并取消引用@{ ... },以便push $key $num{$key}它。这个问题的关键部分是它第一次遇到<input type="text" name="user" id="user"> 自动生成 arrayref及其相应的键。有关详细信息,请参阅this post及其参考资料。

答案 2 :(得分:0)

首先,数组没有键(嗯,他们有点做,但他们是整数,而不是你想要的值)。所以我认为你想要一个哈希,而不是一个数组。

my %numbers = (a =>1, b=> 2, c => 3, d =>4, e => 5);

如果你想获得这个字母,给定整数,你需要反过来这个哈希:

my %rev_numbers = %numbers;

请注意,如果原始哈希值中的值是唯一的,那么反转这样的哈希只会起作用(因为反转哈希会使值成为键,哈希键始终是唯一的。)

然后,您只需在%rev_hash中查找一个整数即可获得相关的字母。

my $integer = 3;
say $rev_numbers{$integer}; # prints 'c'