#!/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";
내 콘솔은 이러한 경고를 반환합니다. 나는 이것이 범위 문제일지도 모른다라고 생각하고있다. .. 그러나 나는 그것을 이해할 수 없다. 나는 내가 생각할 수있는 모든 것을 시도했다. (루프 밖에서 변수를 초기화한다.)하지만 그 중 아무 것도 프로그램을 실행할 때 차이를 만드는 것 같지는 않다. 어떤 제안이라도 대단히 감사하겠습니다!초기화되지 않은 변수 문제는
더? 프로토 타입? 수행해야 할 코드는 무엇입니까? –
이것은 표현 문자열 (예 : "1 + 2 * 3")을 평가하는 데 사용 된 C++ 코드의 빠른 번역이었습니다. –
각 서브 루틴 선언에서 이름 뒤에'()'를 제거하면 그 단어를 계속 말하고 있지만 코드의 맨 위에'use strict; '를 놓고 모든 오류를 수정하십시오. 이전을 수행하는 동안'Perl is not C++'을 반복해서 반복하십시오 :) –