Pregunta

No entiendo lo que podría ser el uso de subrutinas lvalue? ¿Qué es lo que no puedo lograr con subrutinas normales? Podría, por favor publicar algunos ejemplos?

Gracias

¿Fue útil?

Solución

Se recomienda que debe evitarse

LValues. Son divertidos y todo, pero confunden los nuevos usuarios que hacen suposiciones acerca de cómo funcionan los submarinos, y por lo tanto deben ser evitados en código cuando una mejor manera está disponible.

A veces puede ser muy práctico utilizar un resultado lValue a hacer el 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 tiene el poder significativamente más expresivo, ya que delega el comportamiento al código que se utiliza en lugar de la propia función.

Por ejemplo:

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

Requeriría que hacer

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

¿Qué es un poco desagradable.

A pesar de que hay un desagradable adicional aquí, porque hay que pensar si hacer que la sustitución o no con $ x funciona retroactivamente modificar la cadena o no (debido a SUBSTR ser un sub lValue). No creo que lo haga, pero lo suficientemente ambigua Su tengo que compruebe el manual de recordar si lo hace o no, y eso es malo.

Otros consejos

Puede utilizar lvalue submarinos como definidores de miembros de objetos:

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

A continuación, más adelante:

$foo->x = 5;

Esto combina la intuición de fijar los miembros directamente con la flexibilidad de encapsular el organismo, en caso de que más adelante desea cambiar cómo se implementa el objeto. Comparación de las siguientes maneras más tradicionales para establecer miembros en Perl:

intuitiva, pero frágil; lo que si cambia cómo se implementa $ foo?

$foo->{x} = 5;

método setter 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 por intuición se perdería por lo extraño de todo.

Proporcionan una interfaz diferente, que en algunas circunstancias puede ser más intuitivo. A diferencia de los emisores tradicionales, en realidad se 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);

No puedo hablar por su uso tanto en mi Perl cosas normales, pero se utilizan ampliamente en el lenguaje Perl datos al tomar rodajas o en otras subsecciones de un pis. 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 más más fácil para los usuarios de PDL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top