PDL::QuickStartp - عبر الإنترنت في السحابة

هذا هو الأمر PDL::QuickStartp الذي يمكن تشغيله في موفر الاستضافة المجاني OnWorks باستخدام إحدى محطات العمل المجانية المتعددة عبر الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت

برنامج:

اسم


PDL::QuickStart - مقدمة سريعة لميزات PDL.

موجز


ملخص موجز لميزات PDL الرئيسية وكيفية استخدامها.

الوصف


المُقدّمة
تعد لغة Perl لغة برمجة نصية جيدة للغاية ومتعددة الاستخدامات، ومناسبة تمامًا للمبتدئين والمحترفين
يسمح بالنماذج الأولية السريعة. ولكن حتى وقت قريب لم يكن يدعم هياكل البيانات التي
سمح لها بإجراء معالجة سريعة للأرقام.

ولكن مع تطوير Perl v5، اكتسبت Perl "الكائنات". بكل بساطة المستخدمين
يمكنهم تحديد أنواع البيانات الخاصة بهم، وكتابة إجراءات مخصصة لمعالجتها
إما باللغات ذات المستوى المنخفض (C وFortran) أو بلغة Perl نفسها.

لقد تم استغلال هذا بالكامل من قبل مطوري PerlDL. وحدة "PDL" كاملة
امتداد كائني التوجه إلى Perl (على الرغم من أنك لا تحتاج إلى معرفة ما هو الكائن
استخدمه) والذي يسمح بمجموعات بيانات كبيرة ذات أبعاد N، مثل الصور الكبيرة والأطياف والوقت
سلسلة، الخ ليتم تخزينها بكفاءة والتلاعب بها en في الكتلة . على سبيل المثال مع PDL
يمكننا كتابة رمز Perl "$a = $b + $c"، حيث يكون $b و $c عبارة عن مجموعات بيانات كبيرة (على سبيل المثال
2048 × 2048 صورة)، واحصل على النتيجة في جزء من الثانية فقط.

تدعم متغيرات PDL (أو "piddles" كما أصبحت تُعرف) نطاقًا واسعًا من
أنواع البيانات الأساسية - يمكن أن تكون المصفوفات بايت، أو أعداد صحيحة قصيرة (موقعة أو غير موقعة)، أو طويلة
الأعداد الصحيحة أو العوامات أو العوامات ذات الدقة المزدوجة. وبسبب الطبيعة الشيئية لـ
ويمكن استخلاص أنواع البيانات المخصصة الجديدة لـ PDL منها.

بالإضافة إلى وحدات PDL، التي يمكن استخدامها بواسطة برامج Perl العادية، يأتي PerlDL مزودًا بـ
سطر الأوامر Perl Shell، المسمى "perldl"، والذي يدعم تحرير سطر الأوامر. في
بالاشتراك مع وحدات رسومات PDL المتنوعة، يتيح ذلك تشغيل البيانات بسهولة
مع وتصور.

المساعدة
يحتوي PDL على وثائق واسعة النطاق، وهي متاحة داخل كل من بيرلدل or pdl2 قذائف و
من سطر الأوامر باستخدام برنامج "pdldoc". لمزيد من المعلومات جرب أيًا من:

pdl> تعليمات المساعدة
$pdldoc

يجب أن تكون نسخ HTML من الوثائق متاحة أيضًا. للعثور على موقعهم، حاول
ما يلي:

pdl> foreach (map {"$ _ / PDL / HtmlDocs"} @ INC) {p "$ _ \ n" if -d $ _}

بيرل أنواع البيانات و كيف PDL يمتد هم
بنيات بيانات Perl الأساسية هي متغيرات عددية، على سبيل المثال $x، والتي يمكن أن تحتوي على أرقام
أو سلاسل أو قوائم أو صفائف من الكميات القياسية، على سبيل المثال @x، والمصفوفات/التجزئة من الكميات القياسية،
على سبيل المثال %x.

يقدم Perl v5 هياكل وكائنات بيانات Perl. المتغير العددي البسيط $x يكون الآن
نوع بيانات محدد من قبل المستخدم أو كائن كامل (يحتوي في الواقع على مرجع (ملف ذكي
"المؤشر") إلى هذا ولكن هذا ليس له صلة بالاستخدام العادي لـ perlDL)

