Schrift
[thread]7738[/thread]

Ternärer Operator: ?:

Leser: 3


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Heromaster
 2006-02-24 19:43
#63281 #63281
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Hallo,

seit neuestem habe ich Probleme mit dem tertiären Operator. Wenn ich folgendes Script verwende:
Code: (dl )
1
2
my $test = 1;
$test ? print 'Ja' : print 'Nein';

gibt das Script ständig Nein aus. Formulier ich den Code aber um
Code: (dl )
1
2
my $test = 1;
if( $test ) { print 'Ja' }else{ print 'Nein' };

gibt mir das Script wie gewünscht Ja aus. Ich meine mich dunkel daran zu erinnern, das Variante 1 in früheren Perlversionen geklappt hat, mir das Script also Ja ausgibt. In perldelta fand ich aber ich keinen Hinweis für eine Änderung.

Testsystem: Windows XP, ActivePerl 5.8.4

Ein neues, undokumentiertes Feature von perl? ;)\n\n

<!--EDIT|Heromaster|1140803072-->
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
GwenDragon
 2006-02-24 19:53
#63282 #63282
User since
2005-01-17
14563 Artikel
Admin1
[Homepage]
user image
Bei mir geht es. Jedenfalls mit Perl 5.8.4.
~perl56
my $test = 1;
$test ? print 'Ja' : print 'Nein';
^Z
Ja
~
~
~perl58
my $test = 1;
$test ? print 'Ja' : print 'Nein';^Z
Ja
~
\n\n

<!--EDIT|GwenDragon|1140803724-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

GwenDragon
 2006-02-24 19:57
#63283 #63283
User since
2005-01-17
14563 Artikel
Admin1
[Homepage]
user image
tertiärer Operator? Ich dachte das Ding heißt ternärer Operator.
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Ronnie
 2006-02-24 20:15
#63284 #63284
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=GwenDragon,24.02.2006, 18:57]tertiärer Operator? Ich dachte das Ding heißt ternärer Operator.[/quote]
Ja, ternärer Operator ist richtig. Weil er drei Operanden hat. Aber er wird sinnvollerweise so verwendet:
Code: (dl )
print $test ? 'Ja' : 'Nein';
GwenDragon
 2006-02-24 20:30
#63285 #63285
User since
2005-01-17
14563 Artikel
Admin1
[Homepage]
user image
Ob sinnvoller? Weiß ich nicht, aber es spart Tipperei.
Ich verwende ja auch letztere Version, erstere ist aber genauso erlaubt.

? : ist ja sowieso nur eine if else abkürzung ;)
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Heromaster
 2006-02-24 21:15
#63286 #63286
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Hmm, merkwürdig. Ich glaub, ich sollte mal schauen, ob ich ne neue Version von Perl bekomme und dann nochmal probieren.
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
ptk
 2006-02-24 23:31
#63287 #63287
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=GwenDragon,24.02.2006, 19:30]Ob sinnvoller? Weiß ich nicht, aber es spart Tipperei.
Ich verwende ja auch letztere Version, erstere ist aber genauso erlaubt.

? : ist ja sowieso nur eine if else abkürzung ;)[/quote]
Nicht ganz, bei ? : wird ein Rückgabewert geliefert, bei if ... nicht. Deshalb ist Ronnies Vorschlag auch sinnvoll, da hier der Rückgabewert verwendet wird.
steffenw
 2006-02-25 09:00
#63288 #63288
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Der ternäre Operator hat sehr große Vorteile, gerade, wenn man dynamische Strukturen zusammenbaut:
Code: (dl )
1
2
3
4
5
%hash= (
 key1 => 'value1',
 $flag ? (key2 => 'value2') : (),
 key3 => 'value3',
);
Nur wenn $flag wahr ist, hat der Hash mehr als 2 keys/values.

Und weil es ihn schon lange gibt, kann man schon tertiär dazu sagen, das trifft den Kern und sollte daran erinnern, daß er oft eine gute Alternative zu kurzen if/...-Strukturen ist. Wer aber gern tippt oder kopiert und nach Codezeilen bezahlt wird, für den ist er nichts.
$SIG{USER} = sub {love 'Perl' or die};
renee
 2006-02-25 09:14
#63289 #63289
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dein Beispiel finde ich z.B. nicht so toll, da man bei einer Codedurchsicht das leicht uebersehen kann. Da finde ich ein
Code: (dl )
1
2
3
4
5
6
7
8
my %hash = (
          key1 => 'value1',
          key3 => 'value3',
       );

if($flag){
 $hash{key2} = 'value2';
}


viel besser lesbar (und wartbar)...\n\n

<!--EDIT|renee|1140851776-->
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/
FIFO
 2006-02-25 12:32
#63290 #63290
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Noch eine interessante Anwendung des terzolinären Operators sind if-elsif-elsif-...-else-Konstrukte (kaskadierte ifs), die werden nämlich besonders bei kurzen Blöcken/Anweisungen sehr übersichtlich:

Code: (dl )
1
2
3
4
my $anrede = $name =~ /heinz-willi/i ? 'Hi!'
: $name =~ /könig/i ? 'Majestät!'
: $alter < 6 ? 'Pimpf'
: 'Guten Tag';


steht in DamianConway: Perl Best Practices (O'Reilly)
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2006-02-24 19:43.