MrSpoocy: die PHP function "empty" übernehmen

Hi,

ich würde gern die function emty() aus PHP in Perl umsetzen.
Hab da schon folgenden ansatz:

sub empty($)  
{  
	my $string = shift;  
  
	unless (defined $string)  
	{  
		return 1;  
	}  
	  
	if ($string eq "" || int($string) eq 0)  
	{  
		return 1;  
	}  
  
	#if (ref($string) eq "HASH")  
	# && keys($string) <= 0  
return 0;  
}

my $xm = undef;
print emtpy($xm);
$xm = 0;
print emtpy($xm);
$xm = "0";
print emtpy($xm);
$xm = "";
print emtpy($xm);

alles soweit richtig, nun will ich aber noch auf ARRAY und HASH regieren.
my @xm = ("")
print emtpy(@xm);

my %xm = ();
print emtpy(%xm);

Man sieht in der function auch schon denkansetze aber die wollen nicht so, hat jemand nee idee wie man das umsetzen kann ?

  1. Hallo MrSpoocy!

    alles soweit richtig,

    Ja?

    sub empty($)

    Warum Prototypes? Willst Du später auf die Klammer verzichten?

    if ($string eq "" || int($string) eq 0)

    ^^^^^^^^^^^  ^^

    int($zahl) ergibt eine Zahl. Hier ist ein numerischer Vergleich (==) angebracht. Und willst Du wirklich $string = 0.1234 als undefiniert oder leer betrachten?

    nun will ich aber noch auf ARRAY und HASH regieren.

    Du erwartest allen Anschein nach, dass Deiner Funktion einem einzigen String übergeben wird:

    my $string = shift;

    Warum übergibst Du ihr Du dann ein Array:

    print emtpy(@xm);

    oder einen Hash:

    print emtpy(%xm);

    ?

    Arbeite mit Referenzen!

    In Deiner auskommentierten Abfrage warst Du schon fast auf den richtigen Weg:

    if (ref $string eq "HASH")...

    Aber um an evtl. Keys zu kommen, musst Du dereferenzieren, weswegen es so:

    keys($string)

    nicht funzen™ kann.

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --
    _ - jenseits vom delirium - _

       Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
  2. Moin!

    ich würde gern die function emty() aus PHP in Perl umsetzen.

    Zu Perl kann ich nichts sagen, aber als Anmerkung: empty() ist KEINE Funktion in PHP, sondern ein Sprachkonstrukt. Das bedeutet, dass man empty() nicht als Ziel einer variablen Funktion verwenden kann.

    - Sven Rautenberg

  3. Moin Moin!

    ich würde gern die function emty() aus PHP in Perl umsetzen.

    Die ist in Perl implizit vorhanden, ein Nachbauen ist unnötig.

    http://de2.php.net/manual/en/function.empty.php sagt u.a.:

    empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set.

    Return Values

    Returns FALSE if var has a non-empty and non-zero value.

    The following things are considered to be empty:

    * "" (an empty string)
        * 0 (0 as an integer)
        * "0" (0 as a string)
        * NULL
        * FALSE
        * array() (an empty array)
        * var $var; (a variable declared, but without a value in a class)

    Mit anderen Worten:

      
    if (empty($var)) { ... }  
    
    

    schreibst Du in Perl als

      
    if (!$var) { ... }  
    
    

    oder lesbarer als

      
    unless ($var) { ... }  
    
    

    Wobei Du statt eines Scalars auch direkt ein Array (@var) einsetzen kannst. Anders als in PHP kannst Du auch ein Hash (%var) einsetzen, das gilt als leer, wenn es keine Schlüssel enthält.

    Wenn Du explizit einen boolschen Wert haben möchtest, castest Du die jeweilige Variable zu einem boolschen Wert, durch eine doppelte Negierung:

      
    $scalarIsPHPEmpty=!!$scalar;  
    $arrayIsPHPEmpty=!!@array;  
    $hashIsPHPEmpty=!!%hash;  
    
    

    Siehe auch perldata.

    Hab da schon folgenden ansatz:

    Unnötig, und mit einigen groben Fehlern, siehe Patricks Posting.

    Gewöhne Dir übrigens an, jedes Script mit

      
    use strict;  
    use warnings;  
    
    

    zu beginnen. Bei SetUID- und SetGID-Scripten sowie bei Netzwerk-Anwendungen aller Art (CGIs, eigene Server) solltest Du außerdem den Taint-Mode einschalten und ALLE Eingaben validieren:

      
    #!/usr/bin/perl -T  
    
    

    Alexander

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