Mehrere Anweisungen vor if

Mehrere Anweisungen vor if

am 02.10.2006 01:14:12 von Todor Vachkov

Hallo allerseits,

wie kann ich mehrere Anweisungen einer IF-Anweisung voranstellen? Würde z.B.
die Positionierung von next zulässig:
while (COND) {
....
print "100 \$\$a$meta\n",next if $text eq 'Autor:';
....
}

Vielen Dank für Eure Hilfe im voraus!

Grüße
Todor

Re: Mehrere Anweisungen vor if

am 02.10.2006 01:29:47 von Mirco Wahab

Thus spoke Todor Vachkov (on 2006-10-02 01:14):
>
> wie kann ich mehrere Anweisungen einer IF-Anweisung voranstellen? Würde z.B.
> die Positionierung von next zulässig:
> while (COND) {
> ...
> print "100 \$\$a$meta\n",next if $text eq 'Autor:';
> ...
> }

Was ist das Problem dabei?

while( COND ) {
...
if ($text eq 'Autor:') {
print "100 \$\$a$meta\n";
next;
}
...
}


geht nicht?

M.

Re: Mehrere Anweisungen vor if

am 02.10.2006 02:05:21 von Todor Vachkov

Mirco Wahab wrote:

> Was ist das Problem dabei?
>
> while( COND ) {
> ...
> if ($text eq 'Autor:') {
> print "100 \$\$a$meta\n";
> next;
> }
> ...
> }
>
>
> geht nicht?
>
> M.
Ja, natürlich geht das:-) Das wäre aber die konventionelle Lösung. Ich
programmiere seit ein paar Wochen in Perl und mich interessiert vor allem
die perlartige Schreibweise. Mir fällt es aber schwer die Restriktionen bei
der Verwendung von verkürzten if(unless) usw. Kontrollstrukturen zu finden.

Grüsse
Todor

Re: Mehrere Anweisungen vor if

am 02.10.2006 02:31:05 von Mirco Wahab

Thus spoke Todor Vachkov (on 2006-10-02 02:05):
> Mirco Wahab wrote:
>> while( COND ) {
>> ...
>> if ($text eq 'Autor:') {
>> print "100 \$\$a$meta\n";
>> next;
>> }
>> ...
>> geht nicht?
>
> Ja, natürlich geht das:-) Das wäre aber die konventionelle Lösung. Ich
> programmiere seit ein paar Wochen in Perl und mich interessiert vor allem
> die perlartige Schreibweise. Mir fällt es aber schwer die Restriktionen bei
> der Verwendung von verkürzten if(unless) usw. Kontrollstrukturen zu finden.

Uhmm, o.k.

Ich habe zwar Dein genaues Vorhaben nicht
erraten können, aber ich glaube, Du wolltest
sowas:

my @text = qw(Futor: Eutor: Dutor: Butor: Autor: Zutor: Yutor: Xutor:);

print map "100 \$\$a $_\n", grep /^Autor:$/, @text;

machen (nur wenn Autor: auftaucht, irgendwas machen).
Das wäre dann "perlartige Schreibweise". Sowas in eine
while-Schleife zu packen, wäre äusserst 'unperlartig' ;-)

Aber wenn man wüsste, was Du genau vorhättest ...

M.

PS.: Es ist zwar verständlich, dass die neuerwählte
Sprache "coole und motivierende Merkmale" ent-
halten soll, - die man dann auch anwenden möchte,
aber davon würde ich in den ersten 2 Jahren
dringenst abraten ;-)

Es ist imho auch eine Art "Kunst", Quelltext auf
"herkömmliche Art" schön, fehlerfrei und zuverlässig
zu erstellen - und zwar so, dass er sofort von einem
anderen Programmierer verstanden werden kann ...

Re: Mehrere Anweisungen vor if

am 02.10.2006 09:11:07 von Ferry Bolhar

Todor Vackov:

