我最近开始学习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) ?
答案 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::Dumper或Data::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'