Posso usare la mappa di Perl con una fetta array?
Domanda
Sto solo cercando di accorciare una riga di codice che assegna HTML :: elemento-> as_trimmed_text da una serie di elementi HTML :: ad alcune variabili - roba abbastanza standard come:
my ($var1, var2) = ($columns[1]->as_trimmed_text, $columns[2]->as_trimmed_text);
.. solo che ci sono alcune più colonne così continua su più di un paio di righe. Ho avuto la brillante idea che ho potuto usare la mappa, invece, ma io non sono in realtà avendo molta fortuna. Ho provato varianti
map { $_->as_trimmed_text } @columns[1, 3, 5, 7, 9]
, ma continuo a ricevere Impossibile chiamare il metodo "as_trimmed_text" senza un riferimento pacco o di un oggetto.
E 'possibile fare quello che sto cercando o devo solo attenersi a quello che ho attualmente?
TIA
EDIT: colonna -> Colonne
Soluzione
In primo luogo, se non siete interessati alla produzione di carta, non si dovrebbe utilizzare la mappa. Mappa, come grep, ordinare, ecc è un filtro. Se non si desidera che l'uscita, utilizzare foreach.
Ma lei ha ragione, mappa è stata progettata per risolvere esattamente questo tipo di problema. Questo vi darà l'output che si desidera, anche se non fa uso di fette di matrice.
@trimmed_columns = map { $column[$_]->as_trimmed_text } (1, 3, 5, 7, 9);
di Robert P risposta spiega meglio perché l'originale non ha funzionato.
Altri suggerimenti
Trovato:
Ecco un po 'di codice che emula quello dovrebbe accadere:
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);
Questo funziona, e funziona bene; Ottengo:
Trimmed were: 'bar','baz'
Ma se si sostituisce la carta con questa linea:
my @trimmed = map { $_->as_trimmed_text() } @texts[2, 3];
Tutto ad un tratto ottengo questo output:
Can't call method "as_trimmed_text" on an undefined value
Questo perché '3' è al di fuori della gamma di valori validi in @texts, quindi autovivifies una nuova voce, e lo rende undef
. Poi, la mappa non
undef->as_trimmed_output()
che barfs. Mi piacerebbe verificare la vostra fetta di matrice ancora una volta, e assicurarsi che non si sta afferrando i valori al di fuori degli indici effettivamente disponibili, e salvo che, verificare che in realtà si sta elaborando i membri HTML :: Element con quella map
. Un Data::Dumper::Dumper
rapido sui valori in @columns
aiuterà immensamente.
Ad esempio, se si cambia quindi la matrice per contenere
my @texts = ( Text->new(' foo '), Text->new(' bar '), ' baz ');
e provo a farlo funzionare, io ora ottenere il vostro errore:
Can't call method "as_trimmed_text" without a package or object reference at map.pl
Quindi, doppio controllo per assicurarsi che il contenuto della serie sono in realtà tutte le istanze benedette della classe si sta cercando di chiamare il metodo di.
Il tuo map
sembra giusto per me. Sei sicuro che il secondo si dovrebbe dire @columns
invece di @column
? Avete strict
acceso per la cattura di errori di battitura nei nomi delle variabili?
Si sta utilizzando un'altra variabile nel secondo esempio @columns
, ma non @column
. Provare a utilizzare il codice seguente:
map { $_->as_trimmed_text } @column[1, 3, 5, 7, 9]