Schrift
[thread]7347[/thread]

in_array() - Funktion bauen

Leser: 1


<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
Gast Gast
 2005-10-13 15:58
#58763 #58763
Übergib Referenzen, keine Arrays. Die sub bekommt *eine* Liste von Werten.
Gast Gast
 2005-10-13 16:35
#58764 #58764
Dann eben Perl6::Junction, das sollte kurzschließen.
Taulmarill
 2005-10-13 17:36
#58765 #58765
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich versuchs mal zu erklären:

wenn du eine liste übergibst, bekommst du auch eine liste in @_. dabei ist es egal, was in der liste drin steht. wenn du also einen scalar und einen array übergibst, bekommst du eine liste mit dem wert des scalars und den werten des arrays.
du solltest also eine referenz auf das array übergeben. z.b. myfunc( $scalar, \@array );. durch das \ vor der variable beinhaltet der ausdruck jetzt nicht den array, sondern eine referenz auf den array. in der sub könntest du dann folgendermassen an die werte kommen my ( $scalar, $array_referenz ) = @_;.

wie man mit referenzen und komplexeren datenstrukturen umgeht lernst du in perldoc reftut und perldoc perllol
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
pq
 2005-10-13 18:43
#58766 #58766
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=phaylon,13.10.2005, 16:11]
Code: (dl )
1
2
3
4
use Perl6::Junction qw/any/;
if ( any( @list ) >= 13 ) {
   # ...
}

.. finde ich aber dennoch hübscher. ;)[/quote]
ja, hübscher ist das schon, finde ich auch =)
ist auch noch einen tick intuitiver als first().
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
Gast Gast
 2005-10-13 15:00
#58767 #58767
Hallo an alle,

ich habe ein Problem. Und zwar brauche ich eine Funktion, die mir (wie bei PHP) sagt, ob ein Wert in einem Array vorhanden ist.

Folgendes hab ich ausprobiert:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub in_array{

my @arr = @_[1];
my $search = $_[0];

foreach (@arr) {
if($search eq $_) {
return 1;
}
}

return 0;
}


Den Aufruf wollte ich mit
Code: (dl )
in_array("suche", @arr);
machen. Leider gibt es ein Problem bei der Übergabe des Skalars und des Arrays, denn ich finde keine Möglichkeit das Array innerhalb der Funktion neu zu bilden (s. @arr = @_[1]). :(

Vielen Dank schon mal im Voraus!
rvi
 2005-10-13 15:33
#58768 #58768
User since
2005-10-13
2 Artikel
BenutzerIn
[default_avatar]
Danke, das hat schon mal geholfen, aber die Probleme bei der Übergabe des Arrays bestehen immer noch. :(
Taulmarill
 2005-10-13 16:00
#58769 #58769
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ähm, was phaylon meinte ist, dass die perlfunktion grep genau das macht was du willst. if ( grep /regex/, @array ) { print "jau\n" }
grep gibt im scalaren kontext (also z.B. bei if abfragen) keine liste sondern die anzahl der gefundenen elemente zurück.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
pq
 2005-10-13 16:30
#58770 #58770
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=phaylon,13.10.2005, 13:10]perldoc -f grep[/quote]
grep ist aber ineffizient.\n\n

<!--EDIT|pq|1129206775-->
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
Taulmarill
 2005-10-13 16:56
#58771 #58771
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
[quote=pq,13.10.2005, 14:30][quote=phaylon,13.10.2005, 13:10]perldoc -f grep[/quote]
grep ist aber ineffizient.[/quote]
kommt drauf an, wie man effizienz definiert. da grep eine perlfunktion ist kennen es die meisten. die laufzeit die verschwendet wird ist bei den meisten programmen irrelevant, da die listen klein genug sind. sobald ich ein modul einbinde oder eine eigene funktion schreibe, büße ich automatisch wartbarkeit ein. ausserdem kann das einbinden eines moduls und exportieren von funktionen schon mehr laufzeit kosten als das greppen durch eine kleine liste.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
rvi
 2005-10-13 17:07
#58772 #58772
User since
2005-10-13
2 Artikel
BenutzerIn
[default_avatar]
Okay okay, dass Grep mir hilft hab ich doch schon nach phaylons erster Antwort geschrieben!

Mir geht's jetzt einfach darum, dass wenn ich zwei unterschiedliche Typen übergebe (z.B. Referenz vom Array, Skalar), dann erhalte ich in @_ in der sub folgendes Ergebnis:

$_[0] = Wert von Skalar
$_[1] = Wert[0] von Array
$_[2] = Wert[1] von Array
$_[3] = Wert[2] von Array

und nicht, wie ich es mir eigentlich vorstellen würde

$_[0] = Wert von Skalar
$_[1] = Referenz des Arrays

Ich hoffe ich hab das verständlich rübergebracht. :|

Die Sache mit dem in_array() bzw. grep ist nun erledigt, mir geht es nur darum, dass ich nicht schnalle, wie ich das übergeben soll, bzw. wie ich dann (meiner Meinung nach) vernünftig damit weiterarbeiten kann. Anscheinend ist perl bei diesen Dingen ja doch sehr anders als ich es kenne, was ja auch absolut nicht schlimm ist, ich würde nur gerne wissen wie ich in einem solchen Fall vorgehe, damit ich die einzelnen Werte wieder in ein Array kriege.\n\n

<!--EDIT|rvi|1129208979-->
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2005-10-13 15:58.