Schrift
[thread]8816[/thread]

Array - Suchproblem



<< >> 7 Einträge, 1 Seite
pktm
 2007-03-06 20:32
#74844 #74844
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich habe ein Array: my @a1 = qw(a d g v 6 z h u t f e 0 n);
In diesem Array möchte ich nachsehen, ob die Elemente eines anderen Arrays enthalten sind, namlich my @a2 = qw(h f t u);
In welcher Reihenfolge die gesuchten Elemente (aus @a2) in @a1 vorkommen ist egal, alle Elemente kommen nur genau 1 mal vor (es ist also nicht möglich, dass man (1, 2, 1) findet.
Ich möchte jetzt wissen, von welcher bis zu welcher Position in @a1 die Elemente aus @a2 vorkommen.

Wie kann ich sowas machen??? Gibts da ein Modul zu welches mir die Sucharbeit abnimmt?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
lichtkind
 2007-03-06 20:44
#74845 #74845
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
in perl 5.9 haben wir smartmatch operator dafür der heisst "~~" aber sicher nicht was du suchst. :D
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Ronnie
 2007-03-06 21:01
#74846 #74846
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
CPAN:Perl6::Junction oder grep.\n\n

<!--EDIT|Ronnie|1173207770-->
Taulmarill
 2007-03-07 12:10
#74847 #74847
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Also die vorgeschlagenen Funktionen und Module sagen nur, ob es vorkommt, aber nicht wo. Wenn alle Elemente genau ein Zeichen breit sind, könntest du ja per join einen String bauen und RegEx oder index benutzen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2007-03-07 12:17
#74848 #74848
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So würde es gehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;

my @a1 = qw(a d g v 6 z h u t f e 0 n);
my @a2 = qw(h f t u);

my $last_index = (
sort{ $a <=> $b }
grep{ my $i = $a1[$_];
grep{ $i eq $_ }@a2
}(0..scalar(@a1)-1))[-1];

print $last_index;
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/
Ronnie
 2007-03-07 21:03
#74849 #74849
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@Taulmarill: Upps, hatte ich überlesen.

Hier eine Variante die den kleinsten und größten Index findet:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl 

use strict;
use warnings;

use List::Util qw/min max/;
use Data::Dumper;

my @a1 = qw(a d g v 6 z h u t f e 0 n);
my @a2 = qw(h f t u);

my %pos = map { $a1[$_], $_ } 0..$#a1;
#print Dumper \%pos;
my @t = map { $pos{$_} } @a2;
print min(@t) . ", " . max(@t) . "\n";
pktm
 2007-03-07 22:47
#74850 #74850
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=Taulmarill,07.03.2007, 11:10]Also die vorgeschlagenen Funktionen und Module sagen nur, ob es vorkommt, aber nicht wo. Wenn alle Elemente genau ein Zeichen breit sind, könntest du ja per join einen String bauen und RegEx oder index benutzen.[/quote]
Ja, im Moment mache ich es so, dass ich die Datenstruktur mit Leerzeichen zwischen den Elementen (in den Elementen selbst können keine vorkommen) zu einem String zusammen baue, dann das selbe für jede Permutation der gesuchten Elemente mache und letzteres in ersterem Suche.
Aber ichhabe irgendwie den Eindruck, dass das reichlich kompliziert ist. Ein schwacher trost ist, dass ich die flachen Strukturen ohnehin erzeugen muss, da ich die noch in anderen Fällen zur Suche benutze.
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 7 Einträge, 1 Seite



View all threads created 2007-03-06 20:32.