Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11720[/thread]

while bzw. Datei durchsuchen, Hilfe gesucht

Leser: 2


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
optron
 2008-04-29 01:48
#108962 #108962
User since
2008-04-29
3 Artikel
BenutzerIn
[default_avatar]
Hallo
erstmal zum Sachverhalt. Ich hab eine Quelle.dat in folgendem Format
KN P 5612|rot|Opel|Hans Spiddel|
FN KT 2|gruen|VW|Michael Kohlhaas|
VS RT 926|rot|Opel|Peter Pan|

jetzt will ich das Kennzeichen eingeben und perl soll mir alle daten einer zeile angeben und die andern nicht.
ich dachte ich löse das mal auf die nachfolgende art. leider klappt es nicht. kann mir einer von euch weiterhelfen ich komme einfach nicht weiter.

Mal als ganzes Beispiel ich geb den wert ein "rot"
dann soll dieses ergebnis rauskommen

"KN P 5612 Hans Spiddel Opel rot
VS RT 926 Peter Pan Opel rot"

was heißt ist der wert in mehr als einer zeile sollen alle möglichen ergebnise gezeigt werden mit allen daten.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/perl

$wert= <STDIN>;

$gefunden = 0;

open(LESEN,"<Quelle.dat") or scripterror("Fehler: Kann Quelle.dat nicht oeffnen!",$!);
while ($linie = <LESEN>) {
chomp($linie);

($Kennzeichen,$Farbe,$Marke,$Halter) = split(/|/, $linie);

if ($wert eq $Kennzeichen or $Farbe or $Marke or $Halter ) {

$gefunden = 1;
last;
}
}
close(LESEN);

if (!$gefunden) {
print "Nicht gefunden!!!";
exit;
} else {
print "$Kennzeichen\n";
print "$Halter\n";
print "$Marke\n";
print "$Farbe\n";
}
styx-cc
 2008-04-29 02:20
#108963 #108963
User since
2006-05-20
533 Artikel
BenutzerIn

user image
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
#!/usr/bin/perl -w
use strict;
use Data::Dumper;

#vergelichswert abfragen
print "Wert eingeben: ";
chomp(my $input = <STDIN>);

#datei druchlaufen
my @result;
while (local $_ = <DATA>) {
  my @parts = split /\|/; #aufspalten der einzelzeile
  if (grep {$_ eq $input} @parts) { #vegleich v. input mit einzelteilen d. zeile
    push @result, @parts; #ergebnis bei match hinzufuegen
  }
}

print Dumper @result; #ausgabe

__DATA__
KN P 5612|rot|Opel|Hans Spiddel|
FN KT 2|gruen|VW|Michael Kohlhaas|
VS RT 926|rot|Opel|Peter Pan|


MfG
Pörl.
Gast Gast
 2008-04-29 13:08
#108978 #108978
Ist es besser
Code (perl): (dl )
 while (local $_ = <DATA>) { ... 
als nur
Code (perl): (dl )
 while (<DATA>) { ... 
zu schreiben?
renee
 2008-04-29 13:19
#108979 #108979
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
rbaecker@test ~ $ vi local.pl
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'hallo';

print;

while( <DATA> ){ chomp }

print;

__END__
test
rbaecker@test ~ $ perl local.pl
Use of uninitialized value in print at local.pl line 12, <DATA> line 2.
hallo


vs.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
rbaecker@test ~ $ vi local.pl
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'hallo';

print;

while( local $_ = <DATA> ){ chomp }

print;

__END__
test
rbaecker@test ~ $ perl local.pl
hallohallo
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/
pktm
 2008-04-29 13:32
#108984 #108984
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Gast+2008-04-29 11:08:42--
Ist es besser
Code (perl): (dl )
 while (local $_ = <DATA>) { ... 
als nur
Code (perl): (dl )
 while (<DATA>) { ... 
zu schreiben?


So zu Zwecken der Leserlichkeit verwende ich da immer ien Variable, z.B. [tt]wile( my $line = <DATA> { ... }). Das hat auch den Vorteil, dass $_ dann innerhalb der Schleife leichter für andere Dinge benutzt werden kann.
Die Default-Variable ist unheinlich praktisch, aber die kann auch schnell zu schwer zu findenen Fehlern führen.

Sowieso würde ich FileHandle empfehlen:
Code: (dl )
1
2
3
4
5
    my $fh = new FileHandle;
if ($fh->open("< file")) {
print <$fh>;
$fh->close();
}


Und nimm use strict;, das weist dich auf viele Fehler hin.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
KurtZ
 2008-04-29 14:51
#108991 #108991
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
@renee: ich bin etwas verwirrt... was macht while hier per default?

my $_ kanns nicht sein, weil $_ global sein muss [1]
local $_ auch nicht, sonst wäre ein explizites local nicht notwendig.

so wie es hier aussieht wird hinter while das globale $_ explizit auf undef gesetzt!
wieso?

[1] gehörts eigentlich zu einem Package? ... tatsächlich aber immer $main::_
TMTOWTDYOG (there's more than one way to dig your own grave)
renee
 2008-04-29 14:55
#108992 #108992
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
KurtZ+2008-04-29 12:51:00--
so wie es hier aussieht wird hinter while das globale $_ explizit auf undef gesetzt!
wieso?


das ist ein while( $_ = <DATA> ){} und solange $_ defined ist, wird die Schleife ja weiter ausgeführt. Erst wenn $_ (und damit das globale $_) undef ist, ist die Bedingung der while-Schleife "false" und die Schleife wird verlassen...
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/
KurtZ
 2008-04-29 14:58
#108993 #108993
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
ahh (hand auf stirn klatsch) danke! : )
TMTOWTDYOG (there's more than one way to dig your own grave)
renee
 2008-04-29 15:01
#108994 #108994
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
KurtZ+2008-04-29 12:51:00--
gehörts eigentlich zu einem Package? ... tatsächlich aber immer $main::_


Deswegen $_ nur ganz gezielt einsetzen... Sonst schießt man sich selbst in den Fuß.

Beispiel:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'hallo';

while( local $_ =  <DATA> ){ chomp }

require MyTest;

print;

__END__
test


Und MyTest.pm
Code (perl): (dl )
1
2
3
package MyTest;

$_ = 123;


Und was gibt es aus?

Code: (dl )
123


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/
KurtZ
 2008-04-29 16:11
#108999 #108999
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
renee+2008-04-29 13:01:01--
Deswegen $_ nur ganz gezielt einsetzen... Sonst schießt man sich selbst in den Fuß.


schon klar, ich nutze $_ nur im kleinen überschaubaren Kontext und würde eine Variable viel eher benennen als local zu nutzen.

Für ad-hoc Scripte ist Kurzschreibweise auch OK, aber bei langlebigen Programmen ist mir Wart- und Lesbarkeit wichtiger.

Schön wäre da nur, wenn man im Emacs[1] mit wenigen Handgriffen Code entsprechend Refactorieren könnte ...

[EDIT:1] oder natürlich einem anderen Editor...
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2008-04-29 01:48.