> wie kann ich mehrere Anweisungen einer IF-Anweisung voranstellen? Würde
z.B.
> die Positionierung von next zulässig:
>
> print "100 \$\$a$meta\n",next if $text eq 'Autor:';

Im Fall von 'print' musst du den ganzen Befehl in Klammern
setzen, damit der Parser weiß, wo die auf 'print' folgende Liste
zu Ende ist und daher ein weiteres Komma als Operator und
nicht mehr als Listentrenner zu interpretieren ist:

(print "100 \$\$a$meta\n"), next if $text eq 'Autor:';

Den Kommaoperator kannst du im Prinzip immer verwenden,
es muss im Fall von Argumentlisten (wie bei print) nur klar
sein, was zur Liste gehört und was zum Operator.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Mehrere Anweisungen vor if

am 02.10.2006 10:40:42 von Helmut Wollmersdorfer

Todor Vachkov wrote:
> Mirco Wahab wrote:

>> while( COND ) {
>> ...
>> if ($text eq 'Autor:') {
>> print "100 \$\$a$meta\n";
>> next;
>> }
>> ...
>> }

> Ja, natürlich geht das:-) Das wäre aber die konventionelle Lösung. Ich
> programmiere seit ein paar Wochen in Perl und mich interessiert vor allem
> die perlartige Schreibweise.

In Perl gibt es viele Schreibweisen.

Wenn Du den Code auch noch nach mehreren Monaten verstehen willst, ist
eine explizite, sprechende und einfache Schreibweise IMHO günstiger.

Wenn das obige '$a' z.B. für 'Autor' steht, dann würde ich auch '$autor'
schreiben, und wenn es aus dem Zusammenhang nicht hervorgeht möglichst
'$autor_userid', '$autor_full_name' oder '$autor_mail_addr'.

Nachgestelltes 'if' verwende ich nur, wenn davor und dahinter was ganz
einfaches steht.

Helmut Wollmersdorfer

Re: Mehrere Anweisungen vor if

am 03.10.2006 02:00:34 von Erkan Yanar

Ferry Bolhar wrote:
> Todor Vackov:
>
>> wie kann ich mehrere Anweisungen einer IF-Anweisung voranstellen? Würde
> z.B.
>> die Positionierung von next zulässig:
>>
>> print "100 \$\$a$meta\n",next if $text eq 'Autor:';
>
> Im Fall von 'print' musst du den ganzen Befehl in Klammern
> setzen, damit der Parser weiß, wo die auf 'print' folgende Liste
> zu Ende ist und daher ein weiteres Komma als Operator und
> nicht mehr als Listentrenner zu interpretieren ist:
>
Richtige Erklärung[1] aber folgende Zeile ist da missverständlich.

> (print "100 \$\$a$meta\n"), next if $text eq 'Autor:';

print ("100 \$\$a$meta\n"), next if $text eq 'Autor:';

Ist hier plausibler. print ist ein Listenoperator und durch () kann man
die Liste (künstlich) begrenzen.

Das eigentliche Problem von print "wort", next ist, dass print eine
Liste aus zwei Elementen erhält, wobei next erst mal ausgeführt werden
muss.


tschazu
erkan

[1] Der Listentrenner "," ist auch ein Operator.


--
über den grenzen muß die freiheit wohl wolkenlos sein

Re: Mehrere Anweisungen vor if

am 03.10.2006 10:23:11 von Frank Seitz

Erkan Yanar wrote:
> Ferry Bolhar wrote:
>>
>>(print "100 \$\$a$meta\n"), next if $text eq 'Autor:';
>
> print ("100 \$\$a$meta\n"), next if $text eq 'Autor:';
>
> Ist hier plausibler. print ist ein Listenoperator und durch () kann man
> die Liste (künstlich) begrenzen.

Zustimmung. Nur das Leerzeichen würde ich noch weglassen.
Oder schreibst Du Funktionsaufrufe immer so?

> Das eigentliche Problem von print "wort", next ist, dass print eine
> Liste aus zwei Elementen erhält, wobei next erst mal ausgeführt werden
> muss.

