2013-09-29 35 views
1

我想讓一個程序女巫給用戶一個隨機的數學問題和答案,但如果我嘗試將操作符存儲在我的數組中而不會出現字符串,但是當我想讓程序解決問題時會導致問題,因爲操作符被忽略,並且兩個數字加在一起。請幫忙!?!使用一個算術字符串中的操作符

#!/usr/bin/perl 

    use strict; 
    use warnings; 

    sub randomNumber #generates a random number (1-100) 
    { 
     my $randomNumber = int(rand(100)) + 1; 
     return "$randomNumber\n"; 
    } 

    sub operators #randomly chooses a operator 
    { 
     my @list = ("+" , "-" , "/" , "*"); 
     my $index = rand(@list); 
     return $list[$index]; 
     } 

    sub question{ 
     my $firstNumber = randomNumber(); 
     my $operater = operators(); 
     my $secondNumber = randomNumber(); 
     print $firstNumber.$operater.$secondNumber."\n"; 
     print $firstNumber + $operater + $secondNumber; #this is the problem line 
    } 

    question(); 

Here is a screenshot of the code when run:

感謝這裏的幫助,是我對未來的讀者最終實現:

#!/usr/bin/perl 

use strict; 
use warnings; 

sub randomNumber 
{ 
    my $randomNumber = int(rand(100)) + 1; 
    return $randomNumber; 
} 

sub randomOperator 
{ 
    my @operators = ("+" , "-" , "/" , "*"); 
    my $index = rand(@operators); 
    return $operators[$index]; 
    } 

sub question{ 
    my $firstNumber = randomNumber(); 
    my $operator = randomOperator(); 
    my $secondNumber = randomNumber(); 
    print "$firstNumber $operator $secondNumber ="; 
    my $userAnswer = <STDIN>; 
    my $trueAnswer = eval "$firstNumber $operator $secondNumber"; #gets answer 
    if ($userAnswer == $trueAnswer) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

print question(); 

回答

2
print eval "$firstNumber $operater $secondNumber"; 

,而不是

print $firstNumber + $operater + $secondNumber; 

eval之前的理智檢查在處理用戶輸入時也是一個好主意。

4

什麼是三星加星號?是啊,沒有多大意義,但它是什麼,你問的Perl做

它看起來像你想生成和執行Perl代碼,但你會使用.代替+而不是+來連接字符串。然後你仍然需要將代碼傳遞給Perl進行編譯和執行,這可以使用eval EXPR完成。

my $code = '$firstNumber' . $operater . '$secondNumber'; 
my $result = eval($code); 

而不是生成Perl代碼,更強大的解決方案是使用調度表。

my %operations = (
    '*' => sub { $_[0] * $_[1] }, 
    '/' => sub { $_[0]/$_[1] }, 
    '+' => sub { $_[0] + $_[1] }, 
    '-' => sub { $_[0] - $_[1] }, 
); 

my $result = $operations{$operater}->($firstNumber, $secondNumber); 

注:

  • 如果您使用的調度表,my @list = ...;變得my @list = keys(%operations);
  • $operater應該被命名爲$operator
  • @list應該被命名爲@operators
  • operators應該被命名爲。