2010-04-13 5 views
5

¿Cuál es la manera más limpia de recoger una variable de comparación de un cambio en Perl a veces me encuentro escribiendo

s/(something)// ; 
    my $x = $1 ; 

entonces se dan cuenta de que si el s/// falla $1 podrían estar llevando a más de un valor de un partido anterior . Entonces intento

my $x = 'defaultvalue' ; 
    if (s/(something)//) 
    { 
    $x = $1 ; 
    } 

¿Es esta la manera más limpia de hacerlo?

Respuesta

2

Como otros han señalado, TIMTOWTDI.

personalmente me envuelvo en una sola expresión, a fin de no distraer demasiado del punto:

my $x = s/(something)// ? $1 : 'defaultvalue'; 
+0

Volviendo a esta pregunta 3 años después, habiendo estudiado LAN funcional medidores, este enfoque tiene mérito. – justintime

4

TMTOWTDI.

El Perl idiomática generalmente se observa podría ser algo como:

my $x='defaultvalue'; 

$x=$1 if (s/(something)//) ; 
+2

también 's /(...)// && ($ x = $ 1) ',' $ x = s /(...)//?$ 1: 'defaultvalue'', etc. – mob

+0

Y el muy idiomático '$ x = $ defaultvalue a menos que (s/(algo)/$ x = $ 1/e) 'que solo se recomienda para sádicos ;-) – dawg

1

@mobrule señala en los comentarios que se pueden utilizar

s{(...)}{} && ($x=$1) 

recomendaría

s{(...)}{} and $x = $1; 

Solía s{}{} porque lo odio cuando Markdown marca // como comentarios en P código erl.

and tiene una precedencia menor que && lo que permite eliminar los paréntesis alrededor de la asignación.

De perldoc perlop:

Como alternativas más legibles a && y || cuando se usa para el flujo de control, Perl proporciona los and y or operadores (ver abajo). El comportamiento de cortocircuito es idéntico. La precedencia de "y" y "o" es mucho menor, sin embargo, por lo que se puede utilizar de forma segura después de un operador de la lista sin necesidad de paréntesis:

1

Esto es muy subjetivo, y la mejor respuesta dependerá en gran medida de lo bien que se coincide con tu estilo de codificación, pero de todos modos voy a lanzar mi sombrero al ring.

Mi favorito para las asignaciones con valores por defecto es el operador terciario:

my $x = ($data =~ s/(foo)//) ? $1 : 'defaultvalue'; 

Aunque el nuevo (bueno, no tan nueva, 5,10 introdujeron) "definido o" operador puede reducir la necesidad de la declaración terciario en muchos casos.generalmente lo uso como tal:

my $var = defined($candidate) ? $candidate : 'default'; 

Pero ahora que se puede simplificar a:

my $var = $candidate // 'default'; 

o

my $var = 'default'; 
$var //= $candidate; 
+0

Solo tenga cuidado con el operador '//' y tratando de ser demasiado obtuso, puede obtener: '$ x = (s /...//, $ 1) // $ defaultvalue' que es una forma más legible de' $ x = (s /...//, $ 1) || ($ defaultvalue) 'Si bien esto funciona en muchos casos, no está probando la coincidencia, está probando un $ 1 definido. Bien en un solo bloque, muerte si hubo un combate anterior exitoso con un partido fallido en esta prueba. Es por eso que me gusta el '$ x = $ 1 más directo si (s /...//). 'Funciona en todos los casos y en cada bloque. – dawg

Cuestiones relacionadas