2012-04-19 52 views
1

我意識到問題的名稱並沒有真正說明太多,但我很快就不知道如何解釋,所以這裏是長版本。我應該如何找到幾個可能的字符的索引?

首先,這是我當前的代碼:

#! /usr/bin/perl 

use strict; 
use warnings; 

my $input; 
while (<>) { 
     $input .= $_; 
} 
$input =~ s/ |\n//g; 

print "\n"; 

我想要做的就是讓一個計算器,例如當用戶做它echo "8 * 5 + 21-15" | calculate它會正確計算它。所以這是我的思想進步。首先,我將整個字符串作爲一個整體,並將其刪除所有空白字符。然後我想索引()它的出現*,+,/或 - 。然後,我想將所有這些運算符前面的字符添加到一個字符串中,然後將(int)字符串添加到運算符後面的部分,然後在它們之間執行操作。但我並沒有太多的線索知道如何做到這一點。另外,我對Perl非常陌生(3天的體驗),所以如果可能的話,請慢慢來。

非常感謝。

+2

'echo「8 * 5 + 21-15」| perl -ne'print eval()'' – 2012-04-19 14:36:55

+3

閱讀遞歸下降解析器;在嘗試執行任何操作之前,您應該真正解析該行。想象一下'3 + 5 * 8';你會首先找到「+」,但是需要等到你進行乘法運算。 – chepner 2012-04-19 14:40:49

+1

這對於perl初學者來說是一個相當複雜的任務,我假設它是爲了學習目的。否則,你應該採取弗雷德裏克的建議,並簡單地使用Perl已經工作的數學功能。 – TLP 2012-04-19 14:54:13

回答

0

如果你能接受你的計算器將不能夠處理括號,使用正則表達式來解析你的字符串:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @tokens = <STDIN> =~ /(\d+|\+|-|\*|\/)/g; 
print "$_\n" for @tokens; 

這將爲您提供代幣的數組,你可以工作,所以

echo "8 * 5 + 21-15" | script.pl 

將打印

8 
* 
5 
+ 
21 
- 
15 

現在是你來WRI一些代碼可以對令牌進行正確的計算。如果不嘗試解析parens並不難,但是如果你這樣做,則需要編寫一個遞歸解析器,這非常困難。

+0

查看perlre手冊以獲取有關正則表達式的更多信息。 – mzedeler 2012-04-21 19:50:12