in reply to Re^2: Real time log parser
in thread Real time log parser

There's no difference to the usual way passing arguments to subroutines or scripts works.  In the above code, $_ (the current line read fron the file handle) is being passed to a subroutine hold() in case the regex matches. What the routine then does with it, depends on its implementation... So what does it look like?  Could it be you're confusing subroutine arguments (@_) and command line arguments (@ARGV)?

Replies are listed 'Best First'.
Re^4: Real time log parser
by kazak (Beadle) on Jan 02, 2012 at 19:27 UTC
    Here's what I'm trying to do in general. As I said before, I'm new to perl so my code be so-so, but it worked from the command line, and now I'm trying to make it work with File::Tail:
    #!/usr/bin/perl # Squid reconfiguration script rev: 0.87 # use File::Tail; my (@tmpl,@cut); sub ban { open( CFG, "<", "/etc/squid/squid.conf" ); while ( <CFG> ) { push @cfg, $_; } close(CFG); my @cutoff = grep /proxy_/,@_; s/ROUNDROBIN_PARENT\///g for @cutoff; @cutoff = grep /@cutoff/,@cfg; open( GREY, ">", "/etc/squid/all.grey" ); if (@cutoff) { print GREY @cutoff; print GREY "10\n"; } close (GREY); print "Banned parrent: @cutoff\n"; print " Strings with parrent in conf: @cutoff\n"; open( EXC, ">", "/etc/squid/squid.conf" ); my %dels = map { $_ => 1 } @cutoff; @cfg = grep !$dels{$_}, @cfg; print EXC @cfg; close (EXC); @args = ("/etc/init.d/squid", "reload"); system(@args) == 0 or die "system @args failed: $?" ; } my $name = "/var/log/squid/access.log"; my $ref=tie *FH,"File::Tail",(name=>$name); while (<FH>) { my $res = ban ($_); m/\/sorry\// && ban ($_); }
      my @cutoff = grep /proxy_/,@_; s/ROUNDROBIN_PARENT\///g for @cutoff; @cutoff = grep /@cutoff/,@cfg;

      I'm not sure what this is supposed to be doing, but it somehow looks suspicious ;)   In @_ you have one line — as read from FH and passed to ban() ... What do those lines look like, and what do you expect to be in @cutoff after those three lines have executed?

      You said it worked from the command line.  How did you call it for this?

      P.S.: please indent your code properly.  You'll not only do us a favor, but yourself, too, in the long run...

        Sorry for such code, I'm just getting starting with perl and on perlmonks.org. So, line that should be passed to a ban() script as is, if regexp matches:

        1325521875.165 93 127.0.0.1 TCP_MISS/302 667 GET http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Just+an+axample - ROUNDROBIN_PARENT/proxy_218 text/html

        my @cutoff = grep /proxy_/,@_; s/ROUNDROBIN_PARENT\///g for @cutoff; @cutoff = grep /@cutoff/,@cfg;
        Should left in @cutoff after second line: proxy_218 In third line script must search against squid.conf strings with proxy_218, and it shuould find:

        cache_peer 111.222.121.1 parent 60099 0 no-query no-digest originserver name=proxy_218 round-robin login=login:pass connect-timeout=3

        cache_peer_access proxy_218 allow all

        These lines must be moved to some file, and squid must be reloaded. I've executed my script like this:

        # ./MY__SCRIPT.pl 1325521875.165 93 127.0.0.1 TCP_MISS/302 667 GET http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Just+an+axample - ROUNDROBIN_PARENT/proxy_218 text/html