http://qs321.pair.com?node_id=108695

Hello monks,

Well, it's been a while since I've been active here; I have been helping other with coding, on such places as OpenNAP, and of course, IRC. -- When others paste code, it's always a good idea to parse the code, and exclude their nick, or other appended information; So I wrote an all purpose chat client paste parser.


#!/usr/bin/perl -w # Chat client paste parser # Author: dusk use strict; die "Usage: $0 [input file] [output file] [nick] [0:1]\n" unless $ARGV +[3]; warn "Remember: 0 and 1 denote timestamped, or not -- respectively\n"; my $nick = $ARGV[2]; open (INPUT, "$ARGV[0]"); foreach (<INPUT>) { open (OUTPUT, ">>$ARGV[1]"); if ($ARGV[3] == 0) { print OUTPUT "$1\n" if /^\W$nick\W\s(.*)/ } else { print OUTPUT "$1\n" if /^\W\d.*\W\s\W$nick\W\s(.*)/ } } close OUTPUT; close INPUT;


Edit ar0n -- fixed whitespace

Replies are listed 'Best First'.
Re: Chat Client Paste Parser
by Hofmator (Curate) on Aug 29, 2001 at 13:53 UTC

    Some quick comments:

    • Your open statements should check if they succeed, something like this works: open (INPUT, $ARGV[0]) or die "Couldn't open $ARGV[0]: $!";
    • Don't use a foreach loop here, this reads the whole input file into memory. You want to process the file line by line so just use while (my $line = <INPUT>)
    • Take the open OUTPUT out of the loop. At the moment you are opening and closing the output file for every line you are processing, very inefficient. This is so, because open implicitly closes the file before it opens it again.

    -- Hofmator