我可以在Perl中编写DSL吗?

前端之家收集整理的这篇文章主要介绍了我可以在Perl中编写DSL吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们使用Perl进行GUI测试自动化.这是非常成功的.我们已经编写了一种非常轻量级的DSL语言来进行GUI测试. DSL非常类似于对象模型.

例如,我们在根目录下有一个Application对象.应用程序中的每个属性表都是一个View对象.页面下的每个页面都被称为页面对象本身.
从Perl,我们发送命令到GUI应用程序,GUI解释命令并很好地响应命令.要发送命令,我们执行以下操作:

socket_object->send_command("App.View2.Page2.Activate()")
socket_object->send_command("App.View1.Page3.OKBtn.Click()")

这不是很可读.相反,我想为App,View和Page写一个Perl DSL.
Perl提供某种DSL结构,我可以在以下几个方面做

App.View2.Page2.Activate();
App.View1.Page2.Click();

应用程序应该是应用程序类的一个实例.我必须在运行时获取View2的对象.

如何使用这样的东西?

解决方法

你几乎可以在Perl中做任何事情.但是你必须做一些奇怪的事情来让Perl执行一些只是不是Perl的语法.

>为了正确处理你在那里的事情,你必须有很多先进的技巧,根据定义,这不是可维护的.你必须:

> overload连接运算符”. (需要有福的参考)
关闭strictures或创建一个AUTOLOAD站点,以允许那些裸露的单词 – 当然,您可以为所有想要使用的单词(或使用barewords模块)编写子站点.
>可能,创建多个包,多个AUTOLOAD

>另一种方式是source filters,我可以拿起一个downvote,只是为了提到这个能力.所以我不会为那些要求帮助的人推荐这种方法.但它在那里.来源过滤器(和我已经完成了我的分享)只是其中一个可以认为你太聪明的领域.

不过,如果您对Perl作为DSL“主机”语言感兴趣,那么source filters不是完全不受限制的.然而,将这个限制在你想要做的事情上,Perl6::Attributes可能会大部分时间完成你所需要的工作.这将需要并将它们翻译成“ – >” Perl会明白.但是您仍然可以查看源过滤器来了解幕后发生的情况.

我也不想离开这个话题,而不是建议您使用Damian Conway的Filter::Simple来缓解您生成自己的源代码过滤器(我建议不要做)的很多挫败感.
最简单的就是放弃”.运算符,而只是期望Perl的代码.

App->View2->Page2->Activate(); 
App->View1->Page2->Click();

应用程序将是一个包或一个子.在当前包中定义的或导入的,它将一个带有View2子(可能是一个AUTOLOAD子)的一个对象保存到一个包中,该对象返回一个包或名称被引用到包中的名称,它可以理解Page2,然后最终从那里返回会了解Activate或Click. (见OO tutorial,如果需要的话)

原文链接:https://www.f2er.com/Perl/172525.html

猜你在找的Perl相关文章