2010-01-18 15 views
15

Estaba mirando Can someone tell me how to create an array of directory contents?. Como era de esperar, se ofrecieron bloques de archivos como respuesta. Lo que me sorprendió fue que la publicación recomendaba usar glob() en lugar de <*>.¿Cuáles son las ventajas comparativas de glob ('foo *') sobre <foo*>?

Uso <*> porque eso es lo que aprendí hace mucho tiempo y nunca lo había pensado. Lo cual no es una buena razón.

¿Qué sintaxis prefiere para globbing y por qué?

+3

Tengo curiosidad acerca de por qué has hecho esta wiki de la comunidad. Es una buena pregunta, sobre el tema, y ​​no muy subjetiva. Marcarlo CW le quita parte del incentivo a las personas interesadas en construir su reputación para responder. ¿Querías bajar la barra para que otros editen la pregunta en sí? –

+4

Para decirte la verdad, tampoco me hubiera importado el representante. Lo hice CW porque la pregunta es subjetiva y es como una encuesta. ¿Qué prefieres? En lugar de una pregunta con una sola respuesta correcta. Entiendo que este tipo de preguntas deberían ser CW. Podría estar equivocado, he estado, innumerables veces en muchos temas. – daotoad

+0

¿Una sola respuesta correcta? En Perl?!? !!? TMTOWTDI! (-: –

Respuesta

12

Personalmente, creo que <> está muy sobrecargado. De alguna manera significa "leer de un iterador", pero hay demasiada magia y sutileza para determinar qué iterador de qué tipo es para mi gusto. p.ej. <$foo> y <$foo{bar}> significan cosas muy diferentes, y el <> mágico desnudo significa algo diferente todavía.

Prefiero usar glob y reservar la sintaxis <> para identificadores. Hacer eso ahorra la carga cognitiva de averiguar si el contenido del <> es un patrón en lugar de un identificador (o algo que se resuelve en uno). Dicho esto, si asocia mentalmente la notación <> con "iterador" en lugar de "leer", puede preferir esa a la sintaxis funcional, al menos para aquellos casos en los que desea pasar por alto los resultados en lugar de generar una lista.

10

Eso perldoc se enlazó dice que hay algunos problemas con la sintaxis escuadra angular:

Un nivel de doble cotización interpretación se realiza en primer lugar, pero no se puede decir <$foo> porque eso es una indirecta Filehandle como se explica en el párrafo anterior. (En más viejos versiones de Perl, los programadores insertar llaves para forzar la interpretación como un pegote de nombre de archivo:. <${foo}> En estos días, se considera limpiador para llamar a la función interna directamente como glob($foo), que es probablemente la derecha manera de haberlo hecho en el primer lugar.)

yo sobre todo utilizar File::Find y su calaña mí mismo.

+1

Su texto en negrita es solo una afirmación: "considerado más limpio" por quién, en qué casos?El otro texto menciona una posible ambigüedad con '<$foo>' que nunca me he encontrado como un problema en el código real. ¿Esta nota indica que la forma es solo un problema donde ocurre la ambigüedad o se aplica a todos los usos de glob? – daotoad

+0

File :: Find es bastante resistente cuando un glob es todo lo que necesita. Sin embargo, es mejor que escribir su propio código de directorio recursivo para caminar. Tú dices y es como, ¿qué otros módulos específicos tenías en mente? – daotoad

+1

@daotoad: "Considerado más limpio" al menos por Larry Wall (a partir de Perl 5.002 beta 1, con "En estos días" alrededor del 1995-11-21), según la historia de git de 'perlop.pod'. (Y por mí, por lo que sea que valga la pena) –

2

En estos días me quedo con glob, porque me parece más legible y amigable para principiantes (*) en comparación con el uso de corchetes angulares.

(*) perldoc -f glob funciona.

Cuestiones relacionadas