Wie kann ich das implementieren von Unix grep in Perl?
Wie kann ich das umsetzen grep
von Unix in Perl? Ich habe versucht, das Perl built-in grep
. Hier ist der code, der nicht funktioniert:
$pattern = @ARGV[0];
$file= @ARGV[1];
open($fp,$file);
@arr = <$fp>;
@lines = grep $pattern, @arr;
close($fp);
print @lines;
Und übrigens, ich versuche nur die grundlegenden grep
Funktionalität nicht voll funktionsfähige und zweitens will ich nicht zu tun-string Parsen selbst. Ich will eingebaute grep
oder eine Funktion von Perl.
Vielen Dank im Voraus 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Perl finden Sie eine ganze Reihe wir verwenden
@
. Aber beziehen sich die einzelnen Elemente, die Skalare verwenden wir$
.So, müssen Sie
$
und nicht@
auf diese Zeilen:Auch
diese
sollte
den grep in Perl hat die Allgemeine syntax:
Er wertet die
EXPR
für jedes elementLIST
und liefert den Wert, der aus denjenigen Elementen, für die der Ausdruck wahr ausgewertet.Den
EXPR
in Ihrem Fall ist die Suche nach dem Muster$pattern
im array@arr
. Zu suchen, müssen Sie die/PATTERN/
ohne die/
den string$pattern
werden ausgewertet true oder false.Als Sie bereits akzeptiert eine Antwort, ich Schreibe diese Antwort als Referenz für zukünftige Leser auf der Suche für ähnliche Probleme, aber nicht genau Ihre:
Als Menschen haben Sie bereits beantwortet, die Art und Weise der Simulation von grep mit perl ist die Verwendung der online-Ansatz.
Für die Verwendung von perl als 'besser' grep (suchen und Ausschneiden und...) empfehle ich das Buch minimal perl und Sie sind glücklich, weil das Kapitel für 'perl als "besser" grep' ist eine der Beispiel-Kapitel.
Hier haben Sie mehr Beispiele inspiriert von dem Buch:
Im letzten Beispiel ARGV ist das aktuelle filehandle, und als mit -l Sie sind interessiert bei der Suche nach Dateien mit dem übereinstimmen, können Sie drucken den Namen der Datei, und gehen Sie für die nächste Datei, die nach dem ersten Spiel in eine Datei.
Außerdem können Sie die Suche durch Absatz anstelle von line:
Oder findet nur die erste übereinstimmung:
Und schließlich sollten Sie Fragen zu grep und perl, ich denke, thay, ich sollte erwähnen,ACK. Es implementiert in perl, grep-Funktionalität und erweitern. Dies ist ein wunderbares Werkzeug, und wie ein plus-Sie können es auch als ein CPAN-Paket. Ich habe immer als eine Befehlszeile, ich weiß nicht, ob können Sie auf dessen Methoden direkt aus Ihren perl-Programmen, aber das wäre sehr nett.
Natürlich codaddict s Antwort ist richtig, aber ich möchte einige Bemerkungen anfügen :
Sollten Sie immer beginnen Sie Ihre Skripte mit diesen beiden Zeilen :
Drei args öffnen und testen auf Fehler:
Und weil der
use strict
müssen Sie deklarieren Sie alle Variablen. Also dein script wird so sein:Wenn Ihre Datei sehr groß ist, können Sie vermeiden, Lesen Sie vollständig im Arbeitsspeicher:
Können Sie die Annäherung an eine primitive version
grep
direkt auf der Kommandozeile. Die-e
option können Sie definieren ein Perl-script auf der Kommandozeile. Die-n
option wickelt Ihr script etwa so:while (<>){ SCRIPT }
.Etwas bessere Annäherung der
grep
würde Präfix den Namen der Datei vor jedem gedruckten übereinstimmen. Beachten Sie, dass dieses Beispiel, wie die oben, nicht gehen durch den Aufwand der öffnung aller Dateien. Stattdessen verwenden wir das Perl<>
Konstrukt zum Durchlaufen aller Dateien und der$ARGV
variable enthält den name der aktuellen Datei.$.
enthält die aktuelle Zeilennummer. Also, wenn Sie drucken möchten, dass Sie auch tun könnteperl -ne 'print "$ARGV,$.:$_" if /PATTERN/' file1 file2
.Die einfachen "grep" - Funktionalität ist bereits implementiert. (=~)