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 · 193 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.
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.