هذا هو الأمر perllol الذي يمكن تشغيله في مزود الاستضافة المجانية OnWorks باستخدام إحدى محطات العمل المجانية المتعددة عبر الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت
برنامج:
اسم
perllol - معالجة صفائف المصفوفات في Perl
الوصف
إعلان استخدم of المصفوفات of المصفوفات
أبسط بنية بيانات ثنائية المستوى يتم إنشاؤها في Perl هي مصفوفة من المصفوفات أحيانًا
دعا عرضا قائمة القوائم. من السهل فهمها بشكل معقول ، وتقريباً
كل ما ينطبق هنا سيكون قابلاً للتطبيق لاحقًا مع بيانات مربي الحيوانات
الهياكل.
مصفوفة المصفوفة هي مجرد مصفوفة قديمة عاديةAoA يمكنك الحصول عليها باثنين
الاشتراكات ، مثل $ AoA [3] [2]. إليك إعلان عن المصفوفة:
استخدم 5.010 ؛ # لذلك يمكننا استخدام say ()
# تعيين لمصفوفة لدينا ، مجموعة من المراجع المصفوفة
AoA = (
["فريد" ، "بارني" ، "حصى" ، "بامبام" ، "دينو" ،] ،
["جورج" ، "جين" ، "إلروي" ، "جودي" ،] ،
["هومر" ، "بارت" ، "مارج" ، "ماجي" ،] ،
);
قل $ AoA [2] [1] ؛
بارت
الآن يجب أن تكون حريصًا جدًا على أن نوع القوس الخارجي هو شكل دائري ، أي أ
أقواس. هذا لأنك تقوم بتعيينarray ، لذا فأنت بحاجة إلى أقواس. لو
كنت تريد هناك ليس أن تكونAoA ، ولكن بالأحرى مجرد إشارة إليها ، يمكنك فعل ذلك
شيء أشبه بهذا:
# تعيين مرجع لمجموعة مراجع المصفوفة
ref_to_AoA دولار = [
["فريد" ، "بارني" ، "حصى" ، "بامبام" ، "دينو" ،] ،
["جورج" ، "جين" ، "إلروي" ، "جودي" ،] ،
["هومر" ، "بارت" ، "مارج" ، "ماجي" ،] ،
];
قل $ ref_to_AoA -> [2] [1] ؛
بارت
لاحظ أن نوع القوس الخارجي قد تغير ، وبالتالي تغيرت صيغة الوصول لدينا أيضًا.
هذا لأنه على عكس C ، في بيرل لا يمكنك تبادل المصفوفات والمراجع بحرية
لذلك. $ ref_to_AoA هو مرجع لمصفوفة بينماAoA هو مصفوفة مناسبة.
وبالمثل ، فإن $ AoA [2] ليس مصفوفة ، ولكنه مصفوفة مرجع. إذن كيف يمكنك كتابة هذه:
$ AoA [2] [2]
$ ref_to_AoA -> [2] [2]
بدلاً من الاضطرار إلى كتابة ما يلي:
$ AoA [2] -> [2]
$ ref_to_AoA -> [2] -> [2]
حسنًا ، هذا لأن القاعدة هي أنه على الأقواس المجاورة فقط (سواء كانت مربعة أو متعرجة) ،
أنت حر في حذف سهم إلغاء إشارة المؤشر. لكن لا يمكنك فعل ذلك من أجل الآخرين
الأول إذا كان عددًا يحتوي على مرجع ، مما يعني أن $ ref_to_AoA دائمًا
يحتاجها.
متزايد معلمتك اليوغا الخاصة
كل هذا جيد وجيد للإعلان عن بنية بيانات ثابتة ، ولكن ماذا لو أردت
لإضافة عناصر جديدة على الطاير ، أو إنشائها بالكامل من الصفر؟
أولاً ، دعنا نلقي نظرة على قراءته من ملف. هذا شيء مثل إضافة صف في أ
وقت. سنفترض أن هناك ملفًا ثابتًا يكون فيه كل سطر صفًا وكل كلمة
عنصر. إذا كنت تحاول تطوير مصفوفةAoA تحتوي على كل هذه ، فإليك الحق
طريقة للقيام بذلك:
بينما (<>) {
tmp = انقسام ؛
دفعAoA ، [tmp] ؛
}
ربما قمت أيضًا بتحميل ذلك من دالة:
مقابل $ i (1 .. 10) {
$ AoA [$ i] = [somefunc ($ i)]؛
}
أو ربما كان لديك متغير مؤقت يجلس مع المصفوفة فيه.
مقابل $ i (1 .. 10) {
tmp = somefunc ($ i) ؛
$ AoA [$ i] = [tmp] ؛
}
من المهم أن تتأكد من استخدام مُنشئ مرجع المصفوفة "[]". ذلك بسبب
هذا لن يعمل:
$ AoA [$ i] =tmp؛ # خطأ!
السبب في عدم قيامك بما تريد هو تعيين مصفوفة مسماة مثل ذلك إلى ملف
الحجمي يأخذ مصفوفة في سياق عددي ، مما يعني أن يحسب فقط عدد
العناصر فيtmp.
إذا كنت تعمل في ظل "استخدام صارم" (وإذا لم تكن كذلك ، فلماذا لست أنت في هذا العالم؟) ،
يجب عليك إضافة بعض التصريحات لجعلها سعيدة:
استخدام صارم
my (AoA،tmp) ؛
بينما (<>) {
tmp = انقسام ؛
دفعAoA ، [tmp] ؛
}
بالطبع ، لست بحاجة إلى أن يكون للمصفوفة المؤقتة اسم على الإطلاق:
بينما (<>) {
دفعAoA ، [انقسام] ؛
}
ليس عليك أيضًا استخدام ملفات إدفع(). يمكنك فقط إجراء مهمة مباشرة إذا كنت تعلم
حيث تريد وضعها:
my (AoA، $ i، $ line) ؛
مقابل $ i (0 .. 10) {
$ line = <> ؛
$ AoA [$ i] = [انقسام ""، $ line]؛
}
أو حتى فقط
my (AoA، $ i) ؛
مقابل $ i (0 .. 10) {
$ AoA [$ i] = [split ""، <>]؛
}
يجب أن تتوخى الحذر بشكل عام من استخدام الوظائف التي من المحتمل أن ترجع القوائم بتنسيق
سياق عددي دون النص صراحة على ذلك. سيكون هذا أوضح للعارضين
قارئ:
my (AoA، $ i) ؛
مقابل $ i (0 .. 10) {
$ AoA [$ i] = [انقسام "" ، سلمي (<>)] ؛
}
إذا أردت أن يكون لديك متغير ref_to_AoA كمرجع لمصفوفة ، فعليك القيام بذلك
شيء من هذا القبيل:
بينما (<>) {
push @ $ ref_to_AoA، [split]؛
}
الآن يمكنك إضافة صفوف جديدة. ماذا عن إضافة أعمدة جديدة؟ إذا كنت تتعامل فقط مع
المصفوفات ، غالبًا ما يكون من الأسهل استخدام مهمة بسيطة:
مقابل x دولار (1 .. 10) {
مقابل $ y (1 .. 10) {
$ AoA [$ x] [$ y] = func ($ x، $ y)؛
}
}
مقابل × دولار (3 ، 7 ، 9) {
$ AoA [$ x] [20] + = func2 ($ x)؛
}
لا يهم ما إذا كانت هذه العناصر موجودة بالفعل أم لا: سيتم إنشاؤها بكل سرور
لهم من أجلك ، وضبط العناصر المتداخلة على "undef" حسب الحاجة.
إذا كنت تريد فقط الإلحاق بصف ، فسيتعين عليك القيام بشيء أكثر تسلية:
# إضافة أعمدة جديدة إلى صف موجود
push @ {$ AoA [0]}، "wilma"، "betty"؛ # صريح deref
قبل Perl 5.14 ، لم يكن هذا حتى يجمع:
ادفع $ AoA [0]، "wilma"، "betty"؛ # deref ضمني
كيف ذلك؟ لأنه ذات مرة ، كانت الحجة ل إدفع() يجب أن تكون مجموعة حقيقية ، لا
مجرد إشارة إلى واحد. لم يعد هذا صحيحًا. في الواقع ، السطر المميز بعلامة "اشتقاق ضمني"
أعلاه يعمل بشكل جيد - في هذه الحالة - لفعل ما قام به الشخص الذي يقول صريح deref.
سبب قلتي "في هذه الحالة" هو ذلك فقط يعمل لأن $ AoA [0] بالفعل
عقد مرجع مصفوفة. إذا جربت ذلك على متغير غير محدد ، فستأخذ
استثناء. ذلك لأن الإسناد الضمني لن يؤدي أبدًا إلى التحفيزي التلقائي لملف غير محدد
غيّر الطريقة "@ {}" دائمًا:
عارفتي $ = undef؛
push $ aref، qw (بعض القيم الإضافية)؛ # خطأ!
push @ $ aref، qw (أكثر بقليل) ؛ # نعم
إذا كنت ترغب في الاستفادة من هذا السلوك الضمني الجديد لإلغاء الإشارة ، فتابع مباشرة:
يجعل الشفرة أسهل على العين والمعصم. فقط افهم أن الإصدارات القديمة ستختنق
عليه أثناء التجميع. كلما استفدت من شيء لا يعمل إلا في البعض
بالنظر إلى إصدار Perl وما بعده ، ولكن ليس قبل ذلك ، يجب أن تضع حرفًا بارزًا
استخدام v5.14 ؛ # مطلوب للاشتقاق الضمني لمراجع المصفوفة بواسطة عمليات المصفوفة
التوجيه في أعلى الملف الذي يحتاجه. بهذه الطريقة عندما يحاول شخص ما تشغيل
كود جديد تحت بيرل قديم ، بدلا من الحصول على خطأ مثل
يجب أن يكون نوع arg 1 المراد دفعه مصفوفة (وليس عنصر مصفوفة) عند / tmp / a سطر 8 بالقرب من "" betty "؛"
تم إحباط تنفيذ / tmp / a بسبب أخطاء في الترجمة.
سيتم إعلامهم بذلك بأدب
مطلوب Perl v5.14.0 - هذا الإصدار 5.12.3 فقط ، متوقف عند / tmp / a line 1.
فشل BEGIN - تم إحباط الترجمة عند / tmp / a line 1.
استخدم الطباعة
حان الوقت الآن لطباعة بنية البيانات الخاصة بك. كيف أنت ذاهب للقيام بذلك؟ حسنًا ، إذا
تريد عنصرًا واحدًا فقط ، فهذا تافه:
طباعة $ AoA [0] [0]؛
إذا كنت تريد طباعة كل شيء ، فلا يمكنك قول ذلك
طباعةAoA ؛ # خطأ
لأنك ستدرج المراجع فقط ، ولن يتم إلغاء مرجع perl تلقائيًا أبدًا
أشياء لك. بدلاً من ذلك ، عليك أن تدحرج لنفسك حلقة أو اثنتين. هذا يطبع كله
هيكل ، باستخدام نمط قذيفة ل() إنشاء حلقة عبر المجموعة الخارجية من
الاشتراكات.
عارف $ (AoA) {
قل "\ t [@ $ aref]،"؛
}
إذا كنت ترغب في تتبع النصوص ، فيمكنك القيام بذلك:
مقابل $ i (0 .. $ # AoA) {
قل "\ t elt $ i هو [@ {$ AoA [$ i]}]،"؛
}
أو ربما هذا. لاحظ الحلقة الداخلية.
مقابل $ i (0 .. $ # AoA) {
مقابل $ j (0 .. $ # {$ AoA [$ i]}) {
قل "elt $ i $ j هو $ AoA [$ i] [$ j]" ؛
}
}
كما ترى ، الأمر يصبح معقدًا بعض الشيء. هذا هو السبب في أنه من الأسهل أحيانًا أن تأخذ ملف
مؤقت في طريقك من خلال:
مقابل $ i (0 .. $ # AoA) {
$ aref = $ AoA [$ i] ؛
مقابل $ j (0 .. $ # {$ aref}) {
قل "elt $ i $ j هو $ AoA [$ i] [$ j]" ؛
}
}
حسنًا ... لا يزال هذا قبيحًا بعض الشيء. وماذا عن هذا:
مقابل $ i (0 .. $ # AoA) {
$ aref = $ AoA [$ i] ؛
$ n = @ $ aref - 1 ؛
مقابل $ j (0 .. $ n) {
قل "elt $ i $ j هو $ AoA [$ i] [$ j]" ؛
}
}
عندما تتعب من كتابة طباعة مخصصة لهياكل البيانات الخاصة بك ، قد تنظر إلى
Dumpvalue القياسي أو وحدات Data :: Dumper النمطية. السابق هو ما بيرل المصحح
يستخدم ، بينما يقوم الأخير بإنشاء كود Perl قابل للتحليل. على سبيل المثال:
استخدام v5.14 ؛ # باستخدام النموذج الأولي + ، الجديد في الإصدار 5.14
عرض فرعي (+) {
تتطلب Dumpvalue ؛
state $ prettily = new Dumpvalue ::
وضع علامة => q (") ،
CompactDump => 1 ، # علّق على هذين السطرين
veryCompact => 1، # إذا كنت تريد تفريغًا أكبر
;
dumpValue $ جميل_ ؛
}
# قم بتعيين قائمة بمراجع المصفوفة لمصفوفة.
myAoA = (
["فريد" ، "بارني"] ،
["جورج" ، "جين" ، "إلروي"] ،
["هومر" ، "مارج" ، "بارت"] ،
);
ادفع $ AoA [0]، "wilma"، "betty"؛
عرضAoA ؛
سوف تطبع:
0 0..3 "فريد" "بارني" "ويلما" "بيتي"
1 0..2 "جورج" "جين" "إلروي"
2 0..2 "هوميروس" "مارج" "بارت"
بينما إذا قمت بالتعليق على السطرين قلت إنك قد ترغب في ذلك ، فسيظهر ذلك لك
بهذه الطريقة بدلاً من ذلك:
0 مجموعة مصفوفة(0x8031d0)
0 "فريد"
1 "بارني"
2 "ويلما"
3 "بيتي"
1 مجموعة مصفوفة(0x803d40)
0 "جورج"
1 "جين"
2 "إلروي"
2 مجموعة مصفوفة(0x803e10)
0 "هوميروس"
1 "مارج"
2 "بارت"
شرائح
إذا كنت ترغب في الحصول على شريحة (جزء من صف) في مصفوفة متعددة الأبعاد ، فستقوم بذلك
يجب أن تفعل بعض الاكتتابات الفاخرة. هذا لأنه بينما لدينا مرادف لطيف لـ
عناصر مفردة عبر سهم المؤشر لإلغاء الإشارة ، لا توجد مثل هذه الملاءمة
شرائح.
إليك كيفية إجراء عملية واحدة باستخدام حلقة. سنفترض متغيرAoA كما كان من قبل.
@ جزء = () ؛
× دولار = 4 ؛
لـ ($ y = 7 ؛ $ y <13 ؛ $ y ++) {
pushpart، $ AoA [$ x] [$ y]؛
}
يمكن استبدال نفس الحلقة بعملية شريحة:
part = @ {$ AoA [4]} [7..12] ،
أو متباعدة قليلاً:
part = @ {$ AoA [4]} [7..12] ،
ولكن كما قد تتخيل جيدًا ، يمكن أن يصبح هذا قاسيًا جدًا على القارئ.
آه ، ولكن ماذا لو أردت ملف ثنائي الأبعاد شريحة، مثل تشغيل $ x من 4..8 و $ y
تشغيل من 7 إلى 12؟ حسنًا ... إليك الطريقة البسيطة:
newAoA = () ،
لـ ($ startx = $ x = 4؛ $ x <= 8؛ $ x ++) {
لـ ($ starty = $ y = 7؛ $ y <= 12؛ $ y ++) {
$ newAoA [$ x - $ startx] [$ y - $ starty] = $ AoA [$ x] [$ y]؛
}
}
يمكننا تقليل بعض الحلقات عبر الشرائح
لـ ($ x = 4؛ $ x <= 8؛ $ x ++) {
pushnewAoA، [@ {$ AoA [$ x]} [7..12]]؛
}
إذا كنت في Schwartzian Transforms ، فربما تكون قد حددت خريطة لذلك
newAoA = الخريطة {[@ {$ AoA [$ _]} [7..12]]} 4 .. 8 ؛
على الرغم من اتهامك مديرك بالسعي إلى الأمن الوظيفي (أو عدم الأمان السريع) من خلاله
رمز غامض ، سيكون من الصعب المجادلة. :-) لو كنت مكانك ، كنت سأضع ذلك في ملف
وظيفة:
newAoA = splice_2D (\AoA، 4 => 8، 7 => 12) ؛
لصق الفرعية_2 د {
lrr $ الخاص بي = التحول ؛ # المرجع لمجموعة من المراجع المصفوفة!
($ x_lo ، $ x_hi ،
$ y_lo ، $ y_hi) =_ ؛
عودة الخريطة {
[@ {$ lrr -> [$ _]} [$ y_lo .. $ y_hi]]
} $ x_lo .. $ x_hi؛
}
استخدم بيرلول عبر الإنترنت باستخدام خدمات onworks.net