Vielleicht meinst Du das Richtige, drückst es nur unklar aus:
Wenn next als Funktionsargument auftritt, wird die Funktion (hier print)
niemals aufgerufen, da die Argumentliste vor dem Aufruf
ausgewertet wird. Denn sobald der Interpreter auf next stößt, wird
der Programmfluss sofort an anderer Stelle fortgesetzt.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Mehrere Anweisungen vor if

am 03.10.2006 20:59:13 von Erkan Yanar

Frank Seitz wrote:
> Erkan Yanar wrote:
>> Ferry Bolhar wrote:
>>>
>>>(print "100 \$\$a$meta\n"), next if $text eq 'Autor:';
>>
>> print ("100 \$\$a$meta\n"), next if $text eq 'Autor:';
>>
>> Ist hier plausibler. print ist ein Listenoperator und durch () kann man
>> die Liste (künstlich) begrenzen.
>
> Zustimmung. Nur das Leerzeichen würde ich noch weglassen.
> Oder schreibst Du Funktionsaufrufe immer so?

Stimme ich zu, wobei ich eigentlich nie Klammern benutze.
>
>> Das eigentliche Problem von print "wort", next ist, dass print eine
>> Liste aus zwei Elementen erhält, wobei next erst mal ausgeführt werden
>> muss.
>
> Vielleicht meinst Du das Richtige, drückst es nur unklar aus:
> Wenn next als Funktionsargument auftritt, wird die Funktion (hier print)
> niemals aufgerufen, da die Argumentliste vor dem Aufruf
> ausgewertet wird. Denn sobald der Interpreter auf next stößt, wird
> der Programmfluss sofort an anderer Stelle fortgesetzt.
>

super danke
erkan


--
über den grenzen muß die freiheit wohl wolkenlos sein

Re: Mehrere Anweisungen vor if

am 05.10.2006 08:29:39 von Ferry Bolhar

Erkan Yanar:

> print ("100 \$\$a$meta\n"), next if $text eq 'Autor:';
>
> Ist hier plausibler. print ist ein Listenoperator und durch () kann man
> die Liste (künstlich) begrenzen.

Mit 'use warnings' bekomme ich da allerdings:

print (...) interpreted as function

Klammern man den ganzen Befehl, funktioniert es auch, aber man
bekommt man die Fehlermeldung nicht.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Mehrere Anweisungen vor if

am 05.10.2006 09:38:50 von hjp-usenet2

On 2006-10-05 06:29, Ferry Bolhar wrote:
> Erkan Yanar:
>> print ("100 \$\$a$meta\n"), next if $text eq 'Autor:';
>>
>> Ist hier plausibler. print ist ein Listenoperator und durch () kann
>> man die Liste (künstlich) begrenzen.
>
> Mit 'use warnings' bekomme ich da allerdings:
>
> print (...) interpreted as function

Die Warnung verschwindet aber, wenn man das hässliche und irreführende
Space nach der Klammer entfernt:

print("100 \$\$a$meta\n"), next if $text eq 'Autor:';

hp


--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd

Re: Mehrere Anweisungen vor if

am 05.10.2006 09:50:13 von Frank Seitz

Ferry Bolhar wrote:
> Erkan Yanar:
>>
>> print ("100 \$\$a$meta\n"), next if $text eq 'Autor:';
>>
>>Ist hier plausibler. print ist ein Listenoperator und durch () kann man
>>die Liste (künstlich) begrenzen.
>
> Mit 'use warnings' bekomme ich da allerdings:
>
> print (...) interpreted as function
>
> Klammern man den ganzen Befehl, funktioniert es auch, aber man
> bekommt man die Fehlermeldung nicht.

Die Meldung gibt es auch nicht, wenn man keinen Leerraum
zwischen print und die Klammern schreibt.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Mehrere Anweisungen vor if

am 05.10.2006 16:13:09 von Todor Vachkov

