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
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.