2009-02-02 10 views

Respuesta

15

se recomiendan LValues ​​que debe evitarse. Son divertidos y todo, pero confunden a los nuevos usuarios que hacen suposiciones sobre cómo funcionan todos los subs, y por lo tanto deben evitarse en el código cuando hay una mejor manera disponible.

A veces puede ser extremadamente práctico usar un resultado de LValue para realizar un trabajo sucio.

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

Sin embargo, esto también hace lo mismo:

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

La diferencia aquí es sobre todo el primero ha de energía significativamente más expresivo, ya que delega el comportamiento al código que la utiliza en lugar de la función en sí

Por ejemplo:

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

que requieren volver a hacer

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

que es un poco desagradable.

Aunque, hay un desagradable adicional aquí, porque hay que pensar si hacer esa sustitución o no con $ x funciona de forma retroactiva para modificar la cadena o no (debido a que substr es un sub LValue). No creo que lo haga, pero es lo suficientemente ambiguo como para que tenga que revisar el manual para recordar si lo hace o no, y eso es malo.

+2

$ x contiene una copia, no un valor l. Pero si alias un lvalue substr ala 'for (substr (...)) {' o 'foo (substr (...))' puedes hacer más de una cosa con lvalue. – ysth

+0

Tengo problemas para entender algunas de tus frases: A) "usar un resultado de LValue para hacer un trabajo sucio". pero no puedo ver eso ilustrado en el ejemplo - o no entiendo lo que quiere decir con "un resultado de LValue" B) "ya que delega el comportamiento al código que lo usa en lugar de la función en sí". tal vez se trata de ser un inglés no nativo, pero estoy confundido sobre los significados de los pronombres aquí –

+0

y C) "porque tienes que pensar si hacer esa sustitución o no con $ x funciona retroactivamente para modificar la cadena o no" - demasiado claro para mí, ni siquiera puedo señalar cómo exactamente ... –

7

Proporcionan una interfaz diferente, que en algunas circunstancias puede ser más intuitivo. A diferencia de los incubadores tradicionales, en realidad puede cambiar el valor directamente. Por ejemplo

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

puede ser más limpio que

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

Puede utilizar lvalue submarinos como definidores de miembros de objetos:

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

Luego, más tarde:

$foo->x = 5; 

Esto combina la intuición de fijar los miembros directamente con la flexibilidad de la encapsulación del organismo, en el caso luego desea cambiar cómo se implementa el objeto. Compare las siguientes formas más tradicionales de configurar miembros en Perl:

Intuitivo pero frágil; ¿y si cambias cómo se implementa $ foo?

$foo->{x} = 5; 

Método de configuración tradicional; no utiliza la sintaxis de asignación para lo que equivale a una asignación:

$foo->set_x(5); 

Por supuesto, los métodos lvalue han sido nunca aceptado por la comunidad Perl, y el uso de submarinos lvalue es "raro" y todo lo que se ganaría para la intuición se perdería por la rareza de todo.

+1

Tenga en cuenta que al igual que los estados [manual] (https://perldoc.perl.org/perlsub.html#Lvalue-subroutines), utilizando lvalue subs para los instaladores como este excluyen la posibilidad de validar la entrada. En otras palabras, usar lvalue subs como accessors es estrictamente menos poderoso que un método simple. –

6

No puedo hablar de usarlos mucho en mi material normal de Perl, pero se usan ampliamente en Perl Data Language al tomar porciones u otras subsecciones de una petición. Por ejemplo:

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; 

Como muchas cosas en Perl, esta función no se utiliza mucho en todo el ecosistema, pero su uso al menos en este nicho hace la vida mucho más más fácil para los usuarios de PDL.

+0

¡Tuve que votar su primera respuesta! –

Cuestiones relacionadas