/ 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
Databehandling
Fra : Anders Bystrup


Dato : 26-07-03 19:32

Hejsa
Håber der er nogen der kan hjælpe mig her.
Jeg er newbie indenfor perl, har dog lidt erfaring med c.

Jeg har en list der indeholder følgende:

17.4.3.1.2.0.0.180.75.15.173 = 1
17.4.3.1.2.0.0.180.75.45.0 = 1
17.4.3.1.2.0.0.232.124.12.43 = 1
17.4.3.1.2.0.1.3.4.138.215 = 1
(bare et udsnit liste vil variere i længde)

Jeg vil nu gerne have denne liste delt i 3 så jeg får den delt sådan:

1:
17.4.3.1.2.
17.4.3.1.2.
17.4.3.1.2.
17.4.3.1.2.

2:
0.0.180.75.15.173
0.0.180.75.45.0
0.0.232.124.12.43
0.1.3.4.138.215

3:
1
1
1
1

den første er bare snmp stien som ikke skal bruges til noget, nr. 2 er mac
addresser som decimal og nr. 3 er portnumre på switchen.

Jeg har eksperimenteret med splice men kan ikke få det til at virke...

Nogen der har nogle forslag til hvordan problemet kan løses?

/Anders




 
 
Lars Balker Rasmusse~ (26-07-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 26-07-03 20:47

"Anders Bystrup" <anders@XXX.redakula.net> writes:
> Hejsa
> Håber der er nogen der kan hjælpe mig her.
> Jeg er newbie indenfor perl, har dog lidt erfaring med c.
>
> Jeg har en list der indeholder følgende:
>
> 17.4.3.1.2.0.0.180.75.15.173 = 1
> 17.4.3.1.2.0.0.180.75.45.0 = 1
> 17.4.3.1.2.0.0.232.124.12.43 = 1
> 17.4.3.1.2.0.1.3.4.138.215 = 1
> (bare et udsnit liste vil variere i længde)
[....]
> Nogen der har nogle forslag til hvordan problemet kan løses?

Regulære udtryk er dine venner.

my (@snmp, @mac, @port);

while (<>) { # læs fra stdin - nok ikke det du vil...

if (/((?:\d+\.){5}) # match første fem "1."
((?:\d+\.){5}\d+) # match næste fem "1." og et "1"
\s*=\s* # spis " = "
(\d+) # sidste tal
/x)
{
push @snmp, $1;
push @mac, $2;
push @port, $3;
}
}

print "1.\n";
print "$_\n" for @snmp;

print "\n2.\n";
print "$_\n" for @mac;

print "\n3.\n";
print "$_\n" for @port;
--
Lars Balker Rasmussen Consult::Perl

Anders Bystrup (30-07-2003)
Kommentar
Fra : Anders Bystrup


Dato : 30-07-03 15:40


>
> Regulære udtryk er dine venner.
>
> my (@snmp, @mac, @port);
>
> while (<>) { # læs fra stdin - nok ikke det du vil...
>
> if (/((?:\d+\.){5}) # match første fem "1."
> ((?:\d+\.){5}\d+) # match næste fem "1." og et "1" \s*=\s*
> # spis " = "
> (\d+) # sidste tal
> /x)
> {
> push @snmp, $1;
> push @mac, $2;
> push @port, $3;
> }
> }
> }
> print "1.\n";
> print "$_\n" for @snmp;
>
> print "\n2.\n";
> print "$_\n" for @mac;
>
> print "\n3.\n";
> print "$_\n" for @port;

Takker - det var lige det der skulle til - og nu er jeg sku også ved at
kunne se en mening i de regulære udtryk

/Anders

Adam Sjøgren (26-07-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 26-07-03 20:53

On Sat, 26 Jul 2003 20:32:21 +0200, Anders wrote:

> Jeg har eksperimenteret med splice men kan ikke få det til at
> virke...

> Nogen der har nogle forslag til hvordan problemet kan løses?

Jeg foreslår at du poster det du har prøvet, og spørger ud fra det.


Herunder er to muligheder, en der bruger split og splice, og en der
bruger et regulært udtryk. regexp() er væsentligt hurtigere end
splitsplice() (som jo splitter op i atomer og samler igen).

== =
#!/usr/bin/perl

use strict;
use warnings;

my (@snmplist, @maclist, @valuelist);

while (<>) {
regexp($_);
}

use Data::Dumper; print Dumper(\@snmplist, \@maclist, \@valuelist);

###

use Benchmark qw(:all);

cmpthese(
250000,
{
splitsplice=>'splitsplice("17.4.3.1.2.0.0.180.75.15.173 = 1\n");',
regexp=>'regexp("17.4.3.1.2.0.0.180.75.15.173 = 1\n");',
}
);

sub splitsplice {
my ($line)=@_;

chomp $line;
my ($a, $value)=split /\s*=\s*/, $line;

my @mac=split "[.]", $a;
my @snmp=splice @mac, 0, 5;

my $mac=join ".", @mac;
my $snmp=join ".", @snmp;

push @snmplist, $snmp;
push @maclist, $mac;
push @valuelist, $value;
}

sub regexp {
my ($line)=@_;

$line=~/^((\d+[.]){4}\d+)[.]([\d.]*)\s*=\s*(.*)$/;
my ($snmp, $mac, $value)=($1, $3, $4);

push @snmplist, $snmp;
push @maclist, $mac;
push @valuelist, $value;
}
== =

Nu kommer der sikkert en masse og gør det meget smartere


Mvh.

--
"This whole business of Santa rewarding good kids and Adam Sjøgren
neglecting bad kids really bugs me." asjo@koldfront.dk

Adam Sjøgren (26-07-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 26-07-03 21:01

On Sat, 26 Jul 2003 21:53:00 +0200, spamtrap@koldfront.dk wrote:

> Herunder er to muligheder, en der bruger split og splice, og en der
> bruger et regulært udtryk.

.... og hverken den ene eller den anden af mine funktioner fungerer
korrekt.

I snmp-listen gik jeg ud fra at der ikke skulle være afsluttende
punktum i hvert element - men det skulle der jo.

Sådan går det, når man ikke læser spørgsmålet grundigt nok.


:*),

--
"This whole business of Santa rewarding good kids and Adam Sjøgren
neglecting bad kids really bugs me." asjo@koldfront.dk

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

Månedens bedste
Årets bedste
Sidste års bedste