كيف يمكنني استخدام الخريطة() لتطبيق العملية إلى كل عنصر من عناصر التجزئة في بيرل?
-
05-07-2019 - |
سؤال
لدي قطعة من التعليمات البرمجية التي يعمل بشكل جيد.انها في الأساس الحلقات من خلال كل عنصر من عناصر التجزئة باستخدام 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";
}