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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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 包装是否应为';使用';d全局还是从需要它们的函数?_Perl - Fatal编程技术网

Perl 包装是否应为';使用';d全局还是从需要它们的函数?

Perl 包装是否应为';使用';d全局还是从需要它们的函数?,perl,Perl,如果此问题不适合StackOverflow,请道歉。我怀疑答案在很大程度上取决于观点(除非其中一个风格指南有建议) 我有这样的代码 use File::Temp; sub foo { ... } sub bar { ... } sub baz { my $fh = tempfile(); ... } baz是唯一使用File::Temp的子例程,我没有使用AutoLoader。将use声明放在baz中是合理的,还是应该将其放在脚本的顶部?use本质上与将req

如果此问题不适合StackOverflow,请道歉。我怀疑答案在很大程度上取决于观点(除非其中一个风格指南有建议)

我有这样的代码

use File::Temp;

sub foo {
    ...
}
sub bar {
    ...
}
sub baz {
    my $fh = tempfile();
    ...
}

baz
是唯一使用
File::Temp
的子例程,我没有使用AutoLoader。将
use
声明放在
baz
中是合理的,还是应该将其放在脚本的顶部?

use
本质上与将
require
语句放在
BEGIN
块中是一样的,因此放在哪里并不重要;它们在代码的其他部分之前被评估。

因为(正如切普纳所说),技术上没有区别,这实际上是风格的问题

将“然后全部放在上面”的优点:

  • 乍一看清楚所有直接模块依赖项是什么

  • 更易于维护-如果需要使用库移动代码,则无需记住移动库

    请注意,同样的确切逻辑也适用于变量声明,但在这种情况下,作用域关注点严重超过了“记住移动声明”关注点,因此您应该在尽可能靠近使用位置的最内层范围内声明变量

  • 对于您自己的代码在依赖于正在加载的所有库的
    BEGIN{}
    块中包含复杂逻辑的深奥情况(例如,从所有加载的库中调用一个特定命名的方法-我已经这样做了)-如果某个库的
    use
    调用在
    BEGIN{}
    块之后,您将有一个bug

把它们都放在上面的缺点是:

  • 有人可能会说,这会降低代码的可读性,因为您需要查找文件的开头,以查看从模块导入的内容。坦率地说,我不相信这一点,但我已经听说过了,它至少有一些优点

且con仅适用于自动导出名称的软件包。否则,
使用foo;foo::bar()
是必需的(并且始终是合法的,即使
foo
自动导出
bar
)。@chepner-我要的是那些您已经导出了OK并且您手动导入标识符的函数,大多数情况下,为了对抗这些缺点,您可以使用函数的完全限定名(
文件::Temp::tempfile()
)而不是本地导入的别名。这使得外部引用显式,而导入保持在顶部。感谢您的第二个意见,@DVK。这与我的第一个观点没有实质性的不同。