У меня есть кусок кода, который отлично работает. Он в основном перебирает каждый элемент хэша, используя foreach()
, и применяет к нему преобразование с помощью регулярного выражения, например:
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ results - это возврат из хеш-функции с помощью функции DBI fetchall_hashref()
.
Просто из любопытства я хотел посмотреть, смогу ли я переписать его, используя вместо этого map()
, как показано ниже:
map {
$results{$_}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
К сожалению, это не работает. Я перепробовал все что угодно, но пока безуспешно. Кто-нибудь знает, как это сделать? Спасибо.
UPDATE
Исправленный код, на который отвечает ysth :
map {
$results->{$_}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
и улучшенная версия с меньшим количеством зубочисток , предложенная Sinan Ünür
map {
$results->{$_}{uri} =~ s{".*/(.*\.*(gif|jpe?g|png))"}{/resources/uploads/$1}gi
} keys %{$results};