Schrift
[thread]11604[/thread]

Logische Operatoren



<< >> 10 Einträge, 1 Seite
Gast Gast
 2008-04-08 19:10
#108092 #108092
Habe da ein Problem mit der Reihenfolge der Ausführung von Anweisungen in Perl.
Ich will eine Datei durchsuchen, dazu habe ich folgenden Code:
Code: (dl )
1
2
3
while (<>) {
print if grep {/FOO/} $_;
}

Funktioniert einwandfrei. Ersetze ich dagegen die Anweisung durch:
Code: (dl )
grep {/FOO/} $_ && print;

erhalte ich nicht nur die gefundenen Zeilen, sondern alle.
Ein Klammern des GREPs löst das Problem, aber so richtig verstehen tu ich das Ganze nicht.

Wieso funktioniert meine 2te Anweisung nicht (so, wie ich will)?
betterworld
 2008-04-08 19:13
#108093 #108093
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Was genau denkst Du, das grep macht?

So kannst Du pruefen, ob FOO in $_ vorkommt:
Code: (dl )
if (/FOO/) { ... }


So fuer eine andere Variable:
Code: (dl )
if( $var =~ /FOO/ ) { ... }
renee
 2008-04-08 19:50
#108094 #108094
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dein Problem hat was mit der Rangfolge von Operatoren zu tun. Bei Dir wird grep{/FOO/}( $_ && print ) gemacht, also erst das && und dann das grep...
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/
betterworld
 2008-04-08 20:02
#108095 #108095
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
renee+2008-04-08 17:50:13--
Dein Problem hat was mit der Rangfolge von Operatoren zu tun. Bei Dir wird grep{/FOO/}( $_ && print ) gemacht, also erst das && und dann das grep...

Das ist wohl richtig, aber wie ich mit meinem Beitrag versuchte zu sagen, braucht man hier gar kein grep.
KurtZ
 2008-04-08 20:28
#108096 #108096
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
renee+2008-04-08 17:50:13--
Dein Problem hat was mit der Rangfolge von Operatoren zu tun. Bei Dir wird grep{/FOO/}( $_ && print ) gemacht, also erst das && und dann das grep...


und um sich die Klammern zu sparen gibts ja noch and
TMTOWTDYOG (there's more than one way to dig your own grave)
Gast Gast
 2008-04-08 21:11
#108101 #108101
Hi betterworld,
bin zwar noch nicht allzu sattelfest in Sachen Perl, aber eines hab ich schon gelernt, nämlich TMTOWTDI.
Ob grep oder was auch immer ging's mir nicht, sondern nur um's Prinzip. Ich denke, das mit der Rangfolge war's (das mit dem and probier ich noch aus).

In diesem Sinne,
danke für die Tips und bis denne
pq
 2008-04-08 21:26
#108102 #108102
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
timtowtdi bedeutet aber nicht, dass man völlig überflüssige funktionen um etwas drumrumbaut =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2008-04-08 22:32
#108103 #108103
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
pq+2008-04-08 19:26:34--
timtowtdi bedeutet aber nicht, dass man völlig überflüssige funktionen um etwas drumrumbaut =)

Ja, so sehe ich das auch. Man kennt es vielleicht aus der Shell-Programmierung so, dass man grep fuer regulaere Ausdruecke benutzt, aber in Perl macht grep eigentlich etwas ganz anderes, naemlich Sachen aus Listen heraussuchen. Ich wollte ja nur Deinem Verstaendnis helfen.

Es gibt zwar mehrere Wege, etwas zu tun, und das ist auch gut so. Manchmal nimmt man auch absichtlich ein Konstrukt, das eigentlich fuer etwas anderes gedacht ist. Aber man sollte sich immer darueber bewusst sein, wofuer das Konstrukt gedacht ist und wie es kommt, dass es gerade das tut, was ich erwarte.

Es ist auch ok, wenn es Dir hier nur ums Prinzip ging, ich hoffe wir haben Deine Fragen zur Operatorenrangfolge genuegend beantwortet. Zu && und and steht in perlop noch mehr.
murphy
 2008-04-08 22:35
#108104 #108104
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@pq: Well, there's not only more than one way to do it right, but also a multitude of ways to shoot yourself in the foot ;-)
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2008-04-08 22:51
#108105 #108105
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Was mir noch einfaellt: Wenn ich Dich frage, warum ich das Feuerzeug nicht ankriege, waere es ja auch ok, wenn Du nicht gleich sagst "Du musst den Hebel da umklappen" sondern "Geh erstmal von dem Benzintank weg" ;-) Nicht boese gemeint.
<< >> 10 Einträge, 1 Seite



View all threads created 2008-04-08 19:10.