2012-04-19 4 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()' ' –

+3

Прочитайте парсеры рекурсивного спуска; вы должны действительно разбирать линию в целом, прежде чем пытаться выполнять какие-либо операции. Представьте «3 + 5 * 8»; вы сначала найдете «+», но вам нужно подождать, пока вы не сделаете умножение. – chepner

+1

Это довольно сложная задача для начинающего perl, и я предполагаю, что он предназначен для обучения. В противном случае вы должны взять совет Fredrik выше и просто использовать уже работающую математическую функциональность perl. – TLP

ответ

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 

Теперь это до вас, чтобы ИМР te некоторый код, который делает правильные вычисления на токенах. Это не слишком сложно, если вы не пытаетесь разобрать parens, но если вы это сделаете, вам нужно написать рекурсивный синтаксический анализатор, который намного сложнее.

+0

Ознакомьтесь с руководством perlre для получения дополнительной информации о регулярных выражениях. – mzedeler