Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么';从@ARGV/@读取的t映射?_Perl - Fatal编程技术网

Perl 为什么';从@ARGV/@读取的t映射?

Perl 为什么';从@ARGV/@读取的t映射?,perl,Perl,如果没有参数列表,是否有充分的理由不读取@(在函数中)或@ARGV(在其他任何地方) 我不知道为什么Larry没有制作map,grep和其他列表函数在@上运行,比如pop和shift这样做,但我可以告诉你为什么我不会。默认变量过去很流行,但是Perl程序员发现大多数“默认”行为导致的问题比它们解决的问题还要多。我怀疑他们会不会成为今天的语言 第一个问题是记住当没有传递参数时函数会做什么。它是否作用于隐藏变量?哪一个?你只需要死记硬背就可以了,这使得学习、阅读和书写语言的工作量大大增加。你可能会弄

如果没有参数列表,是否有充分的理由不读取
@
(在函数中)或
@ARGV
(在其他任何地方)

我不知道为什么Larry没有制作
map
grep
和其他列表函数在
@
上运行,比如
pop
shift
这样做,但我可以告诉你为什么我不会。默认变量过去很流行,但是Perl程序员发现大多数“默认”行为导致的问题比它们解决的问题还要多。我怀疑他们会不会成为今天的语言

第一个问题是记住当没有传递参数时函数会做什么。它是否作用于隐藏变量?哪一个?你只需要死记硬背就可以了,这使得学习、阅读和书写语言的工作量大大增加。你可能会弄错,这意味着有虫子。Perl对此保持一致(即所有采用列表的函数都在@上运行,所有采用标量的函数都在$上运行)可以缓解这一问题,但还有更多的问题

第二个问题是基于上下文的行为变化。将一些代码从一个子例程中取出,或将其放入一个子例程中,突然之间,它的工作方式就不同了。这使得重构更加困难。如果你让它只在
@
@ARGV
上工作,那么这个问题就会消失

第三,默认变量有被悄悄修改和读取的趋势<代码>$\u是危险的,因为这个原因,你永远不知道什么时候会有东西覆盖它。如果采用
@
作为默认列表变量,则此行为可能会泄漏

第四,它可能会导致复杂的语法问题。我想这是当初流行
$时阻止它被添加到语言中的最初原因之一

第五,
@ARGV
作为默认值在编写主要使用
@ARGV
的脚本时有一定的意义。。。但在图书馆工作时,这没有任何意义。Perl程序员已经从编写快速脚本转向编写库

第六,默认使用
$\uuu
是一种将标量操作链接在一起的方法,无需反复写入变量。如果Perl在返回值方面更加一致,如果正则表达式没有特殊的语法,那么这种情况可能会有所缓解,但现在已经有了。列表已经可以链接,
map{…}sort{…}grep/../,@foo
,这样用例就可以通过更高效的机制来处理

最后,它的用途非常有限。很少有人希望将
@
传递到
map
grep
。隐藏默认值的问题远远大于避免键入两个字符。当Perl主要用于快速而繁琐的工作时,这种节省空间的做法可能会稍微有点道理,但在编写几页代码之外的任何东西时,这种节省空间的做法就毫无意义了


PS
shift
默认设置为
@
我的$self=shift
中找到了一个位置,但我发现这只是因为Perl的参数处理非常糟糕。

map
函数接受一个列表,而不是一个数组
shift
接受一个数组。另一方面,对于列表,
@
/
@ARGV
可能是也可能不是公平的默认值。

除了数组操作符之外,没有其他内置函数,为什么
map
会这样做呢?这不是一个不合理的期望。如果
shift
执行此操作,为什么不
map
map
不接受数组。修正了。@MartinBroadhurst如果
shift
这样做了,为什么不
print
?为什么不加入?为什么不
反转、拼接、grep
?为什么
map
会特别?公平地说,
print
reverse
会使用
$\ucode>。为什么它意味着
map
不能使用
@
作为默认值<代码> map < /Cord>可以得到一个数组。我想我想说的是,<代码> >代码> /<代码> @ ARGV (数组)是数组函数的合理缺省值,但是当您将其扩展到列表时,您可能需要考虑更多。例如,为什么不将默认参数设为
($)
,换句话说,就是包含
$的单个元素列表?然后,
map
基本上就是转换
$\uu
。我并不是说这将是一个现实的实现决策(特别是因为您可以直接调用
$上的相应操作),但我认为从纯理论的角度来看,它也有同样的吸引力。实际上,如果您仔细想想,您可以说
打印
确实对
($)
进行操作。这是不正确的,但在语义上与它的功能相同
reverse
可能也会这样做,但是如果传递一个参数,那么将标量作为字符串进行反转是一种特殊情况,这样会有点混乱。如果还没有得到答案,我会给出这个答案,尽管我会补充说,每个人都应该忘记“为什么”。对于像Perl这样的大杂烩语言来说,这是一个愚蠢的问题。“为什么”总是“因为拉里那样做了”。小型正交语言希望保留中心思想并保持一致性。Perl不是这些语言之一。@briandfoy我强烈反对。如果你不问我们为什么做这些事情,或者没有做,或者今天不会做,那么你仍然是一个大杂烩语言。仅仅因为Perl不是Lisp并不意味着我们不需要理解我们所做的事情的原因。不管你是否使用单一的idea语言,你仍然需要理性地设计。遗憾的是,我想要它的首要原因是使
perl-E'比如map{pack B8,$\u}@ARGV'
更短,所以我一开始并没有很好的理由。@Chas.Owens