كيف يمكنني استخدام الخريطة() لتطبيق العملية إلى كل عنصر من عناصر التجزئة في بيرل?

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

سؤال

لدي قطعة من التعليمات البرمجية التي يعمل بشكل جيد.انها في الأساس الحلقات من خلال كل عنصر من عناصر التجزئة باستخدام foreach() وينطبق التحول إلى استخدام التعبير العادية مثل :

foreach my $key ( keys( %{$results} ) ) {
   $results->{$key}{uri} =~ s/\".*\/(.*\.*(gif|jpe?g|png))\"/\/resources\/uploads\/$1/gi;
}

نتائج $هو hashref returnd قبل DBI هو 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