/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Log-file parsing
Fra : Thomas Axelsen


Dato : 21-06-01 21:22

Hej - Total nybegynder søger hjælp! Har 2 spg.

1.
Har en tekststreng der ser sådan ca. sådan her ud:
tekst1 | tekst2 | tekst3
og jeg vil gerne have den til at at se ud som følger:
tekst1:tekst2:tekst3

Har forsøgt med
foreach(@newarray) {
s/[\| \s+]/:/g; }
men det er ikke helt iorden da alle \s og \| erstattes med : - er der nogen
måde at erstatte x-antal tegn med et enkelt tegn på??

2.
Ovennævnte tekststreng (ip:sendt:modtaget) skal "fyldes" på rrdtool således
at der er "kobling" mellem de respektive ip-numre og sendt/modtaget - kan
man bruges hashes til det? eller "multidimensionelle arrays"?

På forhånd tak
Thomas Axelsen



 
 
Lars Balker Rasmusse~ (21-06-2001)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 21-06-01 21:45

"Thomas Axelsen" <t.axelsen@get2net.dk> writes:
> Har en tekststreng der ser sådan ca. sådan her ud:
> tekst1 | tekst2 | tekst3
> og jeg vil gerne have den til at at se ud som følger:
> tekst1:tekst2:tekst3
>
> Har forsøgt med
> foreach(@newarray) {
> s/[\| \s+]/:/g; }
> men det er ikke helt iorden da alle \s og \| erstattes med : - er der nogen
> måde at erstatte x-antal tegn med et enkelt tegn på??

Du har placeret + forkert: s/[|\s]+/:/g;

> Ovennævnte tekststreng (ip:sendt:modtaget) skal "fyldes" på rrdtool således
> at der er "kobling" mellem de respektive ip-numre og sendt/modtaget - kan
> man bruges hashes til det? eller "multidimensionelle arrays"?

Ja, men du bliver nødt til at uddybe dit spørgsmål.
--
Lars Balker Rasmussen "Woo hoo!?"

Thomas Axelsen (21-06-2001)
Kommentar
Fra : Thomas Axelsen


Dato : 21-06-01 22:04

Hej igen og tak for hjælpen med nr. 1

> > Ovennævnte tekststreng (ip:sendt:modtaget) skal "fyldes" på rrdtool
således
> > at der er "kobling" mellem de respektive ip-numre og sendt/modtaget -
kan
> > man bruges hashes til det? eller "multidimensionelle arrays"?
>
> Ja, men du bliver nødt til at uddybe dit spørgsmål.

Jeg prøver at præcisere:

$ipdata skal have en form hvor der er kobling mellem ipnummer og
sendte/modtagne data eg.:
(ip1,sendt1,modt1)
(ip2,sendt2,modt2)
osv.

eller
ip1 --> (sendt1,modt1)
osv.

Dataene kommer i et array med tekststrenge som kan splittes i scalars eller
til et array

Endemålet er, at fylde dataene på:
RRDs::update $rrd, "$ipdata";
if ($ERROR = RRDs::error) {
die "$0: unable to update `$rrd': $ERROR\n";
};
hvor $ipdata har formen; N:sendt1:modt1:sendt2:modt2:osv.



Lars Balker Rasmusse~ (21-06-2001)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 21-06-01 22:50

"Thomas Axelsen" <t.axelsen@get2net.dk> writes:
> Jeg prøver at præcisere:
>
> $ipdata skal have en form hvor der er kobling mellem ipnummer og
> sendte/modtagne data eg.:
> (ip1,sendt1,modt1)
> (ip2,sendt2,modt2)
> osv.
>
> eller
> ip1 --> (sendt1,modt1)
> osv.
>
> Dataene kommer i et array med tekststrenge som kan splittes i scalars eller
> til et array
>
> Endemålet er, at fylde dataene på:
> RRDs::update $rrd, "$ipdata";
> if ($ERROR = RRDs::error) {
> die "$0: unable to update `$rrd': $ERROR\n";
> };
> hvor $ipdata har formen; N:sendt1:modt1:sendt2:modt2:osv.

Det nemmeste er nok at lave en hash over IP-adresser, som så
indeholder en streng der er lige til at fylde på RRDs::update:

%ipdata = ();
foreach (@newarray) {
s/[|\s]+/:/g;
($ip, $sendt, $modtaget) = split /:/;
$ipdata{$ip} = $ip unless defined $ipdata{$ip};
$ipdata{$ip} .= ":$sendt:$modtaget";
}

Så kan du bagefter løbe igennem hashen:

foreach $ip (sort keys %ipdata) {
RRDs::update $rrd, $ipdata{$ip};
if ($ERROR = RRDs::error) {
die "$0: unable to update `$rrd': $ERROR\n";
}
}
--
Lars Balker Rasmussen "Woo hoo!?"

Thomas Axelsen (22-06-2001)
Kommentar
Fra : Thomas Axelsen


Dato : 22-06-01 13:35


Tusind tak - det ligner lige det jeg skal bruge

> Det nemmeste er nok at lave en hash over IP-adresser, som så
> indeholder en streng der er lige til at fylde på RRDs::update:
>
> %ipdata = ();
> foreach (@newarray) {
> s/[|\s]+/:/g;
> ($ip, $sendt, $modtaget) = split /:/;
> $ipdata{$ip} = $ip unless defined $ipdata{$ip};
> $ipdata{$ip} .= ":$sendt:$modtaget";
> }
>
> Så kan du bagefter løbe igennem hashen:
>
> foreach $ip (sort keys %ipdata) {
> RRDs::update $rrd, $ipdata{$ip};
> if ($ERROR = RRDs::error) {
> die "$0: unable to update `$rrd': $ERROR\n";
> }
> }
> --
> Lars Balker Rasmussen "Woo
hoo!?"

Mvh
Thomas Axelsen




Lars Kim Lund (21-06-2001)
Kommentar
Fra : Lars Kim Lund


Dato : 21-06-01 21:53

Hej "Thomas Axelsen" <t.axelsen@get2net.dk>

>men det er ikke helt iorden da alle \s og \| erstattes med : - er der nogen
>måde at erstatte x-antal tegn med et enkelt tegn på??

$t = "tekst1 | tekst2 | tekst3\n";
print $t;

$t =~ s/[| ]{1,}/:/g;
print $t;

...

[LAKL@NOSTROMO, C:\]
# perl test.pl
tekst1 | tekst2 | tekst3
tekst1:tekst2:tekst3

--
Lars Kim Lund
http://www.net-faq.dk/

Lars Balker Rasmusse~ (21-06-2001)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 21-06-01 22:00

Lars Kim Lund <larskim@mail.com> writes:
> $t =~ s/[| ]{1,}/:/g;

{1,} er en mere omstændelig måde at skrive + på. :)
--
Lars Balker Rasmussen "Woo hoo!?"

Lars Kim Lund (21-06-2001)
Kommentar
Fra : Lars Kim Lund


Dato : 21-06-01 22:11

Hej Lars Balker Rasmussen <lars@balker.org>

>> $t =~ s/[| ]{1,}/:/g;
>{1,} er en mere omstændelig måde at skrive + på. :)

Sålænge det bare virker som jeg forventer så er jeg glad. Og hold så
op med at drille. Dumme Lars.

--
Lars Kim Lund
http://www.net-faq.dk/

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste