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

Inverser Zugriff auf ein Array

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
Gast Gast
 2007-11-19 18:49
#102597 #102597
Hi,

ich bin auf der Suche nach einer cleveren Lösung, wie auch auf die in einem Array abgelegten Daten quasi invers zugreifen kann.
Normalerweise macht man's ja so:
$wert = $array[$schluessel];

Ich habe jetzt aber das Problem, das ich den Wert kenne, aber den Schluessel dazu suche. Bislang ist mir nur eingefallen mir ein Hash zu erstellen, bei dem ich Schluessen und Wert sozusagen vertausche. Das jetzt $wert eindeutig sein muss ist mir bewust. Gibt es da nicht vielleicht noch eine andere Lösung?

Hein
renee
 2007-11-19 19:55
#102609 #102609
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du willst also den Index eines Elements aus einem Array haben?

Code (perl): (dl )
1
2
3
4
5
6
my @array = qw(dies ist ein Test);
my $check = 'ein';

my ($index) = grep{ $array[$_] eq $check } 0..$#array;

print "$check ist im Element $index des Arrays\n";


Man kann aber auch ein Modul wie CPAN:List::Util verwenden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2007-11-20 14:30
#102648 #102648
Danke, genau das habe ich gesucht.

Hein
lichtkind
 2007-11-20 14:45
#102649 #102649
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
auf dauer kann das aber sehr rechenaufwendig werden. wenn die viele solcher zugriffe brauchst würd ich mir eine andere Datenstruktur als einen array nehmen.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Gast Gast
 2007-11-20 15:21
#102650 #102650
Hallo,

das von renee duerfte wohl gleichwertig zu meiner Loesung sein:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

my @array = ("dies", "ist", "ein", "Test");
my $index = 'ein';

for my $i ( 0 .. $#array ) {
  if($index eq $array[$i]) {
    print "'$index' ist in \@array an pos. $i\n";
  }
}


Fragt sich was sinnvoller ist.

gruß,

rperl
renee
 2007-11-20 15:32
#102651 #102651
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es ist nicht generell zu sagen. Meins findet immer nur das erste Auftreten (wäre aber auch leicht zu ändern). Es ist halt kompakt...

Wenn immer nur das erste Auftreten gefunden werden soll, sollte man bei Dir noch ein "last" in dem if-Block einbauen und dann ist Deins auf jeden Fall performanter...

So wie es jetzt ist, gibt es bei jedem Auftreten von "ein" etwas aus.

Es kommt also auch etwas auf die Aufgabenstellung an...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
#Kein Kommentar
 2007-11-20 16:57
#102655 #102655
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
ich würde grep nehmen, wozu gibt's sonst die ganzen grep- und map funktionen?
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
Gast Gast
 2007-11-20 17:03
#102657 #102657
Hi,
renee+2007-11-20 14:32:33--
Meins findet immer nur das erste Auftreten (wäre aber auch leicht zu ändern). Es ist halt kompakt...

was müßte denn geändert werden um das zweite, dritte, ... letzte Vorkommen zu finden (wenn es die in den Daten denn gibt).

MfG

Hein
renee
 2007-11-20 17:04
#102658 #102658
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Man muss immer beachten wofür man was verwendet. Ein grep auf eine große Liste (z.B. nach dem Einlesen von sehr großen Dateien) kann große Performancenachteile haben, weil es die Schleife nicht abbricht wenn der erste Treffer auftaucht (vorausgesetzt oben angenommenes Szenario liegt vor)...

map und grep sind nicht immer die beste Wahl...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-11-20 17:08
#102660 #102660
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Alle Vorkommen:

Code (perl): (dl )
1
2
3
4
5
6
my @array = qw(dies ist ein Test);
my $check = 'ein';

my (@all_indexes) = grep{ $array[$_] eq $check } 0..$#array;

print "$check ist im Element $index des Arrays\n";


drittes Vorkommen:

Code (perl): (dl )
1
2
3
4
5
6
my @array = qw(dies ist ein Test);
my $check = 'ein';

my ($index) = (grep{ $array[$_] eq $check } 0..$#array)[2];

print "$check ist im Element $index des Arrays\n";


...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2007-11-19 18:49.