Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6485[/thread]

Arrayref aus Skalar-Rückgabewert

Leser: 1


<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
pktm
 2004-08-10 22:28
#85668 #85668
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich habe eine Sub die mir was zurück gibt.
Das kann wahlweise ein Skalar oder ein Arrayref sein.
Wie kann ich jetzt jeweils den ersten Wert bekommen ohne aufwendig prüfen zu müssen, wie viele Ergebnisse zurück kommen, bzw. ob ein Scalar oder eine Arrayref zurück kommt?

Die Sub ist my $results->invalid() aus dem Modul Data::FormValidator (vgl. Data::FormValidator::Results)

Mein Aufruf ging bislang so:
my $feld = $results->invalid()->[0];
Das setzt aber eine Arrayref vorraus.

mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
steffenw
 2004-08-10 23:09
#85669 #85669
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code: (dl )
ref(my $feld = $results->invalid()) eq 'ARRAY' and $feld = $feld->[0];
oder
Code: (dl )
ref(my $feld = $results->invalid()) eq 'ARRAY' and ($feld) = @$feld;
\n\n

<!--EDIT|steffenw|1092165169-->
$SIG{USER} = sub {love 'Perl' or die};
Ronnie
 2004-08-11 01:20
#85670 #85670
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
my $feld = $results->invalid();
$feld = ref $feld ? $feld->[0]: $feld;

Ich finde es so etwas lesbarer - ist aber einfach persönliche Präferenz.

Gruß,
Ronnie\n\n

<!--EDIT|Ronnie|1092172992-->
pktm
 2004-08-11 02:04
#85671 #85671
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Nächste Möglichkeit:
           my @ref = $results->invalid();
           my $feld = $ref[0];
Allerdings gefällt mir steffenws Antwort etwas besser, da ich da alles in einer Zeile habe.
Die anderen sind allerdings lesbarer und da das ganze mal publiziert werden soll...
mfg pktm\n\n

<!--EDIT|pktm|1092175524-->
http://www.intergastro-service.de (mein erstes CMS :) )
FtR
 2004-08-11 02:31
#85672 #85672
User since
2003-08-20
39 Artikel
BenutzerIn
[default_avatar]
wenn du auch die subfunktion ändern kannst
könntes du da evtl. auch "wantarray" einsetzen um zu schauen was du wärend des aufrufs der funkktion erwartest und entsprechend reagieren

FtR\n\n

<!--EDIT|FtR|1092177129-->
Code: ()
1
2
print&f(($_=(3x3)."3+33")=~s=3(?![^3]|$)=&f=eg);
sub f{eval(@_?$_:"'$&+'x3");}
steffenw
 2004-08-11 09:48
#85673 #85673
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich hatt ganz bewußt den ?:-Operator nicht benutzt, weil es dann in der scalaren Variante zu einer sinnlosen Zuweisung von $feld= $feld kommt.
$SIG{USER} = sub {love 'Perl' or die};
Ronnie
 2004-08-11 09:55
#85674 #85674
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Stimmt, ich finde dein Lösung auch schöner/perliger - habe aber erst mal einen Moment drüber nachdenken müssen, wieso sie funktioniert.

Gruß,
ronnie
esskar
 2004-08-11 10:05
#85675 #85675
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
es funzt aber irgendwie gar nicht...
Code: (dl )
1
2
3
4
5
6
use strict;
my $feld = "Hallo";
ref(my $feld = []);
print $feld;
^Z
ARRAY(0x22544c)


Code: (dl )
1
2
3
4
ref(my $feld = [1]) eq 'ARRAY' and ($feld) = @$feld;
print $feld;
^Z
ARRAY(0x22544c)


Code: (dl )
1
2
3
4
ref(my $feld = [1]) eq 'ARRAY' and $feld = $feld->[0];
print $feld;
^Z
ARRAY(0x22544c)
esskar
 2004-08-11 10:08
#85676 #85676
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
was geht

Code: (dl )
1
2
3
4
5
my $feld = [1];
ref($feld) and $feld = $feld->[0];
print $feld;
^Z
1
pq
 2004-08-11 11:10
#85677 #85677
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=pktm,10.08.2004, 20:28]Ich habe eine Sub die mir was zurück gibt.
Das kann wahlweise ein Skalar oder ein Arrayref sein.

Die Sub ist my $results->invalid() aus dem Modul Data::FormValidator (vgl. Data::FormValidator::Results)[/quote]
aus der doku:
Quote
invalid( [field] )

In an array context, it returns the list of fields which contains invalid value.

In a scalar context, it returns an hash reference which contains the invalid fields as keys, and references to arrays of failed constraints as values.

If called with an argument, it returns the reference to an array of failed constraints for field.

also hast du einen eindeutigen rückgabewert.
my @array = $results->invalid;
my $hashref = $results->invalid;
my $arrayref = $results->invalid('field');
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2004-08-10 22:28.