简介:问:Perl系列胖逗号有什么好的用途?

例如func_hash_as_array_arg( a => b => 1 )

详情:

我只是被一个由两个粗逗号/粗箭头所引起的错误咬伤了:

$ bash $> perl -e 'use strict; use warnings; my @v = ( a=> b => 1 )'
✓

实际上在功能上;实际上是在对象的构造函数中(受祝福的哈希),因此我在想{}是新对象时(a => b => 1)。
$ bash $>  perl -e '
    use strict; use warnings;
    sub kwargs_func{ print "inside\n"; my %kw = $_[0] ;};
    kwargs_func( a=> b => 1 )
'
inside
Odd number of elements in hash assignment at -e line ##.
✓

显然,我很快发现了该错误-但我希望有一个编译时错误或警告,而不是运行时错误。

问:胖逗号系列有什么好的用途?

我很惊讶没有为此使用的“使用警告”警告。

这是半合法使用的人为例子。我可以想象在现实生活中遇到的一个:

我做了很多图形代码。

假设输入一个常数图,例如K3,K4或K3,3(我假设所有弧都是双向的)

一个人可能输入成对的图形,例如
K3: (a<=>b, a<=>b, b<=>c).

但最好输入
K3: (a<=>b<=>c<=>a).

重复次数越少,获得的图表就越大。

例如。成对写成的K4是
K4: ( a<=>b, a<=>c, a<=>d, b<=>c, b<=>d )

而使用这些“链”的K4是:
K4: (a<=>b<=>c<=>d<=>a<=>c,b<=>d)

我已经写了我们现在称为DSL(特定于域的语言)的语言,它接受这种“链式”符号。注意:使用上面的,故意使用非Perl友好的语法。

当然,在Perl中,可能必须通过undef来指示该链的结束:
K4: (a=>b=>c=>d=>a=>c=>undef,b=>d=>undef)

尽管可能会忽略最后一个undef。

我太懒了,无法输入K3,3,所以让我输入K3,2:
DSL pairs K3,2: (a<=>x, a<=>y, b<=>x, b<=>y, c<=>x, c<=>y )

DSL chains: K3,2:  (y<=>a<=>x<=>b<=>y<=>c<=>x)

Perl pairs K3,2: (a=>x, a=>y, b=>x, b=>y, c=>x, c=>y )

Perl chains: K3,2:  (y=>a=>x=>b=>y=>c=>x=>undef)

我喜欢带有关键字参数的函数。在Perl中,有两种主要方法可以做到这一点:
func_hash_as_array_arg( kwarg1=>kwval1, kwarg2=>kwval2 )
func_hashref_as_scalar_arg( { kwarg1=>kwval1, kwarg2=>kwval2 } )

可以以一种很好的方式与位置混合
func( posarg1, posarg2, kwarg1=>kwval1, kwarg2=>kwval2 )
func( posarg1, posarg2, { kwarg1=>kwval1, kwarg2=>kwval2 } )

而且也不太好用
func( { kwarg1=>kwval1, kwarg2=>kwval2 }, varargs1, vargags2, ... )

尽管我更喜欢f(k1 => v1)而不是f({k1 => v1})-不太混乱- hashref“关键字参数组”提供了更多编译时检查的事实,这很有趣。我可能会翻转。

当然,真正的问题是Perl需要关键字参数的正确语法。

Perl6做得更好。

对于咧嘴笑,一些相关的代码示例带有2个串联的胖逗号。
$ bash $>  perl -e 'use strict; use warnings; my %v = ( a=> b => 1 )'
Odd number of elements in hash assignment at -e line 1.
✓

$ bash $>  perl -e 'use strict; use warnings; my $e = { a=> b => 1 }'
Odd number of elements in anonymous hash at -e line 1.
✓

$ bash $>  perl -e 'use strict; use warnings; my $e = [ a=> b => 1 ]'
✓

$ bash $>  perl -e '
    use strict; use warnings;
    sub kwargs_func{ print "inside\n"; my %kw = $_[0] ;};
    kwargs_func( a=> b => 1 )
'
inside
Odd number of elements in hash assignment at -e line ##.
✓

$ bash $>  perl -e '
   use strict; use warnings;
   sub kwargs_func{ print "inside\n"; my %kw = %{$_[0]} ;};
   kwargs_func( {a=> b => 1} )
'
Odd number of elements in anonymous hash at -e line ##.
inside
✓

最佳答案

对于那些不知道的人,箭头起着逗号的作用,自动在左侧引用空字。

我想不出在常规代码中能看到一连串的逗号引起的麻烦。通常,我会选择引用运算符。

my @array = qw(Minimal syntax for all these words and easier than lots of arrows);

08-25 21:56
查看更多