die PHP function "empty" übernehmen
MrSpoocy
- perl
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 ?
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
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
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