Schrift
[thread]7166[/thread]

nach ref suchen in array



<< >> 4 Einträge, 1 Seite
Froschpopo
 2005-07-28 15:11
#56776 #56776
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich hab nen array:

@array = ([1, name1, alter1, geschlecht1], [2, name2, alter2, geschlecht2]...);

jetzt möchte ich gucken, ob "name2" vorhanden ist. Wie kann ich das anstellen?
Strat
 2005-07-28 15:20
#56777 #56777
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
bei einem array bleibt wohl nur, ihn zu durchlaufen und solange zu vergleichen, bis das element gefunden wurde...
Code: (dl )
1
2
3
4
5
6
for my $i (0..$#array) {
if ($array[$i]->[1] eq 'name2') {
print "Gefunden: $i\n";
last;
}
} # for

wenn du sowas sehr haeufig brauchst, kann es vielleicht sinn machen, selbst einen index mitzufuehren, z.B.
%index = (name1 => 0, name2 => 1, ...);
und dann z.B. auf das alter via:
$array[ $index{name1} ]->[2]
zuzugreifen.

ist da vielleicht ein zweidimensionaler hash einfacher zu handeln? oder zumindest ein array of hashes?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Ronnie
 2005-07-28 15:29
#56778 #56778
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl

use strict;
use warnings;

my @list = ( [1, 'joe', 28, 'm'], [2, 'jane', 31, 'w'] );

print "Joe exists!\n" if grep { $_->[1] eq 'joe'} @list;
print "Tim exists!\n" if grep { $_->[1] eq 'tim'} @list;

@strat: grep bricht AFAIR im skalaren kontext auch ab, so das man kein for/last-Konstrukt machen muss.

EDIT: Nachgeschaut grep liefert im skalaren Kontext die Anzahl der Treffer zurück. for/last kann also schneller sein bei großen Listen.\n\n

<!--EDIT|Ronnie|1122551329-->
Ishka
 2005-07-28 15:46
#56779 #56779
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Nach meinen Benchmarks sieht das nicht so aus. Soweit ich mich erinnere, was das mit Abbrechen von grep auch erst für perl6 geplant.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
<< >> 4 Einträge, 1 Seite



View all threads created 2005-07-28 15:11.