الفكرة الأساسية وراء PerlDL هي السماح لـ $x بالاحتفاظ بطيف أحادي الأبعاد بالكامل أو ثنائي الأبعاد
صورة، ومكعب بيانات ثلاثي الأبعاد، وما إلى ذلك حتى مجموعات بيانات كبيرة ذات أبعاد N. يمكن أن تكون هذه
يتم التعامل معها مرة واحدة، على سبيل المثال، يقوم "$a = $b + 2" بإجراء عملية متجهة على كل قيمة في
الطيف/الصورة/الخ.

قد تسأل: "لماذا لا نقوم فقط بتخزين الطيف كقائمة أنماط Perl@x بسيطة مع كل منها
بكسل هو عنصر قائمة؟" الإجابتان الرئيسيتان لهذا هما ذاكرة و سرعة. لأننا
أعلم أن طيفنا يتكون من أرقام نقية يمكننا تخزينها بشكل مضغوط في كتلة واحدة
من الذاكرة المقابلة لمصفوفة رقمية بنمط C. وهذا يستغرق ذاكرة أقل بكثير من
قائمة بيرل المكافئة. ومن ثم يصبح من السهل تمرير كتلة الذاكرة هذه إلى إضافة سريعة
روتين، أو إلى أي وظيفة C أخرى تتعامل مع المصفوفات. ونتيجة لذلك، فإن PerlDL للغاية
سريع --- على سبيل المثال يمكن مضاعفة صورة بحجم 2048*2048 في نفس الوقت تمامًا
سوف يستغرق C أو FORTRAN (0.1 ثانية على SPARC الخاص بي). ميزة أخرى لهذا هو أن
العمليات البسيطة (على سبيل المثال "$x += 2") يمكن للمرء التعامل مع المصفوفة بأكملها دون الاهتمام بها
أبعادها.

أجد عند استخدام perlDL أنه من المفيد جدًا التفكير في متغيرات Perl @x القياسية على أنها
"قوائم" "الأشياء" العامة ومتغيرات PDL مثل $x باعتبارها "مصفوفات" يمكن احتواؤها
في القوائم أو التجزئة. في كثير من الأحيان، في نصوص perlDL الخاصة بي، يكون @x يحتوي على قائمة من الأطياف،
أو قائمة الصور (أو حتى مزيج!). أو ربما يمكن للمرء الحصول على تجزئة (على سبيل المثال %x) لـ
الصور... الحد الوحيد هو الذاكرة!

تدعم متغيرات perlDL نطاقًا واسعًا من أنواع البيانات - يمكن أن تكون المصفوفات عبارة عن بايتات وأعداد صحيحة قصيرة
(موقعة أو غير موقعة)، أعداد صحيحة طويلة، عوامات أو عوامات مزدوجة الدقة.

الأستعمال
يتم تحميل PerlDL في البرنامج النصي Perl الخاص بك باستخدام هذا الأمر:

استخدام بدل؛ # في برامج Perl النصية: استخدم وحدات PerlDL القياسية

هناك أيضًا الكثير من وحدات الامتداد، على سبيل المثال PDL::Graphics::TriD. معظمهم (لكن
ليس كل شيء كما هو الحال في بعض الأحيان ليس من المناسب) اتباع اتفاقية قياسية. إذا قلت:

استخدم PDL::Graphics::TriD;

يمكنك استيراد كل شيء في القائمة القياسية من الوحدة. في بعض الأحيان قد ترغب في ذلك
لا تستورد شيئًا (على سبيل المثال، إذا كنت تريد استخدام صيغة OO طوال الوقت وحفظ ضريبة الاستيراد).
ولهؤلاء تقول:

استخدم PDL::Graphics::TriD qw();

ويتم التعرف على علامات الاقتباس الفارغة "qw()" على أنها تعني "لا شيء". يمكنك أيضًا تحديد أ
قائمة الوظائف المراد استيرادها بطريقة بيرل العادية.

هناك أيضًا غلاف تفاعلي، "Perldl" أو "pdl2"، انظر بيرلدل أو pdl2 للحصول على التفاصيل.

إلى خلق a جديد PDL متغير
فيما يلي بعض الطرق لإنشاء متغير PDL:

