I am writing some code for an automated theorem prover. I wanted to implement an option for the user to pass a file on the cmd line and have it operate in batch mode.
Here is the code to parse the file and fill the @clauses
array.
# batch mode
if ($ARGV[0]) {
my $filename = $ARGV[0];
open(IN, "<", $filename);
chomp(@clauses = <IN>);
$conclusion2 = $clauses[@clauses - 1];
# set sos as negated conclusion
$SOS[0][0] = $conclusion2;
# negate the negation to get the desired conclusion for later
@conclusion = split(undef, $conclusion2);
# look for a ~, remove it if you find it, add one if you don't
for (my $i = 0 ; $i < @conclusion ; $i++) {
# while you're at it.....
# get rid of spaces and anything that isn't a ~ or letter
$conclusion[$i] =~ s/( |[^A-Za-z~])//;
if ($conclusion[$i] eq '~') {
splice(@conclusion, $i, 1);
$i--;
$found = 1;
}
}
if (!$found) {
$conclusion = "~$conclusion2";
}
else {
$conclusion = join(undef, @conclusion);
}
# now break up each line and make @clauses 2d
for (my $a = 0 ; $a < @clauses ; $a++) {
my $str = $clauses[$a];
my @tmp = split(',', $str);
for (my $b = 0; $b < @tmp; $b++) {
$clauses[$a][$b] = $tmp[$b]; # ERROR HERE
}
}
# for(my $i=0; $i<@clauses;$i++)
# {
# print "$i";
# for(my $b=0; $b<=@{@clauses};$b++)
# {
# print "$clauses[$a][$b]";
# }
# print "\n";
# }
}
I'm putting in more than I really need to, but the troublesome part is when I'm trying to break up the lines of the file by the commas and make the array two-dimensional.
At the line I have marked I get the error
Can't use string ("a,b,c") as an ARRAY ref while "strict refs" in use
The input file is set up like this
a,b,c
b,~c
~b
~a
This would be a proof to prove that a
must be true
It's weird, because in the code for the interactive section, I do the exact same thing, almost verbatim and it works perfectly.
EDIT I'm certain that somehow, the error lies within this line
$clauses[$a][$b] = $tmp[$b];
the error message is as follows:
can't use string ("a,b,c") as ARRAY ref while strict refs in use.
I don't see the need for any dereferencing on my part so what could the problem be?