Wie kann ich Unix grep in Perl implementieren?

7

Wie kann ich grep von Unix in Perl implementieren? Ich habe versucht, Perls eingebautes grep zu verwenden. Hier ist der Code, der nicht funktioniert:

%Vor%

Und ich probiere übrigens nur grundlegende grep -Funktionalität nicht voll aus und zweitens möchte ich keine String-Analyse machen. Ich möchte inbuilt grep oder eine Funktion von Perl verwenden.

Vielen Dank im Voraus:)

    
TCM 03.10.2010, 02:51
quelle

5 Antworten

13

Um ein ganzes Array zu beziehen, verwenden wir @ . Aber um die einzelnen Elemente zu bezeichnen, die skalar sind, verwenden wir $ .

Sie müssen also in diesen Zeilen $ und nicht @ verwenden:

%Vor%

Auch

das

%Vor%

sollte

sein %Vor%

Das grep in Perl hat die allgemeine Syntax:

%Vor%

Er wertet die EXPR für jedes Element von LIST aus und gibt den Listenwert zurück, der aus den Elementen besteht, für die der Ausdruck als true ausgewertet wurde.

Die EXPR sucht in Ihrem Fall nach dem Muster $pattern im Array @arr . Um zu suchen, müssen Sie /PATTERN/ ohne / verwenden. Die Zeichenfolge $pattern wird für "true" oder "false" ausgewertet.

    
codaddict 03.10.2010, 03:01
quelle
13

Natürlich ist die Antwort von codaddict richtig, aber ich möchte einige Anmerkungen hinzufügen:

Sie sollten Ihre Skripts immer mit diesen zwei Zeilen beginnen:

%Vor%

Verwenden Sie drei offene Argumente und testen Sie auf Fehler:

%Vor%

Und wegen use strict musst du alle Variablen deklarieren. Dein Skript wird also wie folgt aussehen:

%Vor%

Wenn Ihre Datei groß ist, können Sie vermeiden, sie vollständig im Speicher zu lesen:

%Vor%     
Toto 03.10.2010 12:01
quelle
13

Da Sie bereits eine Antwort angenommen haben, schreibe ich diese Antwort als Referenz für zukünftige Leser, die ähnliche Probleme suchen, aber nicht genau Ihre:

Wie die Leute bereits geantwortet haben, ist die Methode, Grep mit Perl zu simulieren, der Online-Ansatz. Für die Verwendung von Perl als 'besseres' Grep (und finden und schneiden und ...) empfehle ich das Buch minimal perl und du hast Glück weil das Kapitel für "perl als ein besseres" grep eines der Beispielkapitel ist.

Hier haben Sie weitere Beispiele aus dem Buch:

%Vor%

Im letzten Beispiel ist ARGV das aktuelle Dateihandle, und wie bei -l interessiert, Dateien mit der Übereinstimmung zu finden, können Sie den Dateinamen drucken und nach der ersten Übereinstimmung in einer Datei nach der nächsten Datei suchen.

Sie können auch nach Absatz anstatt nach Zeile suchen:

%Vor%

Oder finden Sie nur die erste Übereinstimmung:

%Vor%

Und schließlich, wenn Sie nach Grep und Perl fragen, denke ich, dass ich ACK erwähnen sollte. Es implementiert in Perl die grep-Funktionalität und erweitert sie. Dies ist ein wunderbares Werkzeug und als ein Plus können Sie es auch als CPAN-Paket haben. Ich habe immer als Befehlszeile verwendet, ich weiß nicht, ob Sie direkt von Ihren Perl-Programmen auf ihre Methoden zugreifen können, aber das wäre sehr nett.

    
Pablo Marin-Garcia 03.10.2010 18:36
quelle
11

Sie können eine primitive Version von grep direkt in der Befehlszeile approximieren. Mit der Option -e können Sie ein Perl-Skript in der Befehlszeile definieren. Die Option -n umschließt das Skript ungefähr wie folgt: while (<>){ SCRIPT } .

%Vor%

Eine etwas bessere Annäherung von grep würde den Dateinamen vor jeder gedruckten Übereinstimmung voranstellen. Beachten Sie, dass dieses Beispiel, wie das oben genannte, nicht die Mühe macht, Dateien zu öffnen. Stattdessen verwenden wir Perls <> -Konstrukt, um alle Dateien zu durchlaufen, und die $ARGV -Variable liefert den aktuellen Dateinamen.

%Vor%     
FMc 03.10.2010 12:58
quelle
4

Die grundlegende "grep" -Funktionalität ist bereits implementiert. (= ~)

%Vor%     
ghostdog74 03.10.2010 03:16
quelle

Tags und Links