#!/usr/bin/perl
use warnings;
use Scalar::Util qw(looks_like_number);
sub term_value();
sub factor_value();
sub expression_value()
{
$num = @_;
@expression = $_[0];
print "expression[0]: " . $expression[0] . "\n";
$index = $_[$num-1];
print "index: $index\n";
$result = &term_value(@expression, $index);
$more = 1;
while($more)
{
$op = $expression[$index];
print "$op\n";
if ($op eq "+" || $op eq "-")
{
$index++;
$value = &term_value(@expression, $index);
if ($op eq '+')
{
$result = $result + $value;
} else {
$result = $result - $value;
}
}
else
{
$more = 0;
}
}
return $result;
}
sub term_value()
{
$num = @_;
@expression = $_[0];
print "expression[0]: " . $expression[0] . "\n";
$index = $_[$num-1];
print "index: $index\n";
$result = &factor_value(@expression, $index);
$more = 1;
while($more)
{
$op = $expression[$index];
if ($op eq "*" || $op eq "/")
{
$index++;
$value = &factor_value(@expression, $index);
if ($op eq '*')
{
$result = $result * $value;
} else {
$result = $result/$value;
}
} else {
$more = 0;
}
}
return $result;
}
sub factor_value()
{
$num = @_;
@expression = $_[0];
print "expression[0]: " . $expression[0] . "\n";
$index = $_[$num-1];
print "index: $index\n";
$result = 0;
$c = $expression[$index];
if ($c eq '(')
{
$index++;
$result = &expression_value(@expression, $index);
$index++;
} else {
while (looks_like_number($c))
{
$result = 10 * $result + $c - '0';
$index++;
$c = $expression[$index];
}
}
return $result;
}
#Collect argument and separate by character
@one_char = split(//, $ARGV[0]);
$index = 0;
$result = &expression_value(@one_char, $index);
print $result . "\n";
我的控制檯返回這些警告:未初始化的變量問題
Use of uninitialized value $op in string eq at eval.pl line 58.
Use of uninitialized value $op in string eq at eval.pl line 58.
Use of uninitialized value $op in string eq at eval.pl line 25.
Use of uninitialized value $op in string eq at eval.pl line 25.
有關$運變量未初始化。我想這可能是一個範圍問題......但我無法弄清楚。我試過了我能想到的所有東西(初始化循環外部的變量等),但是在運行該程序時似乎沒有任何區別。任何建議將不勝感激!
一百多線條沒有'strict'?原型?代碼應該做什麼? –
這只是C++代碼的一個快速轉換,用於評估表達式字符串(例如「1 + 2 * 3)」。 –
在每個子例程聲明中刪除名稱後面的「()」,您一直說這個單詞但我確實不要認爲這意味着你在想什麼,在代碼頂部放置'use strict;',修復你得到的每一個錯誤,重新發布,在做前者時,重複'Perl不是C++'一遍又一遍。 –