Domanda

Non capisco quello che potrebbe essere gli usi della subroutine lvalue? Che cosa è che non riesco a fare con le subroutine normali? La prego di inviare qualche esempio?

Grazie

È stato utile?

Soluzione

lvalue sono raccomandati da evitare. Sono divertenti e tutto, ma confondono i nuovi utenti che fanno ipotesi su come funzionano tutti i sottotitoli, e quindi deve essere evitato in codice quando un modo migliore è disponibile.

A volte può essere estremamente pratico da usare un risultato lvalue per fare il lavoro sporco.

substr( $string, $start, $stop ) = 'somevalue' # replaces the specified part of the substring. 

Tuttavia, questo fa anche la stessa cosa:

substr( $string, $start, $stop , 'somevalue' ); 

La differenza qui è soprattutto il primo ha potere significativamente più espressiva, come delega il comportamento al codice che utilizza invece della funzione stessa.

Per esempio:

substr( $string, $start, $stop ) =~ s/a/b/g 

che richiedono di fare

my $x = substr( $string, $start, $stop ); 
$x =~ s/a/b/g/; 
substr( $string, $start, $stop, $x );

Il che è un po 'brutto.

Anche se, c'è un ulteriore brutto qui, perché si deve pensare se fare che la sostituzione o meno con $ x funziona retroattivamente modificare la stringa o meno (a causa di SUBSTR essere un sub lvalue). Non credo che lo fa, ma la sua ambigua abbastanza devo controllare il manuale di ricordare se lo fa o no, e questo è male.

Altri suggerimenti

È possibile utilizzare lvalue subs come setter per i membri di oggetto:

sub x : lvalue {
    my $self = shift;
    $self->{x};
}

Poi più tardi:

$foo->x = 5;

Questa combina l'intuitività di impostazione membri direttamente con la flessibilità di incapsulare il setter, nel caso in cui in seguito si desidera modificare come l'oggetto viene implementato. Confronta seguenti modi più tradizionali per impostare i membri in Perl:

intuitivo ma fragile; cosa succede se si cambia il modo $ pippo è implementato?

$foo->{x} = 5;

metodo setter tradizionale; non utilizzare la sintassi incarico per ciò che equivale a un incarico:

$foo->set_x(5);

Naturalmente, i metodi lvalue non sono mai stati realmente abbracciato dalla comunità Perl, e l'uso di subs lvalue è "strano" e tutto ciò che sarebbe maturato per intuitività andrebbero persi dalla stranezza di tutto questo.

Essi forniscono un'interfaccia differente, che in alcune circostanze può essere più intuitivo. A differenza dei tradizionali setter, si può effettivamente modificare direttamente il valore. Ad esempio

lvalue_sub($foo) =~ s/foo/bar/;

può essere più pulita rispetto a

my $tmp = some_sub($foo);
$tmp =~ s/foo/bar/;
some_sub($foo, $tmp);

Non posso parlare per il loro utilizzo tanto nella mia normale roba Perl, ma sono ampiamente utilizzati nel linguaggio Perl dati quando prendendo fette o altre sottosezioni di un piddle. Ad esempio:

my $a = sequence(100);
# use lvalue in this increment:
$a->where($a < 10)++;

# Zero-out the last four elements
# notice the use of the overloaded .= operator:
$a->slice("-10:") .= 0;

Come molte cose in Perl, questa funzione non è molto usato in tutto l'intero ecosistema, ma il suo uso, almeno in questa nicchia rende la vita molto più facile per gli utenti di PDL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top