Perl不带逗号的多个子参数
pert是否可以实现以下语法Perl不带逗号的多个子参数,perl,Perl,pert是否可以实现以下语法 sub a { my ($first, $second) = @_; print "$first $second"; } sub b { my ($param, $code) = @_; my $res = $code->(); return "$param $res"; } a 'param1' b 'param2' => sub { return "param3" }; #output would be "
sub a {
my ($first, $second) = @_;
print "$first $second";
}
sub b {
my ($param, $code) = @_;
my $res = $code->();
return "$param $res";
}
a 'param1' b 'param2' => sub { return "param3" };
#output would be "param1 param2 param3"
a是sub,它将进入@u'param1'内部,而b(它将进入'param2'和一个subref内部)返回的任何内容。我喜欢在“b”之前没有逗号。有可能吗?我强烈建议不要这样做。你省略逗号的动机是什么
- 语言X在这里不需要逗号 Perl不是X。X可能有很多特性,但Perl没有。这还包括静态类型、缩进敏感解析和Lisp风格的宏。如果你绝对需要X的功能,也许你应该使用X
- 我正在用Perl编写一个DSL,其中逗号会很烦人 我意识到这一趋势,即编写复杂的API,这些API看起来像普通文本,并将其称为“DSL”。他们不是;DSL要求您实际解析某些内容。如果您正在编写一个API,它最好是宿主语言中的惯用语言。即使这涉及到逗号之类的错误
- 我真的很想这样做,不管原因是什么,不管结果多么脆弱
在这种特殊情况下,我可以编写代码来执行您希望的操作。它使用荒谬且不鼓励的“与格”形式的方法调用(也称为“间接对象表示法”)
将是一个类,我们在该类上调用param1
方法。参数列表将调用a
:b
当然,这只是use feature 'say'; package param1 { sub a { my ($first, $second) = @_; say "$first $second"; } } sub b { my ($param, $code) = @_; my $res = $code->(); return "$param $res"; } a param1 b param2 => sub { "param3" }; # look, optional quotes for param1
的语法糖分。它要求您事先知道'param1'->a(b(param2=>sub{'param3'}))
的所有值,除非您首先创建一个包装第一个参数的对象:param1
但这很愚蠢use feature 'say'; package MyApi { sub a { my ($first, $second) = @_; say "$$first $second"; } } sub b { my ($param, $code) = @_; my $res = $code->(); return "$param $res"; } sub api($) { bless \shift() => 'MyApi' } my $param1 = api 'param1'; a $param1 b param2 => sub { "param3" };
- 我仍然想做这件事,但没有那种脆弱的胡说八道。我也不在乎我要付出多少努力来完成这件事 您可以向Perl解析器添加关键字,以便接管解析。这需要您对Perl的解析器API有一定的了解,并且您的代码不会在较旧的Perl上工作。因为您可能不想用C编写解析器,您可能希望看到类似的内容,但这些模块往往有点不确定。G祝你好运
- 语言X在这里不需要逗号 Perl不是X。X可能有很多功能,但Perl没有。这还包括静态键入、缩进敏感解析和Lisp风格的宏。如果您绝对需要X的功能,也许您应该使用X
- 我正在用Perl编写一个DSL,其中逗号会很烦人 我意识到这种趋势,即编写与普通文本相去甚远的复杂API,并将其称为“DSL”。事实并非如此;DSL要求您实际解析某些内容。如果您正在编写API,则最好在宿主语言中使用惯用语。即使这涉及到零星的逗号等
- 我真的很想这样做,不管原因是什么,不管结果多么脆弱
在这个特定的例子中,我可以编写代码来做你想做的事情。它使用了荒谬且不受欢迎的“与格”形式的方法调用(也称为“间接对象表示法”)
将是一个类,我们在该类上调用param1
方法。参数列表将调用a
:b
当然,这只是use feature 'say'; package param1 { sub a { my ($first, $second) = @_; say "$first $second"; } } sub b { my ($param, $code) = @_; my $res = $code->(); return "$param $res"; } a param1 b param2 => sub { "param3" }; # look, optional quotes for param1
的语法糖分。它要求您事先知道'param1'->a(b(param2=>sub{'param3'}))
的所有值,除非您首先创建一个包装第一个参数的对象:param1
但这很愚蠢use feature 'say'; package MyApi { sub a { my ($first, $second) = @_; say "$$first $second"; } } sub b { my ($param, $code) = @_; my $res = $code->(); return "$param $res"; } sub api($) { bless \shift() => 'MyApi' } my $param1 = api 'param1'; a $param1 b param2 => sub { "param3" };
- 我仍然想做这件事,但没有那种脆弱的胡说八道。我也不在乎我要付出多少努力来完成这件事 您可以向Perl解析器添加关键字,以便接管解析。这需要您对Perl的解析器API有一定的了解,并且您的代码不会在较旧的Perl上工作。因为您可能不想用C编写解析器,您可能希望看到类似的内容,但这些模块往往有点不确定。G祝你好运