1
2
Nummer;Antragsteller;Source;Destination;Port;Typ;System;Datum
4711;j2033;10.11.20.0/22;10.33.44.55;TCP 22;X1;cose4711;11-02-2013
source=10.* and port=22 and not system=cose4711
2013-10-09T15:46:04 ryderCode: (dl )source=10.* and port=22 and not system=cose4711
Wie kann ich so was in Perl abbilden ohne zig if-then-else Abfragen zu machen? Und ohne die CSV-Datei mehrmals zu durchlaufen.
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
#!/usr/bin/perl use strict; use warnings; use Text::CSV; # Hier kommen die Suchanweisungen, wie auch immer die angeliefert werden. my %search = ( Source => { pattern => qr(10.*) , match => 1 } , Port => { pattern => qr(22) , match => 1 } , System => { pattern => qr(cose4711) , match => 0 } ); my $csv = Text::CSV->new ( { binary => 1, sep_char => ';' } ) or die "Cannot use CSV: ".Text::CSV->error_diag (); open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!"; my $header = $csv->getline($fh); READCSV: while ( my $row = $csv->getline($fh) ) { for my $col (0..$#{$header}) { next unless my $comp = $search{$header->[$col]}; my $match = ($row->[$col] =~ $comp->{pattern}) ? 1 : 0; next READCSV unless $match == $comp->{match}; } print "Hit in row $.!\n"; }
1
2
3
4
5
6
Nummer;Antragsteller;Source;Destination;Port;Typ;System;Datum
4711;j2033;10.11.20.0/22;10.33.44.55;TCP 22;X1;cose4710;11-02-2013
4711;j2033;11.11.20.0/22;10.33.44.55;TCP 22;X1;cose4711;11-02-2013
4711;j2033;12.11.20.0/22;10.33.44.55;TCP 22;X1;cose4712;11-02-2013
4711;j2033;10.11.20.0/22;10.33.44.55;TCP 23;X1;cose4713;11-02-2013
4711;j2033;10.11.20.0/22;10.33.44.55;TCP 22;X1;cose4713;11-02-2013