Gen*_*neQ 2 perl hash functional-programming map
我有一段代码可以正常工作.它基本上循环遍历散列的每个元素,foreach()并使用正则表达式对其应用变换,如下所示:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
Run Code Online (Sandbox Code Playgroud)
$ results是由DBI的fetchall_hashref()函数返回的hashref .
出于好奇,我想看看我是否可以map()改用它,如下所示:
map {
$results{$_}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.我尝试了各种各样的东西,但到目前为止还没有成功.谁知道怎么做?谢谢.
UPDATE
更正后的代码,由ysth回答:
map {
$results->{$_}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
Run Code Online (Sandbox Code Playgroud)
以及SinanÜnür建议的改良版牙龈较少的牙签
map {
$results->{$_}{uri} =~ s{".*/(.*\.*(gif|jpe?g|png))"}{/resources/uploads/$1}gi
} keys %{$results};
Run Code Online (Sandbox Code Playgroud)
hob*_*bbs 10
值得一提的是,你可以逃脱
$_->{uri} =~ s/foo/bar/ for values %$results;
Run Code Online (Sandbox Code Playgroud)
在这种情况下.在数据结构中四处寻找不会干扰构成它的引用.
小智 5
第二段代码使用哈希,但第一段使用哈希引用.以下似乎有效:
use warnings;
use strict;
my $results = {
a => {uri => "\"c/x.png\"" },
b => {uri => "\"d/y.jpeg\""}
};
map {
$results->{$_}{uri} =~
s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
for my $k (keys %$results) {
print "$k $results->{$k}{uri}\n";
}
Run Code Online (Sandbox Code Playgroud)