-
prośba o pomoc
Witam wszystkich. Postanowiłem skorzystać z języka perl aby zmodyfikować sobie plik tekstowy. Przykład tego pliku poniżej
ala ma kota, kot ma lale
23.240.34.12
129.12.67.100
data 12-30-2012
chciałbym aby program pozostawił mi tylko adresy ip zamieniając ostatnie czyfry na * czyli
23.240.34.*
129.12.67.*
napisałem takie prosty program
#!/usr/bin/perl -w
use strict;
my $in = $ARGV[0];
unless (defined $in) {
die "Sposób użycia programu: $0 nazwa pliku";
}
my $out = $in;
$out =~ s/(\.\w+)?$/.out/;
unless (open IN, "<$in") {
die "Błąd odczytu '$in': $!";
}
unless (open OUT, ">logi_poprawione.txt") {
die "Błąd zapisu '$out':$!";
}
while (<IN>) {
s/[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}/./;
print OUT $_;
}
ale nie działa to.
Co mam zmienić aby było ok ? Ktoś by mi pomógł?
-
Kod:
#!/usr/bin/perl
use strict;
use warnings;
if ($#ARGV<0) {
print "Uzycie: $0 <plik wejsciowy>\n\n";
exit 1;
}
open (IN, $ARGV[0]) || die "Blad podczas otwierania pliku $ARGV[0]: $!\n";
while (<IN>) {
# wywalamy znaki nowej linii
chomp;
# pomijamy linie ktore nie zawieraja (wylacznie) adresu IP - prosty regex
next if !/^\d+\.\d+\.\d+\.\d+$/;
# jesli tu dotarlismy to znaczy ze jest adres IP - zamieniamy ostatnia sekcje na *
s/\d+$/*/;
# wyswietlamy linie i dodajemy znak nowej linii
print "$_\n";
}
close (IN);
Traktowales zmienna $in jako nazwe pliku niby ale nie otwierales pliku w swoi kodzie, dlatego nie dzialalo. Powyzszy kod mozna jeszcze znacznie skrocic ale bylby mniej czytelny, zwlaszcza dla poczatkujacyej osoby wiec zostawiam jak jest.
-
Bardzo dziękuje za wytłumaczenie gdzie popełniałem błąd, dzięki za poprawkę i napisanie poprawnie kodu. :)