包括perl模块

包括perl模块,perl,Perl,我想知道,我在perl脚本中使用的所有模块都需要在脚本的开头吗 我想知道的原因是我的脚本中有一个位置,它“拆分”了一种方式,即脚本使用授权密钥与SSH连接。另一种方法是脚本使用用户名和密码与SSH连接。我正在使用这些模块来执行SSH。根据cpan文档,如果我想要所有需要的用户名和密码验证 我只想检查是否触发了设置为使用用户名和密码登录的子例程的要求。可能吗?仅在触发某个子例程时加载模块 如果您有时只想加载一个模块,那么您可以使用require和eval检查您是否拥有该模块: $haveit =

我想知道,我在perl脚本中使用的所有模块都需要在脚本的开头吗

我想知道的原因是我的脚本中有一个位置,它“拆分”了一种方式,即脚本使用授权密钥与SSH连接。另一种方法是脚本使用用户名和密码与SSH连接。我正在使用这些模块来执行SSH。根据cpan文档,如果我想要所有需要的用户名和密码验证


我只想检查是否触发了设置为使用用户名和密码登录的子例程的要求。可能吗?仅在触发某个子例程时加载模块

如果您有时只想加载一个模块,那么您可以使用require和eval检查您是否拥有该模块:

$haveit = eval "require Foo::Bar";
if ($haveit) {
   # do something
}
“使用”例程实际上做两件事:

require Foo::Bar;
import Foo::Bar;
问题是“use”在执行开始时执行,而不是在有条件的地方。因此,如果您只想“有时”加载模块,请不要使用“use”,而是在实际需要的地方使用require和import

*经编辑,包括:*

我本应该引用perl来很好地解释这一点

use Module;
相当于:

BEGIN { require Module; Module->import( LIST ); }

无论它在脚本中的什么位置,甚至在另一个if()子句中,“BEGIN”部分都会导致它被加载。

如果您有时只想加载一个模块,那么您可以使用require和eval检查您是否拥有它:

$haveit = eval "require Foo::Bar";
if ($haveit) {
   # do something
}
“使用”例程实际上做两件事:

require Foo::Bar;
import Foo::Bar;
问题是“use”在执行开始时执行,而不是在有条件的地方。因此,如果您只想“有时”加载模块,请不要使用“use”,而是在实际需要的地方使用require和import

*经编辑,包括:*

我本应该引用perl来很好地解释这一点

use Module;
相当于:

BEGIN { require Module; Module->import( LIST ); }

无论它在脚本中的什么位置,甚至在另一个if()子句中,都是“BEGIN”部分导致加载它行对Perl来说意味着:

BEGIN {
    require IO::Pty;
    IO::Pty->import;
}
因此,首先Perl用require加载模块(如果找不到模块,该模块将死亡),然后调用
->import
方法(如果存在)

您可以将其转换为运行时条件,如下所示:

 if (eval {require IO::Pty}) {
     # IO::Pty->import;
     # or use fully qualified names: IO::Pty::some_sub(...);
     # in both cases, the parenthesis after the subroutine are required, since
     # the import is not visible at compile time
 } else {
     # run other code, or throw an error with `die`
 }

包导入到其他包中,而不是导入到其他作用域中,因此导入将在执行它的子例程之外可见。最好跳过所有导入,只使用完全限定的名称。

代码>使用IO::Pty行对Perl来说意味着:

BEGIN {
    require IO::Pty;
    IO::Pty->import;
}
因此,首先Perl用require加载模块(如果找不到模块,该模块将死亡),然后调用
->import
方法(如果存在)

您可以将其转换为运行时条件,如下所示:

 if (eval {require IO::Pty}) {
     # IO::Pty->import;
     # or use fully qualified names: IO::Pty::some_sub(...);
     # in both cases, the parenthesis after the subroutine are required, since
     # the import is not visible at compile time
 } else {
     # run other code, or throw an error with `die`
 }


包导入到其他包中,而不是导入到其他作用域中,因此导入将在执行它的子例程之外可见。最好跳过所有导入,只使用完全限定的名称。

还可以查看

也来看看

你不需要自己加载IO::Pty,Net::OpenSSH会在需要时加载。

你不需要自己加载IO::Pty,Net::OpenSSH会在需要时加载。

啊,我明白了,但是如果我在子例程中导入Foo::Bar它只适用于子例程还是适用于整个脚本?@soligins,ikegami是对的:主脚本的正常当前包是“main”。我明白了,这基本上回答了我的问题。谢谢大家。请记住,运行时
require
之后再导入
与编译时
use
不一样,因为编译器经常会被
导入
弄虚作假,做一些不同的事情,无论是因为看到原型还是某些类型的重载。例如,这在pragmas中尤其常见。啊,我明白了,但是如果我在子例程中导入Foo::Bar
,它是只应用于子例程还是应用于整个脚本?@soligins,它导入到当前包中。ikegami是对的:主脚本的正常当前包将是“main”。我明白了,这基本上回答了我的问题。谢谢大家。请记住,运行时
require
之后再导入
与编译时
use
不一样,因为编译器经常会被
导入
弄虚作假,做一些不同的事情,无论是因为看到原型还是某些类型的重载。例如,这在pragmas中尤其常见。除非您在
BEGIN
时间导入,否则编译器将不会有正确的原型,事实上,也不会允许您将这些函数用作listops。运行时导入的用处要小得多。@tchrist-什么是listop?谷歌在这方面似乎毫无帮助。我猜你指的是一个允许排序/映射式语法的函数?Thanks@DVK:不,我只是说不需要帕伦斯(反正我总是用帕伦斯)。@tchrist-Ah。我正在考虑问一个问题:省略括号是否有任何意义/好处除非您在
开始时导入,否则编译器将没有正确的原型,事实上也不会让您不使用这些函数作为listops。运行时导入的用处要小得多。@tchrist-什么是listop?谷歌在这方面似乎毫无帮助。我猜你指的是一个允许排序/映射式语法的函数?Thanks@DVK:不,我只是说不需要帕伦斯(反正我总是用帕伦斯)。@tchrist-Ah。我正在考虑问一个问题,关于省略括号是否有任何意义/好处