Hallo,

vielen Dank fuer die ausfuehrichen Statements und Ratschlaege!
Ich bin uebrigens bei der klassischen if-Variante geblieben und weil die if
- Abfragen bei mir ca. 20 sind, schreibe ich sie doch jeweils auf einer
Zeile. Zumindenst optisch sieht es wie ein nachgestelltes "IF" :-)

MfG
Todor

Re: Mehrere Anweisungen vor if

am 06.10.2006 08:46:35 von Ferry Bolhar

Frank Seitz:

> Die Meldung gibt es auch nicht, wenn man keinen Leerraum
> zwischen print und die Klammern schreibt.

Sieh an, sieh an, und dabei heißt es doch immer, dass in Perl
Whitespace-Zeichen keine Rolle spielen!

Scheinbar tun sie das manchmal doch...

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Mehrere Anweisungen vor if

am 07.10.2006 10:26:07 von Frank Seitz

Ferry Bolhar wrote:
> Frank Seitz:
>>
>>Die Meldung gibt es auch nicht, wenn man keinen Leerraum
>>zwischen print und die Klammern schreibt.
>
> Sieh an, sieh an, und dabei heißt es doch immer, dass in Perl
> Whitespace-Zeichen keine Rolle spielen!
>
> Scheinbar tun sie das manchmal doch...

Schau Dir mal die Beispiele am Anfang von

$ perldoc perlfunc

an, dann wird klar, warum das so ist.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Mehrere Anweisungen vor if

am 09.10.2006 09:36:03 von Ferry Bolhar

Franl Seitz:

>> Sieh an, sieh an, und dabei heißt es doch immer, dass in Perl
>> Whitespace-Zeichen keine Rolle spielen!
> >
> > Scheinbar tun sie das manchmal doch...
>
> Schau Dir mal die Beispiele am Anfang von
>
> $ perldoc perlfunc
>
> an, dann wird klar, warum das so ist.

Meinst du? Ich finde, dort steht eher das Gegenteil:

"And whitespace between the function and left parenthesis
doesn't count..."

Daraus würde ich doch folgern, dass es egal ist, ob und
wieviele Whitspace-Zeichen nach dem "print" kommen.

Dieser Widerspruch war ja letztlich Grund meiner Frage...

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Mehrere Anweisungen vor if

am 09.10.2006 09:56:11 von Christian Lackas

* Ferry Bolhar [2006-10-09]:

Hallo Ferry,

> > Schau Dir mal die Beispiele am Anfang von
> > $ perldoc perlfunc
> > an, dann wird klar, warum das so ist.
> Meinst du? Ich finde, dort steht eher das Gegenteil:
> "And whitespace between the function and left parenthesis
> doesn't count..."
> Daraus würde ich doch folgern, dass es egal ist, ob und
> wieviele Whitspace-Zeichen nach dem "print" kommen.

das eigentliche Problem wird in perlop besprochen:

Terms and List Operators (Leftward)

Das Problem läßt sich darauf zurückführen, dass z.B. print keine
Funktion in dem Sinne, sondern ein Listenoperator ist.

Gruß
Christian

--
Es gibt Zeiten, wo einem alles gelingt. Aber das braucht niemanden
zu beunruhigen. Sie gehen sehr schnell vorüber...
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker

Re: Mehrere Anweisungen vor if

am 09.10.2006 14:15:11 von hjp-usenet2

On 2006-10-09 07:36, Ferry Bolhar wrote:
> Franl Seitz:
>>> Sieh an, sieh an, und dabei heißt es doch immer, dass in Perl
>>> Whitespace-Zeichen keine Rolle spielen!
>> >
>> > Scheinbar tun sie das manchmal doch...
>>
>> Schau Dir mal die Beispiele am Anfang von
>>
>> $ perldoc perlfunc
>>
>> an, dann wird klar, warum das so ist.
>
> Meinst du? Ich finde, dort steht eher das Gegenteil:
>
> "And whitespace between the function and left parenthesis
> doesn't count..."

