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

È stato utile?

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]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top