Map ()를 사용하여 Perl의 해시의 각 요소에 작업을 적용하려면 어떻게합니까?

StackOverflow https://stackoverflow.com/questions/1605128

문제

잘 작동하는 코드가 있습니다. 기본적으로 사용 해시의 각 요소를 통해 고리 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";
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top