如何使用map()将操作应用于Perl中哈希的每个元素?

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)

在这种情况下.在数据结构中四处寻找不会干扰构成它的引用.


yst*_*sth 8

在地图版本中,您错误地更改$results->{$results{.把 - >放回来它应该工作.


小智 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)