Arrays 定义新数据结构时使用引用连接数组
我的第一个帖子:) 我不确定这是否可能,但我想知道 给定以下代码Arrays 定义新数据结构时使用引用连接数组,arrays,perl,Arrays,Perl,我的第一个帖子:) 我不确定这是否可能,但我想知道 给定以下代码 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %email_addresses = ( 'fred' => [ '"Fred Blogs" <fred.blogs@domain.com>', '"Fred Blogs" <fred.blogs@hotmail.com>'
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %email_addresses = (
'fred' => [
'"Fred Blogs" <fred.blogs@domain.com>',
'"Fred Blogs" <fred.blogs@hotmail.com>'
],
'jane' => [
'"Jane Smith" <jane.smith@domain.com>',
'"Jane Smith" <jane.smith@hotmail.com>',
'"Jane Smith" <jane.smith@somwhere.com>'
],
'tom' => [
'"Tom Jones" <tom.jones@domain.com>'
]
);
my %recipients = (
'success' => [
$email_addresses{'fred'},
$email_addresses{'jane'}
],
'failure' => [
$email_addresses{'tom'}
]
);
print Data::Dumper->Dump([\%recipients], ['recipients']);
现在有个问题。。。我想知道这是否可以在我定义my%recipients
-一条语句中完成
我知道在定义之后,我可以使用附加语句以编程方式实现我想要的,但我很想知道它是否可以在一个过程中完成。我尝试了()、[]、{}和取消引用的各种组合,但都没有效果
谢谢大家。您实际上是想将数组引用列表展平。是的,这很容易做到 我建议您只需使用map并传递一个您想要翻译的密钥列表,如下所示:
use strict;
use warnings;
use Data::Dumper;
my %email_addresses = (
'fred' => [
'"Fred Blogs" <fred.blogs@domain.com>',
'"Fred Blogs" <fred.blogs@hotmail.com>',
],
'jane' => [
'"Jane Smith" <jane.smith@domain.com>',
'"Jane Smith" <jane.smith@hotmail.com>',
'"Jane Smith" <jane.smith@somwhere.com>',
],
'tom' => [
'"Tom Jones" <tom.jones@domain.com>',
]
);
my %recipients = (
'success' => [map @{$email_addresses{$_}}, qw(fred jane)],
'failure' => [map @{$email_addresses{$_}}, qw(tom)],
);
print Data::Dumper->Dump([\%recipients], ['recipients']);
使用严格;
使用警告;
使用数据::转储程序;
我的%电子邮件地址=(
“弗雷德”=>[
“弗雷德博客”,
“弗雷德博客”,
],
“简”=>[
“简·史密斯”,
“简·史密斯”,
“简·史密斯”,
],
“汤姆”=>[
“汤姆·琼斯”,
]
);
我的%recipients=(
'success'=>[map@{$email_addresses{$},qw(fred jane)],
'failure'=>[map@{$email_addresses{$},qw(tom)],
);
打印数据::转储程序->转储([\%recipients],'recipients']);
产出:
$recipients = {
'success' => [
'"Fred Blogs" <fred.blogs@domain.com>',
'"Fred Blogs" <fred.blogs@hotmail.com>',
'"Jane Smith" <jane.smith@domain.com>',
'"Jane Smith" <jane.smith@hotmail.com>',
'"Jane Smith" <jane.smith@somwhere.com>'
],
'failure' => [
'"Tom Jones" <tom.jones@domain.com>'
]
};
$recipients={
“成功”=>[
“弗雷德博客”,
“弗雷德博客”,
“简·史密斯”,
“简·史密斯”,
“简·史密斯”
],
“失败”=>[
“汤姆·琼斯”
]
};
太棒了!我没想到要用地图。非常感谢。Data::Dumper
?米勒?你是谁<代码>:P可爱:是的,我可能有一个近乎宗教的偏好,因为它的优越格式。但我有时会看到核心库,特别是如果OP在他们的帖子中使用它的话@杰帕尔:我没有理解你关于Data::Dumper
的评论的上下文。使用它有什么问题吗?@protogen抱歉,这对米勒来说是个断章取义的玩笑。Data::Dumper没有问题。这是一个很棒的模块。Miller通常更喜欢在他的答案中使用Data::Dump(另一个类似于Data::Dumper的有用模块)。
use strict;
use warnings;
use Data::Dumper;
my %email_addresses = (
'fred' => [
'"Fred Blogs" <fred.blogs@domain.com>',
'"Fred Blogs" <fred.blogs@hotmail.com>',
],
'jane' => [
'"Jane Smith" <jane.smith@domain.com>',
'"Jane Smith" <jane.smith@hotmail.com>',
'"Jane Smith" <jane.smith@somwhere.com>',
],
'tom' => [
'"Tom Jones" <tom.jones@domain.com>',
]
);
my %recipients = (
'success' => [map @{$email_addresses{$_}}, qw(fred jane)],
'failure' => [map @{$email_addresses{$_}}, qw(tom)],
);
print Data::Dumper->Dump([\%recipients], ['recipients']);
$recipients = {
'success' => [
'"Fred Blogs" <fred.blogs@domain.com>',
'"Fred Blogs" <fred.blogs@hotmail.com>',
'"Jane Smith" <jane.smith@domain.com>',
'"Jane Smith" <jane.smith@hotmail.com>',
'"Jane Smith" <jane.smith@somwhere.com>'
],
'failure' => [
'"Tom Jones" <tom.jones@domain.com>'
]
};