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 autodie有缺点吗?_Perl_Autodie - Fatal编程技术网

Perl autodie有缺点吗?

Perl autodie有缺点吗?,perl,autodie,Perl,Autodie,我时不时地看到StackOverflow上有人提倡使用。但是在这里的代码和网络上的其他地方,我很少看到autodie。有一些缺点吗?使用autodie时是否会丢失一些东西?(我想在使用autodie时会被宠坏)列出了一些您应该注意的问题和bug。然而,其中大多数都相对较小,从长远来看也是可以解决的 除此之外,除了在旧perl版本上运行时可能存在额外的依赖性之外,没有什么真正的缺点。它还没有被经常使用,这很可能是因为它相对较新。尽管如此,autodie(甚至是旧的Fatal模块)通常都是一个好主意

我时不时地看到StackOverflow上有人提倡使用。但是在这里的代码和网络上的其他地方,我很少看到autodie。有一些缺点吗?使用autodie时是否会丢失一些东西?(我想在使用autodie时会被宠坏)

列出了一些您应该注意的问题和bug。然而,其中大多数都相对较小,从长远来看也是可以解决的


除此之外,除了在旧perl版本上运行时可能存在额外的依赖性之外,没有什么真正的缺点。它还没有被经常使用,这很可能是因为它相对较新。尽管如此,
autodie
(甚至是旧的
Fatal
模块)通常都是一个好主意。

这项技术基本上是好的,但它的作用是遥远而神奇的。一些只阅读代码部分的人可能不理解发生了什么,因为他们所检查的代码离他们很远。由于不是每个人都使用它,而且它只是最近才成为一种实践,我怀疑大多数人都不期望它。这其实没什么大不了的,但这种事情对我来说总是很难看。

另一个考虑因素是,autodie和utf8::在一场比赛之前都没有很好地配合。utf8::all是另一个方便的模块,与autodie一样,它有助于设置Perl以自动执行常见任务(这次是unicode)。

有一个语言模型,它遵循C基于函数的范例,其中所有函数都返回一个值,由用户检查返回值。Perl在这个组中。如果我调用一个函数,我有责任检查该函数是否实际返回了有用的内容

还有一种语言模型遵循Java基于异常的范例,其中失败的函数返回异常,如果用户需要处理异常,则必须显式处理异常。自Java以来编写的大多数现代语言都遵循这种基于异常的方法

较新的语言是基于异常的,因为它处理懒惰的开发人员问题。在C风格的编程语言中,如果开发人员忘记或懒得检查函数的退出状态,程序将继续。在Java风格的编程语言中,程序死亡。在这两种情况下,开发人员都可以处理无效函数结果的问题,基于异常的语言迫使开发人员这样做

您为什么不在这里看到
使用autodie
?有几种理论:

这是新的
autodie
pragma是相当新的,大多数开发人员没有一个好的方法将新知识融入到他们的Perl编程中。例如,
say
从5.10开始就存在了,但是我仍然看到很少有开发人员使用它,尽管它比
print
有很大的改进,而且使用起来很简单。如果开发人员在最初学习Perl时没有学习autodie,他们可能永远也不会知道它

Perl中没有Try/Catch语法 以下是Perl的一般工作方式:

open $fh, "<", $file;
if ( not defined $fh ) {
   ...    # What I do if `$fh` didn't get set.
}
你能说恶心吗?我就知道你可以!因为
$fh
是词汇范围,所以我必须在
eval
之前声明它。另外,我甚至没有涉及到
$@
作为全局范围变量的整个问题

这太不完整了 大多数模块和内置函数不适用于
autodie
,后者或多或少地限于IO调用、
fork
system
exec
,即使在这里,它也是不完整的:
print
flock
不适用于
autodie
。除此之外,没有其他Perl内置函数可用于
autodie
。从空数组中弹出值不会迫使我的程序发出嘎嘎声。少数模块会检查
autodie
的状态,以查看其功能或方法是否应
croak
而不是返回假值。因此,将Perl转变为基于异常的语言的整个想法没有实现

即使是你认为
autodie
可以工作的地方也不行。如果使用
File::Copy
获取
Copy
move
命令,请不要依赖
autodie
捕获错误的文件副本。您仍然需要检查
copy
的返回值。如果使用
File::IO
,则使用
autodie
的所有赌注都将关闭

因此,
autodie
并没有实现它将Perl转变为一种更基于异常的编程语言的大胆承诺。对于大多数人来说,它主要捕获
open
语句,大多数开发人员对
open没有问题。。。或者死…


我喜欢基于异常的开发方法,并且我相信默认情况下所有模块都会出错。强制开发人员处理异常,而不是忽略它们。我编写模块和函数以在出现问题时发出咯咯声,并使用
eval
处理异常。不幸的是,
autodie
现在还不能完成很多工作。

我将文档解释为,在调用
use autodie之前,必须声明要与
autodie
一起使用的任何用户定义的子例程
似乎建议您必须在
使用任何模块之前声明(这是否意味着原型?)您想要使用的任何SUB,因为该模块可能在内部
使用autodie--有什么想法吗?还想知道与AUTOLOAD的交互。这意味着,如果您想使用
autodie
使其中一个非内置项致命,则必须先对其进行完全定义或预先声明。这与原型无关。它的用例通常是您无法控制的模块,但它有一种奇怪的语义,即通过返回魔法值来指示失败。所以你要做的就是在autodie之前加载它们。很简单。对于您自己的函数,您总是可以使用适当的异常使其失败,或者可能编写
use autodie;
my $fh;     # Got to be declared outside of the eval
eval {
    open $fh, "<", $file;
};        # Don't forget that semicolon!
if ( $@ ) {
   ...    # What I do if function "foo" doesn't return a good value...
}