我在学习Perl,我想包围一个像这样的表达式
function1(mathematical_expresion1)*function2(mathematical_expresion2)
其中'function1'和'function2'可以是任何单词并将数字组合在一起,例如function1可以是fun3dec,fun4nels,factor9或者其他...... 所以我的代码将成为这个
surrounded(function1(mathematical_expresion1)*function2(mathematical_expresion2))surroundedend
其中包围和surroundedend是字符串链。
所以如果我有这样的表达式:
exp(-49/200)-exp(-49/200)*(x-49/200)+1/2*exp(-49/200)*(x-49/200)^2-1/6*exp(-49/200)*(x-49/200)^3+1/24*exp(-49/200)*(x-49/200)^4-1/120*exp(-49/200)*(x-49/200)^5+1/720*exp(-49/200)*(x-49/200)^6-1/5040*exp(-49/200)*(x-49/200)^7+1/40320*exp(-49/200)*(x-49/200)^8-1/362880*exp(-49/200)*(x-49/200)^9+1/3628800*exp(-49/200)*(x-49/200)^10-1/39916800*exp(-49/200)*(x-49/200)^11+1/479001600*exp(-49/200)*(x-49/200)^12
我可以在前一个表达式中围绕两个术语的所有乘法。
谢谢你教我Perl!
答案 0 :(得分:1)
这是第一个(不完整的)解决方案,它提出了一些关于你想做什么的问题:
为了简洁起见,我使用了更简单的语法 - 函数的参数是简单的数字或表达式。函数名称是单个字母。环绕声由S{}
取代。不过,很容易从这个扩展到你的例子。
sample.txt的:
1 A(1)
2 A(1)*B(2)
3 C(2)+A(1)*B(2)
4 C(A(1)*B(2))
5 C(A(1)*B(3)+C(4))
6 A(1)*B(2)+C(3)*D(4)
7 A(1)*B(2)*C(3)*D(4)
8 A(B(2)*C(3))*D(4)
9 C(A(1)+B(3))*C(4)
perl < sample.txt -pe 's/(\w\(\d+\)\*\w\(\d+\))/S{\1}/g'
1 A(1)
2 S{A(1)*B(2)}
3 C(2)+S{A(1)*B(2)}
4 C(S{A(1)*B(2)})
5 C(S{A(1)*B(3)}+C(4))
6 S{A(1)*B(2)}+S{C(3)*D(4)}
7 S{A(1)*B(2)}*S{C(3)*D(4)}
8 A(S{B(2)*C(3)})*D(4)
9 C(A(1)+B(3))*C(4)
那么,第7行应该做什么?第8行应该做什么?
第9行不起作用,因为我的代码不够智能,我不知道你是否需要它工作。
我建议你真的需要一个解析器(例如yacc)和一个词法分析器。 Perl中有一个词法分析器,但不是解析器。
这里的问题是您正在搜索以下实例:
<expression> `*` <expression>
但由于表达式定义为
<expression> = \d+
| <function>
| <expression> <op> <expression>
您需要push down automaton才能使其正常运行。 Perl正则表达式就是不能这样做。
注意:自我的编译课程开始已有十年了,所以我的术语可能有些不稳定。