for - llamar subrutina perl
Uso de ''if'' versus ''a menos'' para los condicionales de Perl (9)
¡Aparte de un caso esotérico 1, a unless
sea azúcar sintáctico para if !
. Existe para permitirle escribir código que es más claro y más expresivo. Se debe usar cuando se logra este objetivo y se evita cuando lo perjudica.
A unless
que sea más útil para el control de flujo en bucles. p.ej
while (<$fh>) {
next unless //S/;
# ...
}
Para las negaciones simples, me parece más claro que una negación if
- ¡es fácil perder ese liderazgo !
al leer el código
unless ($condition) {
do_something();
}
if (!$condition) {
do_something();
}
Pero no escribas a unless ... else
, porque eso es simplemente discordante.
En forma de postfix proporciona una pista sobre cuál es la ruta esperada a través del código.
do_normal_thing() unless $some_unlikely_condition;
1) La última expresión evaluada es diferente, lo que puede afectar el comportamiento de los subs sin un return
explícito.
¿Cuáles son algunas pautas para el mejor uso de if
versus a unless
en el código de Perl? ¿Hay razones de peso para preferir uno u otro en algunas situaciones?
A propósito...
En Perl Best Practices, el consejo es nunca usar a menos que Personalmente, creo que es una locura.
Después de más de 20 años de preferir a Perl a cualquiera de sus alternativas (la mayoría de las cuales no existirían si Perl no hubiera proporcionado la plantilla), no solo estoy de acuerdo con el veredicto de "locura", estoy sorprendido (preocupado) de escuchar que ''Mejores prácticas'' ''quiere deshacerse de eso.
Dicho esto, prefiero el código escrito para mayor claridad, a diferencia de las alternativas implícitamente ofuscadas que algunos programadores de Perl adoptan "simplemente porque pueden". ''a menos'' es el opuesto inequívoco de ''si'', y por lo tanto una alternativa muy útil para incrustar una negación en un condicional ''if'', particularmente si el condicional contiene múltiples operadores. Y ese razonamiento se aplica incluso si es seguido por else / elsif.
Aunque entiendo las motivaciones para este tipo de preguntas, no creo que sea realmente sensato reducir el uso de algo así como a unless
convierta en reglas generales concretas. Esto, al igual que mucha sintaxis auxiliar en Perl, se proporciona como una conveniencia menor para los programadores para ayudarlos a articularse más claramente a su propia discreción; He visto mucho más de lo que dijeron los desarrolladores principales en "Programming Perl". No hay un propósito superior o racionalización. Soy consciente de que esto aclara la cuestión, pero la única restricción que impongo al usarla es ver que cumple su propósito más amplio de hacer que el código sea más claro. Si lo hace, entonces todo está bien. Reconocer si el código es comprensible es intuitivo en sí mismo y no se puede reducir a un gran puñado de condiciones de uso excesivamente generalizadas con respecto a cada matiz de los modificadores / operadores / sintaxis integrales incorporados, y donde se requieren restricciones y directrices en proyectos de grupos grandes No creo que tenga sentido dividir los pelos tan finamente.
En Perl Best Practices, el consejo es nunca usar a unless
Personalmente, creo que es una locura.
Uso a unless
que haya una condición simple que escribiría como if( ! ... )
. Encuentro que la versión a unless
es más legible, especialmente cuando se usa como un postfijo:
do_something() unless $should_not_do_that;
Recomiendo evitar a unless
cualquier momento las cosas se elsif
más complicadas, como cuando tendrás elsif
o bloques. (Afortunadamente, o quizás desafortunadamente, dependiendo de su perspectiva, no hay elsunless
)
Además, cada vez que un condicional es una expresión compleja compuesta de otros booleanos. Por ejemplo,
unless( $foo and !$bar )
Es bastante confuso y no tiene ninguna ventaja sobre el equivalente if
.
La sintaxis if (! $ Condition) es equivalente a unless ($ condition), e igualmente si cambia el NOT''ing de la condición.
Personalmente prefiero usar solo declaraciones IF. ¿Por qué? Porque es menos para memorizar. Si tiene 100 líneas de código, la mitad utiliza a menos que () y la otra mitad use if (), tendrá que pasar más tiempo depurándolo que si solo fuera en las sentencias ().
Sin embargo, puede "agarrar" el truco a menos que sea así, de modo que ir entre los dos no lleve mucho tiempo. Pero no se trata solo de si () versus a menos que (). No olvides que ...
if($condition) {
#passed-condition code
} else {
#failed-condition code
}
...es equivalente a...
unless(!$condition) {
#passed-condition code
} else {
#failed-condition code
}
Pero ¿y si if () {...} elsif () {...}? ¿Cómo haría un equivalente de eso a menos que () {...} elsunless () {...}? Cuanto más complicada es la lógica, más difícil se vuelve ir entre if () y unless (). Cuanto menos tenga que recordar y equilibrar en su memoria, más rápido será para depurar su propio código.
Mi opinión sería nunca usar a menos que. Mis razones son:
- Creo que la sintaxis hace que el código sea más difícil de leer. Tener un solo método para hacer un if hace que todo sea más simple y consistente.
- Si necesita agregar una declaración else más adelante, realmente debería cambiar el if a if. Simplemente es más fácil si ya es un if.
- Si la lógica dentro de la declaración menos se vuelve más compleja, entonces puede terminar con un código impar como "a menos que (x == 5 && y! = 7). Esto es extraño porque hay un doble negativo en la segunda verificación.
- Hay otras formas de negar cosas, es decir, x! = 5
- Es más consistente con otros idiomas. No conozco ningún otro idioma que tenga una declaración de menos y creo que hay una muy buena razón para esto.
En perl hay realmente 4 formas de escribir una instrucción if, si, a menos que y luego poner el cheque al final de la línea en lugar del inicio. Prefiero un solo método consistente que sea consistente con otros lenguajes también.
Solo mi valor de $ 0.02.
Pasé una hora recientemente tratando de explicarle a alguien cómo funcionaban dos cláusulas anidadas "a menos", era difícil descifrarlas sin tener que invertirlas en sentencias if con lógica booleana.
Si tratas de convertirlo al inglés, te ayudará a guiarte.
Un simple a menos que funcione bien. Por ejemplo.
''A menos que seas callado, voy a ignorarte''.
unless ($quiet) {
ignore();
}
Aunque creo que esto funciona igual de bien
''Si no estás tranquilo, voy a ignorarte''
if (not $quiet) {
ignore();
}
cuando comienza a complicarse es cuando tienes negación.
''A menos que no seas ruidoso, voy a ignorarte''
unless ( ! $noisy) {
ignore();
}
Mucho mejor escrito como
''Si eres ruidoso, voy a ignorarte''
if ($noisy) {
ignore();
}
Por lo tanto, no use un ''a menos'' si también tiene un negado.
Además, no use ''a menos que sea''
unless ($quiet) {
ignore();
}
else {
give_a_sweet();
}
''A menos que seas callado, te ignoraré, de lo contrario te daré un dulce''
Cámbielo invirtiendo la condición.
if ($quiet) {
give_a_sweet();
}
else {
ignore();
}
''Si estás callado, te daré un dulce, de lo contrario te ignoraré''.
con más de una condición, se vuelve desordenado.
unless ($quiet and not $fidgit) {
punish();
}
''A menos que seas callado y no vuelvas a jugar, te castigaré''.
(¡Lo siento, mi comprensión está fallando aquí!)
de nuevo, niegalo.
if (not $quiet or $fidgit) {
punish();
}
"Si no estás callado, o estás enfadado, te castigaré".
el problema con el uso de ''a menos'', incluso para los casos más simples, a menudo (solo o por
Espero que quede claro cuándo deberías, o no deberías, usar a menos que lo hagas.
(a menos que no tenga otra opinión?)
Solo una opinión personal tal vez, pero me gustaría usar A menos que cuando la condición if comience con a!
Una regla de oro es que ''a menos'' probablemente se use con poca frecuencia.
Es particularmente útil en el formulario postfix, por ejemplo:
delete_old_widgets() unless $old_widget_count == 0
Situaciones en las que nunca debes usar a menos que:
- con una condición compuesta (y, o, no)
- con una cláusula else