Создание массива из функции объекта с использованием карты - PullRequest
5 голосов
/ 06 октября 2009

У меня есть массив HTML::Element с, полученный из HTML::TreeBuilder и HTML::Element->find, и мне нужно присвоить их значение as_text некоторым другим переменным. Я знаю, что могу действительно легко сделать

my ($var1, $var2) = ($arr[0]->as_text, $arr[1]->as_text);

но я надеялся, что вместо этого смогу использовать map, чтобы сделать код немного более читабельным, так как в массиве по крайней мере 8 элементов. Я действительно новичок в Perl, поэтому я не совсем уверен, что делать.

Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

9 голосов
/ 06 октября 2009

Если вы хорошо разбираетесь в perldoc -f map, это довольно ясно:

my @as_texts = map { $_->as_text } @arr;

Работает также, если вы хотите назначить список скаляров:

my($var1, $var2, $var3, ...) = map { $_->as_text } @arr;

Но, конечно, версия массива лучше для неизвестного числа элементов.

1 голос
/ 06 октября 2009

Обратите внимание, что если вы просто хотите отобразить первые два элемента @arr:

my($var1, $var2) = map { $_->as_text } @arr;

вызовет $_->as_text для всех элементов @arr. В этом случае используйте фрагмент массива, чтобы избежать ненужных вызовов:

my($var1, $var2) = map { $_->as_text } @arr[0 .. 1];

Пример:

#!/usr/bin/perl

use strict;
use warnings;

my @arr = 'a' .. 'z';
my $count;
my ($x, $y) = map { $count++; ord } @arr;

print "$x\t$y\t$count\n";

$count = 0;
($x, $y) = map { $count++; uc } @arr[0 .. 1];

print "$x\t$y\t$count\n";

Выход:

C:\Temp> jk
97      98      26
A       B       2

ord вызывался для каждого элемента @arr, тогда как uc вызывался только для тех элементов, которые нас интересовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...