2010-01-18 2 views
15

Ich schaute nur Can someone tell me how to create an array of directory contents?. Wie nicht anders zu erwarten, wurden Datei-Globs als Antwort angeboten. Was mich überraschte war, dass der Beitrag empfohlen glob() anstatt <*> zu verwenden.Was sind die komparativen Vorteile von glob ('foo *') über <foo*>?

Ich benutze <*>, weil das ist, was ich vor langer Zeit gelernt habe und habe nie darüber nachgedacht. Was kein guter Grund ist.

Welche Syntax bevorzugen Sie für globbing, und warum?

+3

Ich bin neugierig, warum Sie dieses Community-Wiki erstellt haben. Es ist eine gute Frage, zum Thema und nicht sehr subjektiv. Durch die Markierung von CW wird der Anreiz für Menschen, die sich für den Aufbau ihres Rufs interessieren, etwas abgelöst. Möchtest du die Leiste für andere Nutzer senken, um die Frage selbst zu bearbeiten? –

+4

Um die Wahrheit zu sagen, hätte ich auch den Repräsentanten nicht gestört. Ich habe es CW gemacht, weil die Frage subjektiv und pollig ist. Was bevorzugen Sie? Anstatt einer Frage mit einer einzigen richtigen Antwort. Mein Verständnis ist, dass diese Art von Fragen CW sein sollte. Ich könnte mich irren, ich war unzählige Male in vielen Themen. – daotoad

+0

Eine einzige richtige Antwort? In Perl?!? !!? TMTOWTDI! (-: –

Antwort

12

Persönlich denke ich, dass <> schlecht überlastet ist. Es bedeutet gewissermaßen "Lesen von einem Iterator", aber es gibt ein wenig zu viel Magie und Feinheit, um zu bestimmen, welcher Iterator welcher Art für meinen Geschmack ist. z.B. <$foo> und <$foo{bar}> bedeuten sehr unterschiedliche Dinge, und die magische bare <> bedeutet noch etwas anderes.

Ich bevorzuge die Verwendung glob und reservieren Sie die <> Syntax für Griffe. Das spart die kognitive Last, herauszufinden, ob der Inhalt des <> ein Muster ist und nicht ein Handle (oder etwas, das zu einem verrechnet wird). Das heißt, wenn Sie die Notation <> mit "iterator" anstelle von "read" assoziieren, können Sie dies der funktionalen Syntax vorziehen - zumindest für die Fälle, in denen Sie die Ergebnisse überspringen möchten, anstatt eine Liste zu generieren.

10

Das Perldoc Sie verknüpft sagt, es gibt einige Probleme mit dem Winkel-Klammer-Syntax:

Eine Ebene der doppelten Anführungszeichen Interpretation zuerst getan wird, aber man kann <$foo> nicht sagen, denn das ist ein indirekte Dateihandle wie in der vorherige Absatz erläutert. (Bei älteren Versionen von Perl, würde Programmierer geschweiften Klammern einfügen Interpretation als Dateinamen glob zu zwingen. <${foo}> In diesen Tagen gilt es als Reiniger die interne Funktion aufzurufen direkt als glob($foo), die ist wahrscheinlich die richtige Weg, es zu haben in erster Linie getan.)

ich meistens nur File::Find und seine ilk mich.

+1

) Ihr fettgedruckter Text ist nur eine Behauptung: "Wer ist sauberer" von wem, in welchen Fällen?Der andere Text erwähnt eine potentielle Zweideutigkeit mit "", die ich nie als ein Problem in echtem Code kennengelernt habe. Ist diese Anmerkung, dass das Formular nur ein Problem ist, wo die Mehrdeutigkeit auftritt oder gilt es für alle Verwendungen von Glob? – daotoad

+0

File :: Find ist ziemlich anstrengend, wenn ein Glob alles ist, was Sie brauchen. Aber es ist sicherlich besser, einen eigenen rekursiven Verzeichnis-Code zu schreiben. Sie sagen, und was ist mit anderen spezifischen Modulen? – daotoad

+1

@daotoad: "Betrachtet sauberer" zumindest von Larry Wall (ab Perl 5.002 Beta 1, mit "Diese Tage" um 1995-11-21), nach der git Geschichte von "perlop.pod". (Und von mir, für was auch immer es sich lohnt.) –

2

In diesen Tagen bleibe ich bei glob, weil ich finde, dass es besser lesbar und Neuling-freundlich (*) im Vergleich zur Verwendung von spitzen Klammern.

(*) perldoc -f glob funktioniert.