So ist es. Und weil eben Whitespace für den Perl-Compiler keinen
Unterschied macht, für den Menschen aber schon, gibt es eine Warnung,
die darauf hinweist, dass man hier möglicherweise etwas anderes
geschrieben haben könnte, als man wollte.

hp


--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd

Re: Mehrere Anweisungen vor if

am 10.10.2006 08:46:13 von Ferry Bolhar

Peter J. Holzer:

> So ist es. Und weil eben Whitespace für den Perl-Compiler keinen
> Unterschied macht, für den Menschen aber schon, gibt es eine Warnung,
> die darauf hinweist, dass man hier möglicherweise etwas anderes
> geschrieben haben könnte, als man wollte.

Würde es tatsächlich "keinen Unterschied" machen, wäre das Verhalten
des Compilers in beiden Fällen dasselbe. Da dies aber nachweislich nicht
der Fall ist - in einem Fall wird eine Meldung ausgegeben, im anderen
nicht - macht es eben doch einen Unterschied. D.h,

print('Hallo') + 2; und
print ('Hallo') + 2;

ist _nicht_ dasselbe. Und das steht im Widerspruch zur Perl-Dokumentation,
die eben genau das sagt: Whitespaces spielen _keine_ Rolle ("zählen nicht")
für den Compiler. Denn in der Doku steht ja nicht, ob und wie sie für
Menschen Unterschiede machen, sondern dort geht es nur um Perl!

Deine Argumentation scheint mir nicht sehr schlüssig zu sein.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Mehrere Anweisungen vor if

am 10.10.2006 14:22:25 von Robert Sedlacek

Ferry Bolhar wrote
> Würde es tatsächlich "keinen Unterschied" machen, wäre das Verhalten
> des Compilers in beiden Fällen dasselbe. Da dies aber nachweislich nicht
> der Fall ist - in einem Fall wird eine Meldung ausgegeben, im anderen
> nicht - macht es eben doch einen Unterschied. D.h,

Es macht keinen Unterschied _fuer das Programm_. Perl gibt bei einigen
Konstrukten, die der Compiler als warnenswert einstuft, eben Warnungen
aus.

Wenn du beides durch -MO=Deparse jagst, kommt auch das selbe raus. Das
selbe gilt auch fuer Concise.

> ist _nicht_ dasselbe. Und das steht im Widerspruch zur Perl-Dokumentation,
> die eben genau das sagt: Whitespaces spielen _keine_ Rolle ("zählen nicht")
> für den Compiler. Denn in der Doku steht ja nicht, ob und wie sie für
> Menschen Unterschiede machen, sondern dort geht es nur um Perl!

Eben. Dem Compiler ist es egal, wie du es schreibst. Er sagt aber dir,
dem Menschen davor, dass du da vielleicht etwas falsch verstanden oder
anders gemeint haben koenntest.

hth,
p

--
The first rule of project mayhem is: you do not ask questions.
-- Fight Club

Re: Mehrere Anweisungen vor if

am 11.10.2006 14:54:06 von Robert Sedlacek

Robert 'phaylon' Sedlacek wrote
> Ferry Bolhar wrote
> > Würde es tatsächlich "keinen Unterschied" machen, wäre das Verhalten
> > des Compilers in beiden Fällen dasselbe. Da dies aber nachweislich nicht
> > der Fall ist - in einem Fall wird eine Meldung ausgegeben, im anderen
> > nicht - macht es eben doch einen Unterschied. D.h,
>
> Es macht keinen Unterschied _fuer das Programm_. Perl gibt bei einigen
> Konstrukten, die der Compiler als warnenswert einstuft, eben Warnungen
> aus.

Nachtrag: Hier ist ein Fall, bei dem ich dir allerdings zustimmen kann:



Gruß,
Robert

--
The eternal mistake of mankind is to set up an attainable ideal.
-- Aleister Crowley