webForumDet fria alternativet

Felmeddelande...

6 svar · 182 visningar · startad av Labbman

LabbmanMedlem sedan dec. 199949 inlägg
#1

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.

HansenMedlem sedan aug. 2000374 inlägg
#2

Hej,

Det blir lättare för oss om vi får se lite kod ;)

------------------
Hansen
c.h@ngmedia.com

LabbmanMedlem sedan dec. 199949 inlägg
#3

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")&#0124;&#0124;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  { [ $_, ((/^[^::]*\&#0124;([^::]*)/)[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]

HansenMedlem sedan aug. 2000374 inlägg
#4

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]

LabbmanMedlem sedan dec. 199949 inlägg
#5

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]

HansenMedlem sedan aug. 2000374 inlägg
#6

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

LabbmanMedlem sedan dec. 199949 inlägg
#7

Hej!

Skall prova även detta och se :)

Tack för hjälpen!

131 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)