Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl:同时使用map和foreach?_Perl - Fatal编程技术网

perl:同时使用map和foreach?

perl:同时使用map和foreach?,perl,Perl,我想知道是否有可能让一个散列同时分配它的键和值。或在一般情况下使用地图,并用于一行: #!/usr/bin/perl %h = map {$_, $i} qw[a b c] for $i (1..3) 但不幸的是,not=>Number在运算符期望的位置找到,表示括号中的数字。所以我的问题是为什么我不能用这种方法做双循环?否则,人们会如何分配散列键给值?我不关心像$h={a=>1,b=>2,c=>3}这样的事情,而是分配%h=@keys=@value。。。换句话说,如何通过以下方式分配哈希:

我想知道是否有可能让一个散列同时分配它的键和值。或在一般情况下使用地图,并用于一行:

#!/usr/bin/perl
%h = map {$_, $i} qw[a b c] for $i (1..3)
但不幸的是,not=>Number在运算符期望的位置找到,表示括号中的数字。所以我的问题是为什么我不能用这种方法做双循环?否则,人们会如何分配散列键给值?我不关心像$h={a=>1,b=>2,c=>3}这样的事情,而是分配%h=@keys=@value。。。换句话说,如何通过以下方式分配哈希:

仅2个数组@键,@值,无标量 一次一行-无阻塞
在perl中可能吗?

填充一个散列仅仅是分配一个具有交替键和值的列表,因此您只需以交替方式使用这两个数组来构造列表

use strict;
use warnings;
my @keys = qw(a b c);
my @values = 1..3;

my %h = map { ($keys[$_], $values[$_]) } 0..$#keys;
在zip_by中为此提供了有用的抽象

use List::UtilsBy 'zip_by';
my %h = zip_by { @_ } \@keys, \@values;
但实际上它更容易使用。虽然从技术上讲,您不能在声明的同一声明中这样做,但这是迄今为止最整洁的选择:

my %h;
@h{@keys} = @values;

填充散列只是用交替的键和值分配列表的问题,因此您只需以交替的方式使用这两个数组来构造列表

use strict;
use warnings;
my @keys = qw(a b c);
my @values = 1..3;

my %h = map { ($keys[$_], $values[$_]) } 0..$#keys;
在zip_by中为此提供了有用的抽象

use List::UtilsBy 'zip_by';
my %h = zip_by { @_ } \@keys, \@values;
但实际上它更容易使用。虽然从技术上讲,您不能在声明的同一声明中这样做,但这是迄今为止最整洁的选择:

my %h;
@h{@keys} = @values;

嗯,关于“为什么”的问题不是很清楚——下面的代码也可以实现同样的效果

use strict;
use warnings;

use Data::Dumper;

my $debug = 1;

my %h;

@h{qw(a b c)} = (1..3);

print Dumper(\%h) if $debug;

嗯,关于“为什么”的问题不是很清楚——下面的代码也可以实现同样的效果

use strict;
use warnings;

use Data::Dumper;

my $debug = 1;

my %h;

@h{qw(a b c)} = (1..3);

print Dumper(\%h) if $debug;
使用List::MoreUtils'zip'或添加您自己的,因为该模块不是核心模块:

sub zip(\@@){map{($_[0][$_-1],$_[$_])}1..@{$_[0]}}                 
my %h = zip @keys, @values;
使用List::MoreUtils'zip'或添加您自己的,因为该模块不是核心模块:

sub zip(\@@){map{($_[0][$_-1],$_[$_])}1..@{$_[0]}}                 
my %h = zip @keys, @values;

始终严格使用;使用警告;始终严格使用;使用警告$keys[$\uuz],$values[$\uz]通常被写入$keys[$\uz]=>$values[$\uz]虽然这只是一个风格问题fwiw,但我在map语句中使用括号作为一种习惯返回对,以避免解析器混淆并将其视为map EXPR,当然这并不总是必要的。@${@keys}=@values for\my%h;但是总体想法不好。$keys[$\uuz]、$values[$\uz]通常是写$keys[$\uz]=>$values[$\uz]虽然这只是一个风格问题fwiw,但我在map语句中使用括号作为习惯返回对,以避免解析器混淆并将其视为映射表达式,当然这并不总是必要的。@${@keys}=@values for\my%h;但总的来说这是个糟糕的主意。