سؤال

أحاول فقط تقصير سطر من التعليمات البرمجية الذي يعين HTML::Element->as_trimmed_text من مجموعة من HTML::Elements لبعض المتغيرات - أشياء قياسية جدًا مثل:

my ($var1, var2) = ($columns[1]->as_trimmed_text, $columns[2]->as_trimmed_text);

..باستثناء أن هناك عددًا قليلاً من الأعمدة، لذلك يستمر الأمر على مدى بضعة أسطر أخرى.خطرت لي فكرة رائعة مفادها أنه يمكنني استخدام الخريطة بدلاً من ذلك، لكن لم يحالفني الحظ كثيرًا.لقد حاولت الاختلافات في

map { $_->as_trimmed_text } @columns[1, 3, 5, 7, 9]

لكني أستمر في الحصول على طريقة لا يمكن الاتصال بها "as_trimmed_text" بدون مرجع الحزمة أو الكائن.

هل من الممكن أن أفعل ما أحاول أم يجب أن ألتزم بما لدي حاليًا؟

تيا

يحرر:عمود -> أعمدة

هل كانت مفيدة؟

المحلول

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

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

@trimmed_columns = map { $column[$_]->as_trimmed_text } (1, 3, 5, 7, 9);

إجابة روبرت بي يشرح بشكل أفضل سبب عدم عمل النسخة الأصلية.

نصائح أخرى

وجدت ذلك:

إليك القليل من التعليمات البرمجية التي تحاكي ما ينبغي يحدث:

use strict;
use warnings;

package Text;

sub new
{
   my $class = shift;
   my $text = shift;
   return bless { TEXT => $text }, $class;
}

sub as_trimmed_text
{
   my $self = shift;
   my $text = $self->{TEXT};
   $text =~ s/^\s*(.*?)\s*$/$1/;
   return $text;
}

package main;

my @texts = ( Text->new(' foo '), Text->new(' bar '), Text->new(' baz '));

my @trimmed = map { $_->as_trimmed_text() } @texts[1, 2];

print "Trimmed were: ", join(',', map { "'$_'" } @trimmed);

هذا يعمل، ويعمل بشكل جيد؛ انا حصلت:

Trimmed were: 'bar','baz'

ولكن إذا استبدلت الخريطة بهذا الخط:

my @trimmed = map { $_->as_trimmed_text() } @texts[2, 3];

فجأة أحصل على هذا الإخراج:

Can't call method "as_trimmed_text" on an undefined value

هذا لأن "3" خارج نطاق القيم الصالحة بتتثر تتيكس، لذلك تقوم بتوصيل إدخال جديد، ويجعله undef. وبعد ثم، خريطة الخريطة

undef->as_trimmed_output()

من البرف. كنت أتحقق شريحة صفيف الخاصة بك مرة أخرى، وتأكد من أنك لا تستطع القيم خارج الفهارس الفعلية المتاحة، وتحظر ذلك، تحقق من أنك تقوم بالفعل بمعالجة الأعضاء HTML :: Elements Element map. وبعد سريع Data::Dumper::Dumper على القيم في @columns سوف تساعد بشكل كبير.

على سبيل المثال، إذا قمت بتغيير صفيفك لاحتواء

my @texts = ( Text->new(' foo '), Text->new(' bar '), ' baz ');

وحاول تشغيله، أحصل الآن على الخطأ الخاص بك:

Can't call method "as_trimmed_text" without a package or object reference at map.pl

لذلك، تحقق مضاعف للتأكد من محتويات صفيفك هي في الواقع جميع مثيلات المباركة للفئة التي تحاول استدعاء طريقة.

لك map يبدو الحق في لي. هل أنت متأكد من أن المرء الثاني يجب أن يقول @columns بدلا من @columnب هل تمتلك strict تحولت إلى التقاط الأخطاء المطبعية في أسماء متغيرة؟

أنت تستخدم متغير آخر في المثال الثاني @columns, ، لكن لا @column. وبعد حاول استخدام التعليمات البرمجية التالية:

map { $_->as_trimmed_text } @column[1, 3, 5, 7, 9]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top