2017-06-03 3 views
-1
open(LOGFILE,"<sim_success.log") or die("could not open file"); 
while (<LOGFILE>){ 
$line = $_; 
chomp($line); 
my @design = grep (/Design:/, $line); 
push (@final, @design); 
} 
print $final[0]; 

close LOGFILE; 

Entwurf: D: \ Test \ Beispiel \ Example1_wrk ....Wie zeichne ich Teilstrings/Wörter mit einem bestimmten Muster aus einem String in Perl?

Wie "Example_wrk" in einer var in Perl zu retten?

+0

Wenn wir $ final [1]> Nur ändern wird es wird ... Example2_wrk, muss das in var speichern – Harsh

+0

Sie haben also alle Zeilen gespeichert, die "Design:" im Array '@ final' entsprechen. Das ist eine Variable. Job erledigt? Die Frage scheint nicht zu erfassen, was Sie tatsächlich tun wollen. – bytepusher

+0

Sie wollen also den Weg aus der Linie nehmen? – simbabque

Antwort

0

Dies ist eine wilde Vermutung. Ich denke, was Sie wollen, ist den Dateinamen aus dieser Zeile der Protokolldatei zu erfassen.

use strict; 
use warnings; 

my @final; 
open my $fh, '<', 'sim_success.log' or die "could not open file: $!"; 
while (my $line = <$fh>) { 
    chomp $line; 
    if ($line =~ m/Design: (.+)$/) { 
     push @final, $1; 
    } 
} 
print $final[0]; # will print only the first one 
close $fh; 

Mal sehen, was ich getan habe. Ein Großteil davon wurde bereits in den Kommentaren von Melpomene zu dieser Frage erläutert. Ich wiederhole einige von ihnen.

  • immer use strict und use warnings! Sie helfen Ihnen, Fehler zu erkennen.
  • grep tut nicht, was Sie denken. Es dient dazu, Dinge in einer Liste zu finden, die einer Bedingung entsprechen. Deine Liste hatte nur einen Gegenstand. Die Linie.
  • können Sie den Operator m// direkt verwenden.
  • aber man braucht ein Capture-Gruppe (), die alles
  • und das aufgenommene Material in $1 erfasst werden, was wir können push auf das Array

Wenn das Programm fertig ist, das Array @final enthalten könnte ein oder mehrere Übereinstimmungen Wenn mehr als eine Zeile übereinstimmt, gibt es mehr Einträge im Array.

Verwandte Themen