Hi all, I've seen a number of emails on this subject but unfortunately haven't managed to find a solution to the specific issue I'm having.

Essentially I am loading data into a hash of hashes, one field of which contains a sub routine that I need to perform if all the keys match.

That part is all working fine - except for the fact that unless I turn off strict I can't use it! :)

Sample data I'm loading into the hash is:

000.01|RECD_TYPE|01-03|CHAR(3)|RECORD TYPE|check_char 000.02|DATE_TIME| 05-21|CHAR(17)|TIME STAMP|check_time 000.03|DATE_ISSUE|23-30|CHAR(8)|DATE OF ISSUE|check_date 010.01|RECD_TYPE|01-03|CHAR(3)|RECORD TYPE|check_char 010.02|PROP_NUMB|05-11|PIC(9999999)|PROPERTY NUMBER|check_numeric

I'm loading the data into my hash of hashes table via

open( $record_layout, '<', $RECORD_LAYOUT ) or die "Open file $RECORD_LAYOUT failed $!"; #Load record formats into a hash. If record layout changes simply chan +ge layout while ($record = <$record_layout>) { chomp $record; my @fields = split(/\|/, $record); my @keys = split(/\./, $fields[0]); $keys[1] =~ s/\s*$//; $keys[1] = int($keys[1]); if (! $rec_layout_hash{$keys[0]}) { $rec_layout_hash{$keys[0]} = {}; } else { $rec_layout_hash{$keys[0]}->{$keys[1]} = {}; } $rec_layout_hash{$keys[0]}->{$keys[1]} = {'field_type' => $fields[1], 'chars_position' => $fields[2], 'field_length' => $fields[3], 'sub_routine' => $fields[5], }; } close $record_layout;
Then reading the hashes to obtain and call the subroutine via

my $input_file; my $line; open( $input_file, '<', $ARGV[0] ) or die "Open file $ARGV[0] failed $!"; while ($line = <$input_file>) { chomp $line; my @fields = split(/\|/, $line); #Check if record is a valid record type if ($fields[0] !~ /$record_types/) { fatal_error (2, "record contains invalid file type fields[0] - + Record: $line"); exit 0; } #Check if number of fields in record matches the number in the record +layout my $expected_nbr_of_fields_in_record = keys %{$rec_layout_hash{$fi +elds[0]}}; my $actual_fields_count = @fields; if ($actual_fields_count != $expected_nbr_of_fields_in_record) { fatal_error (1, "record does not contain correct number of fi +elds - Expected $expected_nbr_of_fields_in_record but record containe +d $actual_fields_count fields - $line"); exit 0; } #Process each field from the input data one field at a time for (my $i = 1; $i <= $actual_fields_count; $i++) { my $j = $i; $j -= 1; #$j is minus 1 becau +se the fields array starts at zero, whilst the actual field number in + the record array starts at 1 #Determine which sub routine is required to check the data from the re +cord_layout hash my $sub_routine = $rec_layout_hash{$fields[0]}{$i}{"sub_rout +ine"}; #Call sub routine and pass the actual field day and the expected lengt +h of the fiel my $value1 = $fields[$j]; my $value2 = $rec_layout_hash{$fields[0]}{$i}{"field_length" +}; &{ $sub_routine } ($value1, $value2); } }
It's when I then call the sub routine that I get the message
Can't use string ("check_char") as a subroutine ref while "strict refs" in use

Is there any way I can call the sub routine - which will be in a separate module (not that that should make any difference) without turned off strict? Thanks for your time Kev


In reply to subroutine ref while "strict refs" by viffer

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.