ما هو الفرق بين مرجع التجزئة والتجزئة في بيرل؟
-
08-07-2019 - |
سؤال
أود أن أفهم التجزئة بشكل صحيح في بيرل. اضطررت إلى استخدام Perl بشكل متقطع لبعض الوقت وفي الغالب كلما احتجت إلى القيام بذلك ، فإنه يرتبط في الغالب بمعالجة النصوص.
وفي كل مرة ، يجب أن أتعامل مع التجزئة ، فإنه يفسد. أجد بناء الجملة خفيًا جدًا للتجزئة
التفسير الجيد للتجزئة ومراجع التجزئة ، واختلافاتها ، عندما تكون مطلوبة وما إلى ذلك سيكون موضع تقدير كبير.
المحلول
تجزئة بسيطة قريب من صفيف. تهيئاتهم تبدو متشابهة. أولا الصفيف:
@last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
الآن دعونا نمثل نفس المعلومات مع تجزئة (AKA AKA Consipiurive Array):
%last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
على الرغم من أن لديهم نفس الاسم ، المصفوفة @last_name
والتجزئة %last_name
مستقلة تماما.
مع المصفوفة ، إذا أردنا أن نعرف الاسم الأخير لأرتشي ، يتعين علينا إجراء بحث خطي:
my $lname;
for (my $i = 0; $i < @last_name; $i += 2) {
$lname = $last_name[$i+1] if $last_name[$i] eq "Archie";
}
print "Archie $lname\n";
مع التجزئة ، إنه أكثر بناءًا:
print "Archie $last_name{Archie}\n";
لنفترض أننا نريد تمثيل المعلومات بهيكل أكثر ثراءً فقط:
- Cleaver (الاسم الأخير)
- جناح (الاسم الأول)
- يونيو (الاسم الأول للزوج)
- فلينتستون
- فريد
- ويلما
- مخبأ
- أرشي
- إديث
قبل أن تأتي المراجع ، كانت تجزئة قيمة المفاتيح المسطحة حول أفضل ما يمكننا القيام به ، لكن المراجع تسمح
my %personal_info = (
"Cleaver", {
"FIRST", "Ward",
"SPOUSE", "June",
},
"Flintstone", {
"FIRST", "Fred",
"SPOUSE", "Wilma",
},
"Bunker", {
"FIRST", "Archie",
"SPOUSE", "Edith",
},
);
داخليا ، مفاتيح وقيم %personal_info
كلها منتشرة ، لكن القيم هي نوع خاص من العددية: مراجع التجزئة ، التي تم إنشاؤها مع {}
. تتيح لنا المراجع محاكاة تجزئة "متعددة الأبعاد". على سبيل المثال ، يمكننا الوصول إلى ويلما عبر
$personal_info{Flintstone}->{SPOUSE}
لاحظ أن Perl يسمح لنا بحذف الأسهم بين الاشتراكات ، وبالتالي فإن ما سبق يعادل
$personal_info{Flintstone}{SPOUSE}
هذا كثير من الكتابة إذا كنت تريد معرفة المزيد عن فريد ، لذلك يمكنك الحصول على إشارة إلى نوع من المؤشر:
$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";
لان $fred
في المقتطف أعلاه هو hashref ، السهم ضروري. إذا تركت الأمر ولكن تم تمكينه بحكمة use strict
لمساعدتك في التقاط هذه الأنواع من الأخطاء ، سوف يشكو المترجم:
Global symbol "%fred" requires explicit package name at ...
تشبه مراجع Perl المؤشرات في C و C ++ ، لكنها لا يمكن أن تكون لاغية أبدًا. تتطلب المؤشرات في C و C ++ إزالة الإخلاء وكذلك المراجع في Perl.
تحتوي معلمات وظيفة C و C ++ على دلالات مرور على أساس القيمة: إنها مجرد نسخ ، لذلك لا تعود التعديلات إلى المتصل. إذا كنت تريد رؤية التغييرات ، فيجب عليك تمرير مؤشر. يمكنك الحصول على هذا التأثير مع المراجع في بيرل:
sub add_barney {
my($personal_info) = @_;
$personal_info->{Rubble} = {
FIRST => "Barney",
SPOUSE => "Betty",
};
}
add_barney \%personal_info;
بدون انتشار الخلفي ، add_barney
كان من شأنه أن يحصل على نسخة تم إلقاؤها بمجرد عودة الفرعية.
لاحظ أيضًا استخدام "فاصلة الدهون" (=>
) في الاعلى. إنها تلقائيات الأوتوماتيكية على اليسار وتجعل تهيئة التجزئة أقل صاخبة.
نصائح أخرى
يوضح ما يلي كيف يمكنك استخدام علامة تجزئة وتجزئة:
my %hash = (
toy => 'aeroplane',
colour => 'blue',
);
print "I have an ", $hash{toy}, " which is coloured ", $hash{colour}, "\n";
my $hashref = \%hash;
print "I have an ", $hashref->{toy}, " which is coloured ", $hashref->{colour}, "\n";
انظر أيضا Perldoc perldsc.
التجزئة هو نوع بيانات أساسي في Perl. يستخدم مفاتيح للوصول إلى محتوياتها.
مرجع التجزئة هو اختصار للإشارة إلى تجزئة. المراجع هي القياس ، وهذا هو قيم بسيطة. إنها قيمة قياسية تحتوي بشكل أساسي على مؤشر إلى التجزئة الفعلية نفسها.
نهاية لهذه الغاية: الفرق بين Hash و Hash Ref في Perl - Obuntu Forums
الفرق هو أيضا في بناء الجملة للحذف. مثل C ، يعمل Perl مثل هذا من أجل التجزئة:
delete $hash{$key};
ومراجع التجزئة
delete $hash_ref->{$key};
ال بيرل هاش Howto هو مورد رائع لفهم التجزئة مقابل التجزئة مع مراجع التجزئة
هناك أيضًا رابط آخر هنا لديه المزيد من المعلومات حول Perl والمراجع.
نرى Perldoc perlreftut يمكن الوصول إليها أيضًا على سطر أوامر الكمبيوتر الخاص بك.
المرجع هو قيمة القياسية التي تشير إلى صفيف كامل أو تجزئة كاملة (أو إلى أي شيء آخر فقط). الأسماء هي نوع واحد من المرجع الذي كنت على دراية به بالفعل. فكر في رئيس الولايات المتحدة: كيس من الدم والعظام غير المريح. ولكن للحديث عنه ، أو لتمثيله في برنامج كمبيوتر ، كل ما تحتاجه هو السلسلة القياسية السهلة والمريحة "Barack Obama".
المراجع في Perl تشبه أسماء المصفوفات والتجزئة. إنها أسماء بيرل الداخلية الخاصة ، بحيث يمكنك التأكد من أنها لا لبس فيها. على عكس "باراك أوباما" ، تشير إشارة فقط إلى شيء واحد ، وأنت تعرف دائمًا ما يشير إليه. إذا كان لديك إشارة إلى صفيف ، فيمكنك استعادة الصفيف بالكامل منه. إذا كان لديك إشارة إلى علامة تجزئة ، فيمكنك استرداد التجزئة بأكملها. لكن المرجع لا يزال قيمة قياسية سهلة ومدمجة.