Hej!
Vad menas med felmeddelandet: isn't numeric in ncmp?
Argument "367::Jag testar::Kalle Anka::22:e Maj 2001, kl. 8.45::0:..." isn't numeric in ncmp at /home/www/... line 687.
6 svar · 182 visningar · startad av Labbman
Hej!
Vad menas med felmeddelandet: isn't numeric in ncmp?
Argument "367::Jag testar::Kalle Anka::22:e Maj 2001, kl. 8.45::0:..." isn't numeric in ncmp at /home/www/... line 687.
Klistrar in hela subrutinen som har till uppgift att skriva ut inläggen på en debattsida, i trädstruktur.
Rad 687 som nämns i felmeddelandet, är den blåmarkerade raden nedan.
Scriptet fungerar helt ok, och textfilen skrivs ut korrekt i trädstruktur. Dock fellogar scriptet enligt inlägget överst.
Textfilen varifrån scriptet bygger upp trädstrukturen ser ut enligt följande:
331::Endast för forumtest::Ture Testare::31:e Jan 2001, kl. 18.29::330::4
Nedan kommer hela subrutinen:
sub lista{
######################################
# Skriver ut inläggen i trädstruktur #
######################################
open(TEXT,"$rubriker")||print "<font face=$typsnitt color=red><b>ERROR: Kan inte öppna filen $rubriker </b></font>";
#flock(TEXT, 2);
@alla=<TEXT>;
#flock(TEXT, 8);
close (TEXT);
##################
# Sorterar @alla #
##################
my @alla = map { $_->[0] }
sort { $b->[0] <=> $a->[0] }
map { [ $_, ((/^[^::]*\|([^::]*)/)[0]) ] }@alla;
#####################
# Skriver ut inlägg #
#####################
foreach my $inlagg(@alla){
my @data = split(/::/,$inlagg);
if ($data[4] == $_[0]){
$num++;
if($data[5]!=0){
$k=0;
while ($k != $data[5]){
print "<img src=\"$bilder/vit.gif\">";
$k++;
}
}
print "<font face=$typsnitt><small><b><a href=\"$script?inlagg=$data[0]\">$data[1]</a></b> <i>$data[2] - $data[3]</i></b></small></font><br>";
&lista($data[0]);
}
}
close (TEXT);
}
[Redigerat av Labbman den 20 jul 2001]
Hej,
Jag förmodar att du vill sortera listan @alla efter första fältet, fallande?
my @alla =
map { $_->[0] }
sort { $b->[1] <=> $a->[1] }
map { [ $_ , ( split /::/ ) ] } @alla;
Öppna, sortera och splitta innan du går in i den rekursiva subrutinen lista.
------------------
Hansen
c.h@ngmedia.com
[Redigerat av Hansen den 20 jul 2001]
Tjenix!
Tack för hjälpen!
Skall prova detta under morgondagen.
Det lösning jag använt fungerar helt ok i programmet, trädstrukturen blir precis som jag vill ha den.
Men jag skall prova din lösning och se om felmeddelandena i loggen försvinner.
Tack för hjälpen!
[Redigerat av Labbman den 20 jul 2001]
Hej,
Det lösning jag använt fungerar helt ok i programmet, trädstrukturen blir precis som jag vill ha den.
Ok, men vi kan förbättra koden och ändå få samma visuella resultat och bättre prestanda :)
Varje gång du kallar subrutinen lista så öppnas en fil och läses in till en lista som sedan sorteras och därefter delas varje rad upp i fält.
Detta kan vi eleminera genom att göra detta innan vi sätter igång den rekursiva subrutinen lista.
Ett förslag: http://freebox.com/c.h/perl/rekursiv.pl.txt
#!/usr/bin/perl -w
use strict;
my $posts = sort_data( split_data( open_data('posts.db') ) );
my $prev_parent = 0;
&lista( 0, 0 );
sub lista {
my ( $parent, $count ) = @_;
foreach my $post (@$posts) {
next unless $post->[4] == $parent;
$count++ unless $post->[4] == $prev_parent;
$count = 0 if $parent == 0;
print " " x $count;
print "$post->[0] $post->[1] $post->[2] - $post->[3]\n";
$prev_parent = $post->[4];
&lista( $post->[0], $count );
}
}
sub open_data {
my ($file) = @_;
open( DATA, "$file" ) or die "Kan inte öppna datafil: $file Anledning: $!";
my @data = <DATA>;
close(DATA);
chomp(@data);
return \@data;
}
sub sort_data {
my ($data) = @_;
return [ sort { $b->[0] <=> $a->[0] } @$data ];
}
sub split_data {
my ($data) = @_;
return [ map { [ ( split /::/ ) ] } @$data ];
}
Data filen posts.db: http://freebox.com/c.h/perl/posts.db.txt
Här ser vi skillnaden mellan koderna:
Benchmark: timing 10000 iterations of Hansen, Labbman...
Hansen: 13 wallclock secs ( 9.70 usr + 1.80 sys = 11.50 CPU) @ 869.57/s (n=10000)
Labbman: 139 wallclock secs (106.13 usr + 20.98 sys = 127.11 CPU) @ 78.67/s (n=10000)
Det nya förslaget klarar 869 körningar per sekund villket gör det mer än 10 gånger snabbare.
------------------
Hansen
c.h@ngmedia.com