1 2 3 4 5 6 7 8 9 10
for my $i (0..$#a) { # ueber alle Indices von @a my @ende = @a[$i..$#a]; # die End-Sequenz (ein sog. Array-Slice) my @anfang = @b[0..$#a-$i]; if (@ende ~~ @anfang) { # ab 5.10 kann man auf diese Weise 2 Arrays vergleichen print "Uebereinstimmung ab Index $i\n"; last; } }
2012-08-25T23:32:12 AnonymAnzahl Elemente in einem Array -> $#name (ergibt Index des letzten Elements eines Arrays)
my @ende = @a[$i..$#a];
my @ende = @a[1, 2, 3];
my @anfang = @b[0, 1, 2];
QuoteDie eckigen Klammern solltest Du zu runden machen.@a = [0, 1, 2, 3, 4]
2012-08-26T01:46:33 AnonymWobei letzteres Beispiel praktisch vernachlässigt werden kann, aufgrund der Seltenheit einer solch ungünstigen Situation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; package Message; use overload '""' => \&to_s; sub new { my $class = shift; my $msg = shift; my $t = time(); my $self = { message => $msg, t => $t }; return bless $self, $class; } sub to_s { my $self = shift; return $self->{'message'}; } 1; package main; my @msg_queue = (); push @msg_queue, new Message("Hello"); sleep(1); push @msg_queue, new Message("World"); print Dumper [grep { time - $_->{'t'} <= 2 } @msg_queue]; sleep(2); print Dumper [grep { time - $_->{'t'} <= 2 } @msg_queue];
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#!/usr/bin/perl use warnings; use strict; my @a = ('1', '2', '3', '4'); my @b = ('2', '3', '4', '5', '4', '3', '3', '6', '7'); my $x = 0; while($b[$x] ne $a[$#a]) { $x++; } foreach my $i (@b[($x + 1) .. $#b]){ print "$i\n"; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#Content auf einzelne Linien splitten
for $linecontent (split(/\n/, $content)) {
#Prüfung, ob Chattext abgearbeitet wurde
if ($linecontent =~ /^<a name\=\"bancor\"><\/a>$/) {
$read = 2;
}
#Abarbeiten des Chattextes
if ($read == 1) {
for $actchatcontent (split(/<p/, $linecontent)) {
if ($actchatcontent =~ /^(.*class.*)<span id\=\"container\"><\/span>$/) {
push(@newdata, $1);
} elsif ($actchatcontent =~ /^(.*class.*)$/) {
push(@newdata, $1);
}
}
}
#Prüfung, ob Chattext erreicht wurde
if ($linecontent =~ /^<body.*class\=\"framechattextbg\" id\=\"container2\".*>$/) {
$read = 1;
}
}
for $i (0..$#olddata) {
@before = @olddata[$i..$#olddata];
@after = @newdata[0..$#olddata-$i];
print "Before: @before\nAfter: @after\n";
if (@before ~~ @after) {
print "#########MATCHED#########";
$testmatched = 1;
last;
}
}
QuoteAfter: class="chattext"><b>user 1:</b> <img src="../images/icon_chat.gif" align="absmiddle" border="0" class="chatpics"> test</p>
Before: class="chattext"><b>user 1:</b> <img src="../images/icon_chat.gif" align="absmiddle"border="0" class="chatpics"> test</p>
2012-08-31T05:24:55 AnonymDie Variablendeklaration findet sich weiter oben im Script ;)
2012-08-26T22:10:04 hlubenowHmm, würde es nicht genügen, die Stelle in @b zu finden, die das letzte Element von @a enthält?
2012-08-30T13:06:10 GUIfreund2012-08-26T22:10:04 hlubenowHmm, würde es nicht genügen, die Stelle in @b zu finden, die das letzte Element von @a enthält?
Ich bin nicht sicher, ob das genügt. Nach den Beispielen, die ich bisher gesehen habe, scheint eine zusätzliche Bedingung zu sein, dass auch alle Elemente vor dieser Stelle in @b mit den entsprechenden Elementen in @a übereinstimmen. Ist diese Bedingung nicht erfüllt, hätte man eine spätere Stelle erwischt, die gesuchte ist nicht mehr in @b.
2012-08-30T19:53:16 hlubenow2012-08-30T13:06:10 GUIfreund2012-08-26T22:10:04 hlubenowHmm, würde es nicht genügen, die Stelle in @b zu finden, die das letzte Element von @a enthält?
Ich bin nicht sicher, ob das genügt. Nach den Beispielen, die ich bisher gesehen habe, scheint eine zusätzliche Bedingung zu sein, dass auch alle Elemente vor dieser Stelle in @b mit den entsprechenden Elementen in @a übereinstimmen. Ist diese Bedingung nicht erfüllt, hätte man eine spätere Stelle erwischt, die gesuchte ist nicht mehr in @b.
Das Suchen des letzten Elements von @a sollte nur der erste Schritt sein.
Danach sollte man die vorigen Elemente in @b auf Übereinstimmung mit den Elementen in @a untersuchen. Das hatte ich erstmal zur Vereinfachung weggelassen.
Der vorherige Ansatz war ja immer ganze Listen-Splices zu machen und ganze Listen(teile) miteinander zu vergleichen. Das schien mir etwas rechenintensiv.
2012-08-31T08:54:39 GUIfreundIch war zu faul, mir sein Programm näher anzusehen.
@a = (1, 2, 3);