2016-09-15 4 views
2

Ich habe ein Verzeichnis, in dem es mehr als 10 Dateien, die mit Muster "my_Report" beginnen. Während ich versuchte, Glod für diesen Job zu verwenden, wählte es nur eine einzige Datei aus. Gibt es irgendein Problem mit der Syntax unterglob nicht alle Dateien mit einem Muster, gibt es ein Problem mit der Syntax

$g_map{"Rep"} = glob ("data_1/reports/my_Report*"); 

Alternativ habe ich versucht grep alle Dateien zu finden und es in einem Hash gespeichert

$g_map{"Rep"} = [grep {!/\.xh$/} <data_1/reports/my_Report*>]; 

Meine Forderung ist es, alle Dateien mit bestimmten Muster zu finden aus dem Verzeichnis und speichern Sie es in einem Hash mit Schlüssel "Rep" Wie erreiche ich das gleiche mit glob?

Vielen Dank im Voraus

+0

Im oberen Befehl gibt es ein '/' am Anfang des Weges. In der unteren ist es nicht. – simbabque

+0

@simbabque: Sorry, das ist ein Tippfehler, aber das ist nicht das Problem, auch ohne /, bekomme ich dieses Problem, sollte ein Problem mit der Art iam mit glob – LearningCpp

+0

Ich wollte sagen, fügen Sie die Ausgabe von 'ls', aber Mob ist unten in ihrer Antwort. – simbabque

Antwort

3

Ihr erster Anruf ist im skalaren Kontext. Im skalaren Kontext gibt glob (höchstens) ein einzelnes Ergebnis zurück.

Um alle passenden Dateien abrufen, Listenkontext verwenden (wie Sie in Ihrem zweiten Anruf tun)

$g_map{"Rep"} = [ glob("data_1/reports/my_Report*") ] 

oder wenn Sie ein Ergebnis erwarten oder wollen einfach nur das erste Ergebnis

($g_map{"Rep"}) = glob("data_1/reports/my_Report*"); 
+0

Ich muss meine Antwort eingegeben haben, wie Sie waren :) Zumindest OP hat jetzt ein paar verschiedene Optionen – stevieb

2

glob gibt eine Liste zurück, aber Sie rufen sie im skalaren Kontext auf, weshalb Sie nur ein einziges Ergebnis erhalten. Versuchen Sie folgendes:

@{ $g_map{Rep} } = glob ("data_1/reports/my_Report*"); 

Das wird drehen $g_map{Rep} Hash-Schlüssel in eine Array-Referenz, und alle Dateien werden darin gespeichert werden.

Sie es wie folgt zugreifen können:

for (@{ $g_map{Rep} }){ 
    print "filename: $_\n"; 
} 
+0

Beachten Sie, dass dies nicht der normale Fall einer Liste im skalaren Kontext ist. Stattdessen verhält sich 'glob' als * Iterator * im skalaren Kontext, der Schleifen wie 'while (my $ node = glob 'pattern') {...}' zulässt – Borodin

Verwandte Themen