splice fügt nicht dort ein wo ich will ?
xNeTworKx
- perl
Guten Morgen,
Seit gestern sitze ich bei einem Problem, daß mir nicht ganz klar ist.
Ich versuche die ganze Zeit einen String an einer gewissen Stelle zu zerlegen, und einen anderen dort einzufügen. So weit so gut, aber er fügt nun mal nicht dort ein wo ich will, sondern irgendwo.
Hier ist mal der Code, der dies macht.
sub savereply {
my ($posting,$replynumber,$topic,$text,$name,$email,$hpaddress,$icq) = @_;
my $in = '';
my (@replies, $newreply, $top, $unixzeile) = ((),'','','');
my $file = $posting.'.txt';
my $unixzeit = time;
if ($email eq '') {
$email = '----';
}
if ($icq eq '') {
$icq = '----';
}
if ($hpaddress eq '') {
$hpaddress = '----';
}
open(FILE,"messages/$file") or die "Cant save file : $!\n";
while (<FILE>) {
$in .= $_;
}
close FILE;
if ($in =~ /(<top>.+?</top>)/s) {
$top = $1;
}
if ($in =~ /(<unix>.+?</unix>)/s) {
$unixzeile = $1;
}
while ($in =~ /(<reply>.+?</reply>)/sg) {
push @replies, $1;
}
$newreply = join("\n","<reply>",
"<unix>$unixzeit</unix>",
"<ip>$ip</ip>",
"<zeit>$zeit</zeit>",
"<topic>$topic</topic>",
"<name>$name</name>",
"<email>$email</email>",
"<icq>$icq</icq>",
"<hpadresse>$hpaddress</hpadresse>",
"<text>$text</text>",
"</reply>\n");
splice(@replies, $replynumber, 0, $newreply);
open(DB,">messages/$file") or die "Cant save file : $!\n";
flock DB, 2;
print DB "$unixzeile\n";
print DB "$top\n";
print DB "@replies\n";
close DB;
print $query->redirect("$url");
}
Wie das einzulesende/zu speichernde File aussieht kann man hier sehen:
http://212.17.119.105/forum2/messages/1021792753.txt
Wie gesagt, er fügt es irgendwo ein, nicht an der Stelle "$replynumber". Ich habe mir $replynumber zur Probe ausgeben lassen, und es ist immer richtig, also kann es mal daran nicht liegen.
Wenn ich zur Probe mal :
print "Content-type:text/plain\n\n";
foreach my $rep (@replies) {
print "$rep\n";
print 'x' x 100 ."\n";
}
schreibe, zeigt er mir zuerst 3 Balken mit 100 x 'x' an, dann erst alle "<reply>", oder 2 Balken mit x dann wieder <reply> dann wieder 2 Balken mit x. Was hat das zu bedeuten, und wie mache ich es, daß es richtig funktioniert ?
Nachtrag :
Ich bin jetzt ziemlich sicher, daß an dem Array etwas nicht stimmt. Wenn ich mir die Anzahl der Elemente ausgeben lasse, erscheinen bei 3 Einträgen ( also 3x <reply>.+?</reply> ) 6 Elemente. Mein Gedanke ist, daß vielleicht der reguläre Ausdruck nicht ganz richtig ist, aber das ? sucht doch nach 'so wenig wie möglich'.
Ich bin also noch nicht sehr viel weitergekommen mit meinem Problem.
Hallo,
ich weis nicht warum, aber damit @replies = $in =~ /(<reply>.+?</reply>)/sg); funktioniert es. Mit einer while Schleife und push bekomme ich mehr Elemente als ich sollte. Warum ist das so ?