gpt4 book ai didi

perl - 无法在运行时加载 `Cwd`(以及其他非核心模块)

转载 作者:行者123 更新时间:2023-12-02 01:34:34 26 4
gpt4 key购买 nike

假设我想在运行时加载一个模块。我预计这会起作用

use warnings;
use strict;

eval {
require Cwd;
Cwd->import;
};
if ($@) { die "Can't load Cwd: $@" }

say "Dir: ", getcwd;

但事实并非如此,根据不允许裸字“getcwd”...

Cwd默认导出getcwd。我尝试为 import 提供函数名称,并尝试使用它的其他函数。它适用于全名,例如 Cwd::getcwd,因此我认为它不会导入。

例如,这与我尝试过的其他一些核心模块的尝试相同

use warnings;
use strict;

eval {
require List::Util;
List::Util->import('max');
};
if ($@) { die "Can't load List::Util: $@" }

my $max = max (1, 14, 3, 26, 2);
print "Max is $max\n";

添加注释 显然,带括号的函数调用为编译器提供了线索。但是,我认为问题仍然存在,请参阅最后的编辑。此外,上面模块中的 first BLOCK LIST 等功能不起作用。

<小时/>

但是,它对于我尝试过的一些(完善的)非核心模块不起作用。更糟糕、更令人困惑的是,即使使用完全限定的名称,它也不起作用。

我可以想象,如果在运行时使用 require ,则所使用的符号(函数)在编译时是未知的,但它适用于(其他)核心模块。我认为这是运行时加载的标准方法。

如果我在动态加载时需要使用全名那就没问题,但是不一致是怎么回事?我如何在运行时加载(和使用)非核心模块?

我也尝试过使用 Module::Load::Conditional 但它不起作用。

我缺少什么,如何在运行时加载模块? (尝试过 5.165.10.1。)

<小时/>

编辑

正如 Matt Jacob 所指出的,带括号的调用有效,getcwd()。然而,给定perlsub

NAME LIST; # Parentheses optional if predeclared/imported.

这意味着导入不起作用,并且原因问题仍然存在。

此外,必须根据模块的加载方式使用不同的语法也不好。另外,我无法让非核心模块以这种方式工作,特别是那些具有类似 List::MoreUtils 语法的模块有。

最佳答案

首先,这与核心模块与非核心模块无关。当解析器必须猜测特定标记是否是函数调用时,就会发生这种情况。

<小时/>
eval {
require Cwd;
Cwd->import;
};
if ($@) { die "Can't load Cwd: $@" }

say "Dir: ", getcwd;

编译时,main:: 符号表中没有getcwd。如果没有任何提示表明它是一个函数(getcwd()&getcwd),解析器就无法知道,并且 strict 会提示。

<小时/>
eval { 
require List::Util;
List::Util->import('max');
};
if ($@) { die "Can't load List::Util: $@" }

my $max = max (1, 14, 3, 26, 2);

编译时,main::符号表中没有max。但是,由于您使用括号调用 max,解析器可以猜测这是一个稍后定义的函数,因此 strict 不会提示。

在这两种情况下,strict 检查都会在调用 import 之前进行。

<小时/>

List::MoreUtils 很特别,因为这些函数使用原型(prototype)。如果函数定义在编译时不可见,则原型(prototype)将被忽略。因此,您不仅必须向解析器提示您正在调用函数,还必须以不同的方式调用它,因为原型(prototype)将被忽略:

use strict;
use warnings 'all';
use 5.010;

eval {
require List::MoreUtils;
List::MoreUtils->import('any')
};
die "Can't load List::MoreUtils: $@" if $@;

say 'found' if any( sub { $_ > 5 }, 1..9 );

关于perl - 无法在运行时加载 `Cwd`(以及其他非核心模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41094774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com