johnrein55 has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

I am getting undefined eror as listed below for the log file when search criteria "SRCH=Q" is missing. Here is the log file and error .

[[04/Jun/2013:13:06:13 -0600] conn=13570 op=14 msgId=13 - BIND dn="uid +=xyz123,ou=People,o=xyz.com" method=128 version=3 [04/Jun/2013:15:06:13 -0600] conn=13570 op=14 msgId=15 - RESULT err=0 +tag=101 nentries=48030 etime=139 SRCH=Q [04/Jun/2013:13:06:13 -0600] conn=13572 op=14 msgId=13 - BIND dn="uid= +xyz123,ou=People,o=xyz.com" method=128 version=3 [04/Jun/2013:15:06:13 -0600] conn=13572 op=14 msgId=15 - RESULT err=0 +tag=101 nentries=48030 etime=139 SRCH=Q [04/Jun/2013:17:06:13 -0600] conn=13571 op=14 msgId=13 - BIND dn="uid= +someoneelse,ou=People,o=xyz.com" method=128 version=3 [04/Jun/2013:18:06:17 -0600] conn=13571 op=14 msgId=15 - RESULT err=0 +tag=101 nentries=48030 etime=139 SRCH=Q [04/Jun/2013:13:06:13 -0600] conn=13573 op=14 msgId=13 - BIND dn="uid= +xyz123,ou=People,o=xyz.com" method=128 version=3 [04/Jun/2013:15:06:13 -0600] conn=13573 op=14 msgId=15 - RESULT err=0 +tag=101 nentries=48030 etime=139

Here is the error

User xyz123 had 1 searches on connection 13570 User xyz123 had 1 searches on connection 13572 Can't use an undefined value as an ARRAY reference at hash1.pl line 23 +, <IN> line 8.

Here is the code.

use strict; use warnings; use Data::Dumper; my %users; my %searches; while (<DATA>) { # I use DATA handle instead of $fh for convenience if( /BIND/ ) { my( $conn, $uid ) = /conn=(\d+).*uid=(.*?),/; push @{$users{$uid}}, $conn; } if( /SRCH=Q/ ) { my ($timestamp, $conn) = /\[(.*?)\] conn=(\d+)/; push @{$searches{$conn}}, $timestamp; } } for my $user (keys %users) { for my $conn (@{$users{$user}}) { print "User $user had ".scalar( @{$searches{$conn}} ). +" searches on connection $conn\n"; print "\t=> Bad user!\n" if @{$searches{$conn}} > 3; } } print Dumper \%users; print Dumper \%searches;

Replies are listed 'Best First'.
Re: Undefined Error
by hdb (Monsignor) on Jun 15, 2013 at 07:41 UTC

    You need to check for the existence of $searches{$conn} before you use if as an array reference! ;)

    for my $user (keys %users) { for my $conn (@{$users{$user}}) { if( exists $searches{$conn} ) { print "User $user had ".scalar( @{$searches{$conn}} )." searches + on connection $conn\n"; print "\t=> Bad user!\n" if @{$searches{$conn}} > 3; } } }
      if( my $soy = $searches{sauce} ){ print int(@$soy); }
      Hi HDB,

      I am not getting an error, however the count part of the code is not working, have you tested it?

      print "\t=> Bad user!\n" if @{$searches{$conn}} > 3;
        Can you explain "the code is not working" ?.
        The missing SRCH=Q means you will not get a line like this in the results with the code and data shown.
        User xyz123 had 1 searches on connection 13573
        poj

        What do you expect as output for your dataset? I thought the following would be fine:

        User xyz123 had 1 searches on connection 13570 User xyz123 had 1 searches on connection 13572 User someoneelse had 1 searches on connection 13571
Re: Undefined Error (use diagnostics)
by Anonymous Monk on Jun 15, 2013 at 07:42 UTC

    use  @{ $searches{$conn} || [] }

    The explanation

    $ perl -le " use strict; use diagnostics; my $peter; print scalar @$pe +ter; Can't use an undefined value as an ARRAY reference at -e line 1 (#1) (F) A value used as either a hard reference or a symbolic referenc +e must be a defined value. This helps to delurk some insidious errors. Uncaught exception from user code: Can't use an undefined value as an ARRAY reference at -e line +1.

    On explanation Basic debugging checklist (with Read this if you want to cut your development time in half! )

Re: Undefined Error
by poj (Abbot) on Jun 15, 2013 at 07:48 UTC
    Can you not use RESULT instead of/as well as SRCH=Q ? ;
    if( /SRCH=Q|RESULT/ ) {
    poj