>> print handle2 "@things" || die "no file to print to? $!";
LIST_SEPARATOR special variable (i.e. $") is a space by default.
$" is used if you use "@things" in print function;
The output is like "<space>IP address\n" for each element of @things
(except the first, to be exact)
Use 'print handle2 @things;' only and you will not get the leadning space
You can use following code to remove duplicates and to sort the output:
open FIN,"c:/ipaddresses.txt" or die $!;
open FOUT,">c:/spacey.txt" or die $!;
print FOUT sort keys %{ { map { $_ => 1 } <FIN> } } ;
close FIN;
close FOUT;
HTH
JB
-----Original Message-----
From: Perl [mailto:[EMAIL PROTECTED]]
Sent: Tuesday, October 03, 2000 5:18 PM
To: [EMAIL PROTECTED]
Subject: Removing evil people , also leading spaces when copying an
array to file
Hi All...It's the Worm again,
I regularly ban evil people from my website and log their ip's to a log file
just like so:
216.86.29.12
202.144.64.4
212.189.244.34
212.189.244.34
24.14.15.59
194.23.95.100
152.163.205.36
209.244.229.125
168.191.249.201
152.163.205.37
213.3.226.93
216.201.37.161
24.226.175.199
Evil people don't stop at just one evil deed but keep going; ergo I have
many duplicate ip addresses in the file.
Far below in this email are some of the methods I was looking at to remove
dupes from the file, but along the way I noticed something unsavory: It
seems that my rather simple code of copying the contents of a file into an
array and then copying that array to a file "inserts leading spaces" on each
line, right before the ip address. Here is the code I used:
#open list of ip addresses
$file1 = 'c:\ipaddresses.txt';
open (handle1, "<$file1");
@things = <handle1> ;
#put ip addresses into an array
$file2 = 'c:\spaces.txt';
#declare variable for filename
open (handle2, ">$file2") || die "can't open file $!";
print handle2 "@things" || die "no file to print to? $!";
#print array to file spacey.txt
Does anyone know if these leading spaces can be avoided or do they have to
be removed everytime an array is copied into a file?
Thanks!
The Worm
Below are the ways I thought to removes dupes...know of a better way?
a) If @in is sorted, and you want @out to be sorted: (this assumes all true
values in the array)
$prev = 'nonesuch';
@out = grep($_ ne $prev && ($prev = $_), @in);
This is nice in that it doesn't use much extra memory, simulating uniq(1)'s
behavior of removing only adjacent duplicates. It's less nice in that it
won't work with false values like undef, 0, or ""; "0 but true" is OK,
though.
b) If you don't know whether @in is sorted:
undef %saw;
@out = grep(!$saw{$_}++, @in);
c) Like (b), but @in contains only small integers:
@out = grep(!$saw[$_]++, @in);
d) A way to do (b) without any loops or greps:
undef %saw;
@saw{@in} = ();
@out = sort keys %saw; # remove sort if undesired
e) Like (d), but @in contains only small positive integers:
undef @ary;
@ary[@in] = @in;
@out = grep {defined} @ary;
_______________________________________________
Perl-Win32-Web mailing list
[EMAIL PROTECTED]
http://listserv.ActiveState.com/mailman/listinfo/perl-win32-web
_______________________________________________
Perl-Win32-Web mailing list
[EMAIL PROTECTED]
http://listserv.ActiveState.com/mailman/listinfo/perl-win32-web