Map ()를 사용하여 Perl의 해시의 각 요소에 작업을 적용하려면 어떻게합니까?
-
05-07-2019 - |
문제
잘 작동하는 코드가 있습니다. 기본적으로 사용 해시의 각 요소를 통해 고리 foreach()
SO와 같은 정규 표현식을 사용하여 변환을 적용합니다.
foreach my $key ( keys( %{$results} ) ) {
$results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}
$ 결과는 DBI의 Hashref Returnd입니다 fetchall_hashref()
기능.
호기심으로 인해 사용하여 다시 작성할 수 있는지보고 싶었습니다. map()
대신 아래 그림과 같이 :
map {
$results{$_}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
불행히도, 그것은 작동하지 않습니다. 나는 모든 종류의 것들을 시도했지만 지금까지 성공하지 못했습니다. 누구 든지이 작업을 수행하는 방법을 아는 사람이 있습니까? 감사.
업데이트
대답대로 수정 된 코드 ysth:
map {
$results->{$_}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi
} keys %{$results};
그리고 더 적은 개선 된 버전 기대어 이쑤시개 의 생각 시안 ünür
map {
$results->{$_}{uri} =~ s{".*/(.*\.*(gif|jpe?g|png))"}{/resources/uploads/$1}gi
} keys %{$results};
해결책
지도 버전에서 실수로 변경되었습니다 $results->{
에게 $results{
. ->를 다시 넣으면 작동해야합니다.
다른 팁
당신이 도망 갈 수 있다고 언급 할 가치가 있습니다.
$_->{uri} =~ s/foo/bar/ for values %$results;
이 경우. 데이터 구조에서 주위를 찌르는 것은 그것을 만드는 참조를 방해하지 않습니다.
두 번째 코드는 해시를 사용하지만 첫 번째 코드는 해시 참조를 사용합니다. 다음은 작동하는 것 같습니다.
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";
}
제휴하지 않습니다 StackOverflow