Alexander (HH): Einfachste Lösung für bedingte Zuweisung

Beitrag lesen

Moin Moin!

ginge dann statt

my $xxx=$myhash{'element'}//0;


> auch das für mich verständlichere  
> ~~~perl
  

> my $xxx = defined($myhash{'element'}) ?  $myhash{'element'} : 0;  
> 

~~~?  
  
Klar, das geht.  
  
Nur ist a // b nicht exakt das gleiche wie defined(a) ? a : b, weil in der langen Form a zwei mal evaluiert wird. Bei Zugriffen auf Hash-Elemente sollte(\*) das harmlos sein, bei Funktionsaufrufen kann das auch mal schiefgehen:  
  
~~~perl
  
#!/usr/bin/perl  
  
use 5.010;  
  
use strict;  
use warnings;  
  
sub doof  
{  
	say "Hallo";  
	return 1;  
}  
  
my $xxx=doof() // 'bla';  
say "xxx=$xxx";  
  
my $yyy=defined(doof()) ? doof() : 'bla';  
say "yyy=$yyy";  

(*): "Sollte harmlos sein". Muß aber nicht. Spätestens mit Tied Hashes wird aus einem einfachen Lesezugriff ein Methodenaufruf.

  
#!/usr/bin/perl  
  
use 5.010;  
  
use strict;  
use warnings;  
  
{  
	package DoofHash;  
  
	# "You are not expected to understand this."  
  
	use Tie::Hash ();  
	our @ISA=qw(Tie::StdHash);  
  
	sub FETCH  
	{  
		say "Hallo";  
		$_[0]->SUPER::FETCH($_[1]);  
	}  
}  
  
my %hash;  
tie %hash,'DoofHash';  
$hash{'x'}='egal';  
  
my $xxx=$hash{'x'} // 'bla';  
say "xxx=$xxx";  
  
my $yyy=defined($hash{'x'}) ? $hash{'x'} : 'bla';  
say "yyy=$yyy";  

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".