简介:问: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);