$a = بدل [1..10]; # مصفوفة 1D
$a = بدل (1,2,3,4); # كما سبق
$a = pdl '[1 2 3 4]'; # كما سبق
$b = بدل [[1,2,3],[4,5,6]]; # مصفوفة ثنائية الأبعاد 2 × 3
$b = pdl '[1 2 3; 4 5 6]'; # كما سبق
$b = بدل ف[1,2,3; 4,5,6،XNUMX،XNUMX]؛ # كما سبق
$ب = بدل <
[1]
[4]
NEWPDL
$c = بدل q[1 -2]; # لغز مكون من عنصرين يحتوي على 2 و -1
$c = بدل q[1 - 2]; # لغز مكون من عنصرين يحتوي على 2 و -1
$b = pdl 42 # 0 عددي الأبعاد
$c = بدل $a; # عمل نسخة جديدة

$d = بايت [1..10]; # راجع "تحويل النوع"
$e = أصفار(3,2,4); # 3x2x4 مصفوفة خالية من الصفر

$c = rfits $file; # قراءة الملف المناسب

@س = ( PDL(42)، أصفار (3,2,4،XNUMX،XNUMX)، rfits($file) ); # هي قائمة متغيرات PDL!

بدل () يتم استخدام الدالة لتهيئة متغير PDL من قائمة أو قائمة أو قائمة
مرجع أو متغير PDL آخر أو سلسلة منسقة بشكل صحيح.

بالإضافة إلى ذلك، تقوم جميع وظائف PDL تلقائيًا بتحويل كميات Perl العادية إلى متغيرات PDL
على الطاير.

(راجع أيضًا قسمي "تحويل النوع" و"الإدخال/الإخراج" أدناه)

علم الحساب منطقية التعبيرات)
$أ = $ب + 2؛ $ا++; $a = $b / $c; # إلخ.

$c=sqrt($a); $d = log10($b+100); # إلخ

$e = $a>42; # ناقلات مشروطة

$e = 42*($a>42) + $a*($a<=42); # كاب الأعلى

$b = $a->log10 ما لم يكن هناك ($a <= 0); # تجنب خطأ النقطة العائمة

$a = $a / ( الحد الأقصى($a) - الحد الأدنى($a) );

$f = حيث($a, $a > 10); # حيث يتم إرجاع مجموعة من العناصر لـ
# أي أن الشرط صحيح

طباعة $أ؛ # $a في سياق السلسلة يطبعها بتنسيق N-الأبعاد

(والمشغلين/الوظائف الأخرى لـ Perl)

عند استخدام التلاعبات في التعبيرات الشرطية (على سبيل المثال، بنيات "if" و"ما لم" و"while")
يُسمح فقط بالألعاب التي تحتوي على عنصر واحد بالضبط، على سبيل المثال

$a = بدل (1,0,0,1);
اطبع "تم تعيينه" إذا كان $a->مؤشر(2)

لاحظ أن العوامل المنطقية تُرجع بشكل عام ألعابًا متعددة العناصر. لذلك،
التالية سوف تثير خطأ

اطبع "على ما يرام" إذا كان $a > 3;

نظرًا لأن "$a > 3" عبارة عن لغز يحتوي على 4 عناصر. بدلاً من ذلك، استخدم الكل أو أي لاختبار ما إذا كان كل أو أي منها
العناصر تحقق الشرط:

اطبع "البعض > 3" إن وجد $a>3;
طباعة "لا يمكن أخذ اللوغاريتم" إلا إذا كان كل شيء $a>0;

هناك أيضًا العديد من الوظائف المحددة مسبقًا والموضحة في صفحات الدليل الأخرى. يفحص
PDL :: الفهرس.

مصفوفة وظائف
يتم اختطاف 'x' كمشغل ضرب المصفوفة. على سبيل المثال "$c = $ax $b";

PerlDL هو الصف الرئيسي وليس العمود الرئيسي لذلك هذا هو في الواقع "c(i,j) = sum_k a(k,j) b(i,k)" -
ولكن عندما تتم طباعة المصفوفات فإن النتائج سوف تبدو صحيحة. فقط تذكر أن المؤشرات هي
عكس. على سبيل المثال:

$أ = [ $ب = [
[ 1 2 3 0] [1 1]
[ 1 -1 2 7] [0 2]
[ 1 0 0 1] [0 2]
] [1 1]
]

يعطي $ج = [
[ 1 11 ]
[ 8 10 ]
[ 2 2 ]
]

ملحوظة: تبديل موضع() يفعل ما يقوله وهو وسيلة ملائمة لتحويل ناقلات الصف إلى
ناقلات العمود

كيفية إلى اكتب a بسيط وظيفة
منتج النقطة الفرعية {
بلدي ($a,$b) = @_;
مبلغ الإرجاع($a*$b) ؛
}
1;

