Schrift
[thread]9901[/thread]

Zeilenumbruch für foreach



<< >> 8 Einträge, 1 Seite
Gast Gast
 2007-08-01 00:41
#96998 #96998
Hallo Leute,

irgendwie stehe ich gerade auf dem Schlauch - bitte hilf mir mal jemand runter...

ich möchte den output eines prozesses parsen. da das relativ komplex ist, habe ich vor das zweistufig zu machen. ich lese also von marke zu marke und schreibe die ergebnisse in einen String. wenn ich den dann wieder Zeilenweise auslesen möchte, betrachtet "foreach" den inhalt jedoch nur als EINE zeile, was die Sache beim weiteren Parsen ziemlich erschwert :(
Kann mir dazu jemand bitte nen Tip geben?

Hier das Prob als Pseudo-Code:

while (<PROC>) {
if (/marke/) {
print "marke"
} elsif (/marke2/ ) {
mystring .= "$_";
} else {
my_function ($mysting);
}

sub my_function () {
foreach (@_[0]) {
print "Zeile: $_\n"; ## <-- hier ist das Problem, "Zeile" wird nur einmal ausgegeben obwohl viele Zeilen in $mystring sind!
}
}
Strat
 2007-08-01 00:54
#97000 #97000
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@_[0] ist das erste Element von @_ im Listenkontext; grundsaetzlich sollte da $_[0] verwendet werden.

Aber du meinst wahrscheinlich
Code (perl): (dl )
1
2
3
4
5
sub my_function {
  foreach ( @_ ) {
    print "Zeile: $_\n";
  }
}


die Klammern bei sub my_function () solltest du weglassen (die fuehren zu Prototypen, einem ganz finsteren Kapitel von perl)

nebenbei ist
Code: (dl )
while (<PROC>) {

gefaehrlich, weil while die Variable $_ nicht lokalisiert. Da besser eine benannte variable verwenden, z.B.
Code (perl): (dl )
while( my $line = <PROC> ) {

oder - wenn du unbedingt $_ verwenden willst
Code: (dl )
while( local $_ = <PROC> ) {
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2007-08-01 01:13
#97007 #97007
Hallo,

herzlichen Dank für die schnelle Antwort.
Ich fürchte, ich habe da ein paar Verständnisprobleme.

Von Prototypen habe ich noch nie was gehört, ich hoffe ich kann das für mein aktuelles Problem einfach ignorieren. Die Klammern hab ich mal entfernt.

Darf ich das Prob mal runterbrechen...ich habe ein Hauptprogramm, in dem ich mehrere Variablen habe. Diese möchte ich nicht als globale verwenden, sondern als Parameter übergeben. Ich versuche nochmal in Pseudo-Code das zu zeigen.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sub main {
$var1 = "zeile1
zeile2
zeile3";
$var2 = "string";

my_function($var1, $var2);
}

sub my_function {
@v1 = @_[0];
$v2 = @_[1];

foreach ( @v1 ) {
print "Zeile: $_\n";
}

print "$v2";
}


was ich erwarte ist diese Ausgabe:
Zeile: zeile1
Zeile: zeile2
Zeile: zeile3
string

Ich bekomme aber:
Zeile: zeile1
zeile2
zeile3
string

Was mache ich da falsch?

Quote
nebenbei ist
Code: (dl )
while (<PROC>) {

gefaehrlich, weil while die Variable $_ nicht lokalisiert. Da besser eine benannte variable verwenden, z.B.
Code (perl): (dl )
while( my $line = <PROC> ) {


gut zu wissen, danke für den Tip!
Nur ist halt mit Regex viel einfacher zu parsen, wenn der aktuelle Wert in $_ liegt
Oder gibts da ne einfache Syntax?
PerlProfi
 2007-08-01 01:17
#97011 #97011
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Ich sehe das Problem noch in der Logik: In einen String schreibst du Text ( mit mehreren Zeilenumbrüchen ) und diesen übergibst du dann einer Funktion, in welcher du erwartest, dass du nicht nur einen String bekommst sondern mehrere ( die Zeilen der Programmausgabe ).

Wieso benutzt du nicht ein Array und übergibst diesen an deine Funktion:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my @rows;
while ( my $line = <PROC> ) {
chomp($line);
if ( /marke/ ) {
print "marke";
}
elsif ( /marke2/ ) {
push( @rows, $line);
}
else {
my_function(@rows);
}
}


Und deine Funktion könnte dann so aufgebaut sein wie strat schon geschrieben hat.

MfG

edit: die 3. antwort war nioch nicht da als ich das hier geschrieben habe...
Sie dir mal an was strat geschrieben hat, $_[0] ist der 1. übergebene Parameter, nicht @_[0], @_[0] ist ein Arrayslice. (bei einem Element kommt halt das selbe raus)
Deine Ausgabe ist ganz normal. Du übergibst eben nur einen String keinen Array.
Falls du keinen Array benutzen willst musst du eben deinen String splitten.
Strat
 2007-08-01 01:32
#97018 #97018
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Prototypen kannst du fuer die naechsten paar Jahre ignorieren.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sub main {
    $var1 = "zeile1
zeile2
zeile3";
    $var2 = "string";

    my_function($var1, $var2);
}

sub my_function {
    # du willst lokale variablen?
    my( $var1, $v2 ) = @_; # diese $var1 und $v2 sind nur in dieser sub gueltig

    # $v1 ist eine skalare Variable (eine Zeichenkette), keine Liste. Wenn
    # du die Zeichenkette nach Zeilenumbruch aufsplitten willst, dann
    my @v1 = split( /\n/, $var1 );

    foreach ( @v1 ) {
        print "Zeile: $_\n";
    }

    print "$v2";
}


Aber PerlProfi's Array-Loesung finde ich besser.

Schau dir vielleicht mal das Kapitel Parameteruebergabe in meiner Einfuehrung in Perl ( http://www.fabiani.net/ -> Vortraege ) an, da stehen einige Beispiele dazu
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2007-08-01 01:59
#97022 #97022
Herzlichen Dank Euch beiden für die Hilfe zu später Stunde.
Irgendwie hab ich aber immer noch nen Knoten drin...
Ich probiers morgen nochmal!
Gast Gast
 2007-08-01 18:58
#97147 #97147
Hallo nochmal,

herzlichen Dank für Eure Tips.
Heute hab ich mir das ganze nochmal in der Mittagspause angeschaut, jetzt klappt das auch mit der Übergabe.

Könnt Ihr mir vielleicht noch bei einer Verständnisfrage zur Sytax bei regex helfen?

Wenn ich den Inhalt einer Variablen untersuchen möchte, geht das am einfachsten, wenn der Inhalt in $_ steht, oder?

wenn ich nun etwas in dieser Form habe:

Code (perl): (dl )
1
2
3
4
5
foreach $line ( @rows ) {
if ( /marke/ ) {
# wird diese Marke nun in $line gesucht?
print "ok\n";
}


auf welche Variable wirkt die Regex dann?

Oder generell:
wie kann ich eine Regex auf eine beliebige Variable anwenden?

Vielen Dank und Grüße,
Holger
renee
 2007-08-01 18:59
#97148 #97148
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn Du nix dazu schreibst, wird automatisch $_ genommen. Hier müsstest Du also $line =~ /marke/ machen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 8 Einträge, 1 Seite



View all threads created 2007-08-01 00:41.