【发布时间】:2016-08-04 01:23:43
【问题描述】:
我想知道如何运行这样的操作
$T = 25 C;
@specs = (273.15 K, 23 bar, 2.0 mol/s);
并让它们编译。我对他们的结果是什么或如何实施并不挑剔。我的目标是让带有传统后缀单位注释的物理量表达式编译为这些单位的 perl 表达式。
我认为我需要使用自定义解析技术,但我更愿意使用任何现有功能或解析模块,而不是仅将正则表达式过滤器应用于我的原始源。
Parse::Keyword 看起来很有希望,但我看不到它是否可以解析后缀操作,并且它声称已弃用。
编辑:如果可能,我想避免使用源过滤器,因为我不想为 Perl 的语法极端情况(例如“25 (J/K)”)编写正则表达式。
Perl 在这里产生的错误说明:
perl -E "25 C"
Bareword found where operator expected at -e line 1, near "25 C"
(Missing operator before C?)
看来我需要挂钩 Perl 在数字文字之后检测运算符的位置。
Devel::Declare 可以添加后缀运算符吗?如果有,怎么做?
【问题讨论】:
-
听起来像是source filter 的工作。不过,请理解source filters are almost always a bad idea。我会推荐一种不需要使用 perl 的解析规则的方法;它不是那么漂亮,但我更喜欢
$T = My::Measurement->new(value => 25, units => 'C');之类的东西。 -
这个模块的目标是明确地允许简洁的形式,就像一种特定领域的语言。
-
请更准确地描述您想要的结果。
$T = '25 C'可以接受吗? -
没有。我的目标是不引用这些表达式并在以后手动解析它们,而是教 perl 编译器(或破解 perl 的解析)使其能够自己解析这些后缀表达式。
-
你觉得写
$T = 25 .C可以接受吗?这个想法是(ab)使用运算符重载来构造对象。概念证明here.
标签: perl parsing postfix-operator