Perl 5.10 introdujo una construcción de interruptor adecuada con given/when
y parece una herramienta poderosa. Sin embargo, actualmente perldoc perlsyn
carece de algunos buenos ejemplos.¿Qué tipo de casos de uso aseados existen para/cuándo?
un caso en el que encontré a mano últimamente era para usarlo con los operadores de la prueba del archivo:
given (-d "foo/bar/") {
when (1) { ... } # defined is wrong as -d returns '' on a file.
default { ... }
}
o alternativamente:
given ("foo/bar/") {
when (-d) { ... }
default { ... }
}
Para mí, sobre todo la primera versión se ve mejor que un if - si construyo o uso el operador ternario, cuando dependa del resultado de la prueba, necesito realizar acciones en ambos casos.
Me hizo preguntarme, ¿qué otra cosa se ve bien más allá del simple caso de caer de nuevo a la coincidencia inteligente y evitar demasiado si-elsif-elsif -...- otras estructuras?
Tengo la corazonada de que, dado/cuando, es posible ser inteligente sin perder la claridad, pero no tengo ningún buen ejemplo.
Una cosa que me sorprendió, sin embargo, es que puede anidar la también de construcción:
given ($filename) {
when (-e) {
when (-f) {
when (-z) { say "Empty file" }
default { say "Nonempty file" }
}
when (-d) {
when (-o) { say "Directory owned by me"}
default { say "Directory owned by someone else" }
}
default { say "Special" }
}
default { say "No such file or directory" } }
Puede usar '-f _',' -z _', '-d _' y' -o _' para evitar llamar 'stat' al el mismo archivo '-e' lo llamó. Ver ['perldoc -f -X'] (http://perldoc.perl.org/functions/-X.html) para más información. –
De hecho, generalmente es una buena idea usar el formulario en caché. Sin embargo, no quería complicar demasiado el ejemplo con cosas no relacionadas. Rara vez importa para el rendimiento de todos modos ... – szbalint
'-d' abarca' -e' y '-f' abarca' -e', no hay ninguna razón para probar '-e' a menos que'! -f &&! -d' , no cambiaría nada el solo asumir que en ese caso, si '-e', entonces es especial. – Axeman