إذا تم وضعه في الملف dotproduct.pdl فسيتم تحميله تلقائيًا إذا كنت تستخدم PDL::AutoLoader (انظر
أدناه).

بالطبع، هذه الوظيفة متاحة بالفعل كوظيفة داخلية، راجع PDL::Primitive.

النوع تحويل
افتراضي لـ بدل () مزدوج. التحويلات هي:

$a = تعويم($b);
$c = طويل($d); # "طويل" بشكل عام هو 4 بايت
$d = بايت($a);

أيضا مزدوج(), قصير(), قصيرة (), مؤشر ().

ملاحظة: روتين indx() هو نوع عدد صحيح خاص
هو الحجم الصحيح لقيمة فهرس PDL (حجم البعد،
فهرس أو offest) والذي يمكن أن يكون إما 32 بت (طويل) أو
كمية 64 بت (طويلة) اعتمادًا على ما إذا كان ملف Perl
تم تصميمه بدعم 32 بت أو 64 بت.

تعمل هذه الإجراءات أيضًا على تحويل قوائم Perl تلقائيًا للسماح بالاختصار المناسب:

$a = بايت [[1..10],[1..10]]; # إنشاء مجموعة بايت ثنائية الأبعاد
$a = تعويم [1..1000]؛ # إنشاء مجموعة عائمة 1D

وما إلى ذلك.

الطباعة
يقوم بتوسيع المصفوفة تلقائيًا بتنسيق N-الأبعاد:

طباعة $أ؛

$b = "الإجابة هي = $a";

لإعادة التشكيل
تتمتع PDL بمشغلات تقطيع وتقطيع قوية جدًا ومتعددة الأبعاد؛ انظر
بدل::شرائح(3) صفحة الرجل للحصول على التفاصيل؛ سنصف أهمها هنا.

