[Perl] variable variable aanmaken

Pagina: 1
Acties:

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 10:56

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Tja .. hoe doe ik dat dus?
Ik heb eerst via het volgende, het aantal regels uit laten lzen an en bestand:
code:
1
2
3
4
5
6
7
    $lines = 0;
    open(FILE, "/etc/omschr.txt");
    while (sysread FILE, $buffer, 4096) {
    $lines += ($buffer =~ tr/\n//);
    }
    close FILE;
    print "$lines";

via de variable $lines weetik dus hoeveel regels het bstand bevat.
Echter ik wil ik net zoveel variables aanmaken als dat r regels zijn.

Ik dacht dat op te lossen met het volgende:
code:
1
2
3
4
5
6
7
$count=1;
while ($count<$lines)
{
print "$count\n";
$omschr.$count = leeg;
$count++;
}

Echter vind perl dat niet fijn.
Hoe krijg ik het toch voor elkaar om variable variable aan te maken :?

Braaikamer - Smoke&BBQ


  • tomato
  • Registratie: November 1999
  • Niet online
Doe dat gewoon met een list.

En als je het echt graag wilt:
code:
1
${'omschr'.$count} = 'leeg';

Maar ik kan mij haast niet voorstellen dat die een schone oplossing is voor wat je dan ook wilt bereiken.

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 10:56

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Hmzz .tja daar kun je wel eens gelijk in hebben.
Ik bedacht me later ook, dat ik waarschijnlijk hiermee toch niet bereik wat ik wil bereiken.

Dit is de situatie;
Ik heb 2 plain text bestanden.
De ene bevat een stuk of 120 regels, de andere een stuk of 40.

Nu is het zo, dat tussen die 120 regels , enkele lines staan die identiek zijn aan die uit het andere bestand.
En dat moet ik dus via Perl uit zien te vinden.
Ik wilde dus eerste het ene bestand in 120 verschillende vars gooien, en dan een EQ doen.
Echter dat zal ook niet gaan werken.

Mocht iemand daar nog een idee voor hebben, graag!

Braaikamer - Smoke&BBQ


  • BOOTZ
  • Registratie: Maart 2001
  • Laatst online: 16-09 09:54
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
open(FILE, "/etc/omschr.txt");
@omschr = <FILE>;
close FILE;

open(FILE, "/etc/file2.txt");
@check = <FILE>;
close FILE;

foreach $line (@omschr) {  # @omschr is dus het grootste bestand
 foreach $chk (@check) {
  if ($line eq $chk) { #filter er uit }
 }
}

suc6

Maak je eigen poll


  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 10:56

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Tja .. zover was ik ook al.
Ik waardeer je hulp in deze, echter het is dus niet zo simpel.
HEt gaat om een deel van elke zin (die sloop ik wel naar tijdelijke vars, maar heb ik nu ff voor 't gemak weggelaten).

Het grootste probleem zit 'm in het feit dat regel 1 niet gelijk is aan regel 1 in het andere bestand, maar kan bijvoorbeeld op regel 25 staan ofzo.

Hier een stukje uit het ene bestand:
[...]
PROTOCOL-SERVICE IP, www-http-st, pid=TCP port=80 srcport=<All> ackfilt=0 stfilt=1,
PROTOCOL-SERVICE IP, www-https-st, pid=TCP port=443 srcport=<All> ackfilt=0 stfilt=1,
PROTOCOL-SERVICE IP, Accel-Auth, pid=TCP port=443 srcport=<All>,
PROTOCOL-SERVICE IP, www-http/udp, pid=UDP port=80 srcport=<All>,
[...]
En van het andere bestand:
[...]
EXCLUDE ENABLED NOLOG, INTRFACE:<Any>, IP:pid=ICMP, INTRFACE:<Any>, pid=ICMP
EXCLUDE ENABLED NOLOG, INTRFACE:<Any>, IP:pid=TCP port=6667 srcport=<All> ackfilt=0 stfilt=1, INTRFACE:<Any>, pid=TCP port=6667 srcport=<All> ackfilt=0 stfilt=1
EXCLUDE ENABLED NOLOG, INTRFACE:<Any>, IP:pid=IP, INTRFACE:<Any>, pid=IP
EXCLUDE ENABLED NOLOG, INTRFACE:<Any>, IP:pid=UDP port=<All> srcport=123 stfilt=1, INTRFACE:<Any>, pid=UDP port=<All> srcport=123 stfilt=1
EXCLUDE ENABLED NOLOG, INTRFACE:<Any>, IP:pid=TCP port=443 srcport=<All>, INTRFACE:<Any>, pid=TCP port=443 srcport=<All>
[...]
In dit voorbeeld is het dus de een na laatste en laatste regel die overneekomen (na wat geharrewar met de vars).
Echter is het een voorbeeldje.

Ik hoop dat het een beetje duidelijk is nu.

de kenners zullen deze bestanden dus wel herkennen, en kunnen bedenken wat ik uiteindelijk aan ht bouwen ben/wil

Braaikamer - Smoke&BBQ


  • BOOTZ
  • Registratie: Maart 2001
  • Laatst online: 16-09 09:54
Op vrijdag 16 november 2001 15:32 schreef Koffie het volgende:
de kenners zullen deze bestanden dus wel herkennen, en kunnen bedenken wat ik uiteindelijk aan ht bouwen ben/wil
laat me raden, router? of firewall? (of iets om de rules daarvan aan te passen)

dit lijkt me een typisch regexp probleempje.
wat je eigenlijk moet doen is kijken of stukjes uit de eerste voorkomen in de tweede. als die telkens een zelfde opmaak hebben zou ik zoiets doen (uitgaande van de bestanden hierboven):
code:
1
2
3
4
5
6
7
# $tmp is variabele met tekst

$_ = $tmp
/(pid=.* port=.* srcport=.*)/;

# de tekst die je zoekt zit nu in $1
# je kan nu zelf wel kijken in welke regels in file 2 het voorkomt

disclaimer: ik beloof niet dat het werkt, kijk voor meer info op http://www.perl.com/pub/a/2000/11/begperl3.html

Maak je eigen poll


  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 10:56

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Het is eigenlijk *nog* iets ingewikkelder.
Dat 'regexxen' zegt me eerlijk gezeg weinig.
In het begin zijn er 2 bestanden.

- BUILTINS.CFG
deze bevat o.a. de 'omnschrijvingen' en ook nog andere niet relevante informatie.

- FILTERS.CFG
Deze bevat o.a. de 'omschrijvingen' , de protocol informatie zelf, en andere niet relevant informatie.

Eerst haal ik uit zowel BUILTINS.CFG en FILTERS.CFG de specifieke lines waar de 'omschrijving' in staat, en plaats deze in temp bestand 'omschr.txt'.

Vervolgens lees ik de regels uit welke de relevant protocol info bevatten, en plaats deze in het temp bestand protocol.txt

Echter, wil ik dus weten, welke regel uit omschr.txt overeenkomt met protocol.txt
Het moet dus idd een webbased filter/firewall/rules applicatie worden.

Hier een stuk van m'n huidige code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
&del_previous;

open(FE, "/etc/filters.cfg");
@lines = <FE>;
foreach $temp (@lines){
($var1,$var2,$var3,$var4,$var5,$var6,$var7) = split(/\,/,$temp);


if ($var1 eq "    EXCLUDE ENABLED NOLOG") {
    &get_protocol;

      }
      else {
      }

if ($var1 eq "PROTOCOL-SERVICE IP") {
    &get_omschrijving;

      } 
      else {
      }
    }

open(FILEC, "/etc/builtins.cfg");
@lines = <FILEC>;
close(FILEC);
foreach $temp (@lines){
($var1,$var2,$var3,$var4,$var5,$var6,$var7) = split(/\,/,$temp);


if ($var1 eq "PROTOCOL-SERVICE IP") {
    &get_omschrijving;

      } 
      else {
      }

    }

&count_lines;

#################################
#           #
#    S U B R O U T I N E S    #
#           #
#################################

sub count_lines {
    $lines = 0;
    open(FILE, "/etc/omschr.txt");
    while (sysread FILE, $buffer, 4096) {
    $lines += ($buffer =~ tr/\n//);
    }
    close FILE;
    print "$lines";
    }

sub get_omschrijving {
    open(OUTPUT, ">>/etc/omschr.txt");
    print OUTPUT "$var1,$var2,$var3,\n";
    close (OUTPUT);
    }

sub get_protocol {
    $omschrijving = $var3;
    $omschrijving =~ s/I// ;
    $omschrijving =~ s/P// ;
    $omschrijving =~ s/:// ;
    open(OUTPUT, ">>/etc/protocol.txt");
    print OUTPUT "$var1,$var2,$var3,$var4,$omschrijving\n";
    close (OUTPUT);
    }

sub del_previous {
    unlink("/etc/omschr.txt");
    unlink("/etc/protocol.txt");
    }

Hiemree heb ik dus alles ingelezen, maar wil ik dus checken of een bepaalde line (een deel ervan) overeenkomt met een bepaalde line uit het andere bestand.

Braaikamer - Smoke&BBQ


  • BOOTZ
  • Registratie: Maart 2001
  • Laatst online: 16-09 09:54
dat kan dus volgens mij, zoals ik in mn vorige post ook al zei, door een 'vast' stukje van je line er uit te filteren (dmv die regex dus, de () in de regex zorgen dat alles wat daar tussen wordt gevraagd in $1 terecht komt), en daar vervolgens op te gaan zoeken in het tweede bestand (regel voor regel, totdat je dr een tegen komt waar het in staat).

of begrijp ik je nou verkeerd?

Maak je eigen poll


  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 10:56

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
OK, kzal vanavond een ff testen of dat werkt.
Ik laat het nog wel ff weten.

Bedankt so far!

Braaikamer - Smoke&BBQ


  • BOOTZ
  • Registratie: Maart 2001
  • Laatst online: 16-09 09:54
no prob :)

Maak je eigen poll

Pagina: 1