يُظهر PDL تراث Perl/C الخاص به حيث تكون المصفوفات ذات إزاحة صفرية. وبالتالي فإن الصورة 100x100 لها
المؤشرات "0..99,0..99". (الاتفاقية هي أن مركز البكسل (0,0) عند الإحداثيات
(0.0,0.0). تتوافق جميع وظائف رسومات PDL مع هذا التعريف وتخفي الوحدة
إزاحات، على سبيل المثال، مكتبة PGPLOT FORTRAN.

يتم عرض إحداثيات الاتفاقية المعتادة (0,0،XNUMX) في أسفل اليسار عندما
عرض صورة. يظهر في أعلى اليسار عند استخدام ""print $a"" وما إلى ذلك.

يستخدم التقسيم البسيط ملحق بناء الجملة لـ Perl، PDL::NiceSlice، الذي يسمح لك بذلك
تحديد النطاقات الفرعية عبر معدّل الأسلوب الخالي إلى PDL:

$b = $a->($x1:$x2,$y1:$y2,($z1)); # خذ القسم الفرعي

هنا $a هو متغير ثلاثي الأبعاد، ويحصل $b على قطع مستوي يتم تعريفه بواسطة
حدود $x1، $x2، $y1، $y2، في الموقع $z1. القوسين حول $z1 يسببان
يجب حذف مؤشر تافه - وإلا فسيكون $b ثلاثي الأبعاد مع ثالث
البعد من النظام 1.

يمكنك وضع شرائح PDL على جانبي عامل التعيين حسب العناصر ".="، مثل
الشمس:

# قم بتعيين جزء من $bigimage على القيم من $smallimage
$bigimage->($xa:$xb,$ya:$yb) .= $smallimage;

بعض المتنوعات الأخرى:

$c = نيليم($a); # عدد البكسل

$val = at($object, $x,$y,$z...) # قيمة البكسل في الموضع، كمقياس بيرل
$val = $object->at($x,$y,$z...) # مكافئ (بناء جملة الطريقة موافق)

$b = xvals($a); # املأ المصفوفة بقيم تنسيق X (أيضًا yvals() وzvals() و
# axisvals($x,$axis) وrvals() للمسافة الشعاعية
#من المركز).

الإدخال / الإخراج
تنفذ وحدات "PDL::IO" العديد من وظائف تنسيق IO المفيدة. سيكون أكثر من اللازم
لإعطاء أمثلة على كل منها، ولكن يمكنك العثور على نظرة عامة لطيفة على PDL::IO. هنا عينة من
بعض تنسيقات IO المدعومة في PDL.

PDL::IO::متفرقات
إجراءات Ascii وFITS وFIGARO/NDF IO.

PDL::IO::FastRaw
باستخدام أنواع البيانات الأولية لجهازك، يتم إدخال/إخراج غير قابل للنقل ولكنه سريع للغاية
شكل. يدعم أيضًا تعيين الذاكرة للحفاظ على الذاكرة وكذلك الحصول على المزيد من السرعة.

PDL::IO::FlexRaw
تنسيقات البيانات الأولية العامة مثل FastRaw، فقط أفضل.

PDL::IO::Browser
متصفح لعنات للمصفوفات.

PDL::IO::Pnm
Portaple دعم الصور النقطية والصور البكسلية.

PDL::IO::Pic
باستخدام الوحدة السابقة وnetpbm، يصبح من الممكن كتابة ملفات GIF وjpeg بسهولة
وأي شيء بأوامر بسيطة.

رسومات
الفلسفة وراء PerlDL هي جعله يعمل مع مجموعة متنوعة من الرسومات الموجودة
المكتبات لأنه لا توجد حزمة واحدة سوف تلبي جميع الاحتياجات وجميع الأشخاص وهذا يسمح
واحد للعمل مع الحزم التي يعرفها ويحبها بالفعل. ومن الواضح أنه سيكون هناك بعض
التداخل في الوظائف وبعض الافتقار إلى الاتساق والتوحيد. لكن هذا يسمح
PDL لمواكبة مجال سريع التطور - توفر أحدث وحدات PDL واجهات
إلى رسومات OpenGL وVRML!

PDL::الرسومات::PGPLOT
يوفر PGPLOT مكتبة بسيطة للرسومات الخطية وعرض الصور.

توجد واجهة سهلة لذلك في الوحدة الداخلية PDL::Graphics::PGPLOT، والتي
إجراءات المكالمات في وحدة المستوى الأعلى PGPLOT المتوفرة بشكل منفصل.

PDL::الرسومات::PLplot
يوفر PLplot مكتبة بسيطة لإنشاء الرسومات باستخدام برامج تشغيل إخراج متعددة،
بما في ذلك سائق مباشر إلى الكمان.

توفر هذه الوحدة وظائف عالية المستوى ومنخفضة المستوى مبنية على PLplot. ال
الأوامر ذات المستوى المنخفض هي إلى حد كبير ارتباطات مباشرة بواجهة C الخاصة بـPLplot. اقرأ أكثر
في PDL::Graphics::PLplot.

PDL::الرسومات::IIS
يحب العديد من علماء الفلك استخدام SAOimage وXimtool (أو هناك اشتقاقات/نسخ). هؤلاء
هي عناصر واجهة مستخدم مجانية مفيدة لفحص الصور وتصورها. (هم ليسوا
يتم توفيرها مع perlDL ولكن يمكن الحصول عليها بسهولة من مواقعها الرسمية خارج نطاق
شبكة.)

تسمح حزمة PDL::Graphics::IIS بعرض الصور في هذه ("IIS"
هو اسم عنصر قديم من أجهزة عرض الصور التي تستخدم هذه الأدوات بروتوكولاتها
تتفق مع.)

PDL::الرسومات::TriD
راجع PDL::Graphics::TriD، هذه مجموعة من الإجراءات ثلاثية الأبعاد لبرنامج OpenGL و(قريبًا)
VRML وتنسيقات ثلاثية الأبعاد أخرى تسمح برسم النقاط والخطوط والسطحات ثلاثية الأبعاد من PDL.

التحميل التلقائي
راجع PDL::AutoLoader. وهذا يسمح للمرء بالتحميل التلقائي للوظائف عند الطلب، بطريقة ربما
مألوفة لمستخدمي MatLab.

يمكن للمرء أيضًا كتابة امتدادات PDL كوحدات Perl عادية.

PDL قذائف
يوفر البرنامج النصي Perl "pdl2" (أو "perldl") واجهة سطر أوامر بسيطة لـ PDL. لو
أحدث وحدات Readlines/ReadKey التي تم تثبيتها، يكتشف "pdl2" ذلك ويمكّنه
استدعاء سطر الأوامر وتحريره. راجع صفحة الرجل للحصول على التفاصيل.

على سبيل المثال:

% بيردل
بيرلدل شل v1.354
PDL يأتي مع أي ضمان على الإطلاق. لمزيد من التفاصيل ، انظر الملف
"نسخ" في توزيع PDL. هذا برنامج مجاني وأنت
مدعوون لإعادة توزيعها في ظل ظروف معينة ، انظر
نفس الملف للحصول على التفاصيل.
تم تمكين ReadLines وNiceSlice وMultiLines
قراءة PDL/default.perldlrc...
تم العثور على قاعدة بيانات المستندات /home/pdl/dev/lib/perl5/site_perl/PDL/pdldoc.db
اكتب "تعليمات" للحصول على المساعدة عبر الإنترنت
اكتب "demo" للعروض التوضيحية عبر الإنترنت
تم تحميل PDL v2.4.9_003 (يدعم القيم السيئة)
pdl> $x = rfits 'm51.fits'
جارٍ قراءة بيانات الصورة...
BITPIX = حجم 32 = 147456 بكسل
قراءة 589824 بايت
BSCALE = && BZERO =

pdl> استخدم PDL::Graphics::PGPLOT;
pdl> الصورة $x
عرض صورة مقاس 384 × 384 من 40 إلى 761 باستخدام 84 لونًا (16-99)...

يمكنك أيضًا تشغيله من مصحح أخطاء Perl ("Perl -MPDL -d -e 1") إذا كنت تريد ذلك.

ميزات القشرة المتنوعة:

p الأسماء المستعارة لـ Shell هي "p" لتكون شكلاً قصيرًا مناسبًا لكلمة "print"، على سبيل المثال

pdl> ف واحد 5,3،XNUMX
[
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
]

التهيئة
الملفات "~ / .perldlrc"و"local.perldlrc" (في الدليل الحالي) يتم الحصول عليهما من مصادر if
وجد. يتيح ذلك للمستخدم الحصول على رمز PDL العالمي والمحلي لبدء التشغيل.

المساعدة
اكتب "مساعدة"! يمكن للمرء البحث في وثائق PDL، والبحث عن الوثائق على أي منها
وظيفة.

هرب
يتم التعامل مع أي سطر يبدأ بالحرف "#" على أنه هروب من الصدفة. هذه الشخصية
قابل للتكوين عن طريق تعيين متغير Perl $PERLDL_ESCAPE. وهذا يمكن، على سبيل المثال،
سيتم تحديدها في "~ / .perldlrc".

الزائد مشغلي
تم تحميل مشغلي ووظائف Perl المضمنة التالية بشكل زائد للعمل على PDL
المتغيرات:

+ - * / > < >= <= << >> & | ^ == != <=> ** % ! ~
سجل الخطيئة abs atan2 sqrt cos exp

[يمكن استخدام جميع الوظائف الأحادية (الخطيئة وما إلى ذلك) مع في المكان() - انظر "الذاكرة" أدناه.]

اتجاه الكائن و بيرلDL
تتوفر عمليات PDL كوظائف وطرق. وهكذا يمكن استخلاص أنواع جديدة من
كائن، لتمثيل فئات البيانات المخصصة.

باستخدام التحميل الزائد يمكن للمرء أن يجعل العوامل الرياضية تفعل ما يحلو لك، وPDL
يحتوي على بعض الحيل المضمنة التي تسمح لوظائف PDL الحالية بالعمل دون تغيير، حتى لو كان
تم تغيير تمثيل البيانات الأساسية إلى حد كبير! راجع PDL::Objects

مكبر الصوت : يدعم، مع دعم ميكروفون مدمج لمنع الضوضاء استعمال و المراجع
قد يتطلب العبث بمصفوفات البيانات الضخمة حقًا بعض العناية. يوفر PerlDL العديد من
التسهيلات التي تتيح لك تنفيذ العمليات على صفائف كبيرة دون إنشاء نسخ إضافية
على الرغم من أن هذا يتطلب المزيد من التفكير والعناية من المبرمج.

ملحوظة: في بعض الأنظمة، من الأفضل تكوين Perl (أثناء خيارات الإنشاء) على ذلك
استخدم وظيفة النظام "malloc()" بدلاً من وظيفة Perl المضمنة. وذلك لأن بيرل
تم تحسين أحدهما للسرعة بدلاً من استهلاك الذاكرة الافتراضية - وقد يؤدي ذلك إلى
عامل من اثنين هو التحسن في مقدار مساحة تخزين الذاكرة التي يمكنك استخدامها. لغة بيرل
يحتوي الإصدار 5.004 والإصدارات الأحدث على عدد من خيارات وقت الترجمة التي يمكنك استخدامها لضبط
سلوك.

عملية حسابية بسيطة
إذا كان $a عبارة عن صورة كبيرة (على سبيل المثال، تشغل 10 ميجابايت)، فسيتم الأمر

$a = $a + 1;

يستهلك 10 ميغابايت أخرى من الذاكرة. وذلك لأن التعبير "$a+1" ينشئ ملفًا
نسخة مؤقتة من $a للاحتفاظ بالنتيجة، ثم يتم تعيين مرجع لذلك $a.
بعد ذلك، يتم تدمير $a الأصلي، لذا لا يوجد دائم نفايات الذاكرة. ولكن على
آلة صغيرة، يمكن أن يكون النمو في بصمة الذاكرة كبيرًا. إنها
من الواضح أنه تم بهذه الطريقة حتى يعمل "$c=$a+1" كما هو متوقع.

وكذلك إذا قال قائل:

$ب = $أ؛ # يشير $b و$a الآن إلى نفس البيانات
$a = $a + 1;

ثم يصبح $b و$a مختلفين، كما يتوقع المرء بسذاجة، بسبب مرجع جديد
تم إنشاؤه وتم تخصيص $a له.

ومع ذلك، إذا كان $a يمثل استهلاكًا كبيرًا للذاكرة (على سبيل المثال، مجلد ثلاثي الأبعاد)، فقد لا يكون إنشاء نسخة منه أمرًا ممكنًا
يكون شيئا جيدا. يمكن للمرء تجنب هذا الحمل الزائد للذاكرة في المثال أعلاه بقول:

$ا++;

العمليات "++،+=،--،-="، وما إلى ذلك، كلها تستدعي إصدارًا خاصًا "في المكان" من
الروتين الفرعي الحسابي. وهذا يعني عدم الحاجة إلى مزيد من الذاكرة - وهذا هو الجانب السلبي
أنه إذا كان "$b=$a" فسيتم زيادة $b أيضًا. لفرض نسخة بشكل صريح:

$b = بدل $a; #نسخة حقيقية

أو، بدلاً من ذلك، ربما أسلوب أفضل:

$b = $a->نسخ;

وظائف
معظم الوظائف، على سبيل المثال "log()"، ترجع نتيجة عبارة عن تحويل لوظائفها
دعوى. وهذا يجعل ممارسة البرمجة جيدة. ولكن العديد من العمليات يمكن أن تكون
يتم ذلك "في مكانه" وقد يكون ذلك مطلوبًا عند استخدام صفائف كبيرة وتكون الذاكرة في وضع التشغيل
قسط. في هذه الظروف المشغل في المكان() يتم توفيرها مما يمنع
النسخة الإضافية ويسمح بتعديل الوسيطة. على سبيل المثال:

$x = سجل($صفيف); # $صفيف لم يتأثر
تسجيل( inplace($bigarray)); تم تغيير # $bigarray في الموقع

الانذارات:

1. تنطبق التحذيرات المعتادة بشأن المراجع المكررة.

2. من الواضح أنه عند استخدامه مع بعض الوظائف التي لا يمكن تطبيقها في الموقع (على سبيل المثال
"convolve()") قد تحدث تأثيرات غير متوقعة! نحن نحاول الإشارة إلى "inplace ()" - آمن
وظائف في الوثائق.

3. قد تؤدي تحويلات النوع، مثل "float()"، إلى نسخ مخفي.

ضمان عبث
إذا كنت قد كتبت وظيفة بسيطة ولا تريد أن تنفجر في وجهك إذا كنت
قم بتمريره رقمًا بسيطًا بدلاً من متغير PDL. ما عليك سوى استدعاء الوظيفة توبدل () أول
لجعلها آمنة. على سبيل المثال:

sub myfiddle { my $pdl = topdl(shift); $pdl->fiddle_foo(...); ... }

لا يقوم "topdl()" بإجراء نسخة إذا تم تمرير متغير pdl - فهو يسقط فقط -
ومن الواضح أن هذا هو السلوك المطلوب. الروتين ليس ضروريًا بالطبع في الوضع الطبيعي
وظائف يحددها المستخدم والتي لا تهتم بالداخلية.

استخدم PDL::QuickStartp عبر الإنترنت باستخدام خدمات onworks.net



أحدث برامج Linux و Windows عبر الإنترنت