if 也可能指函数:if

内容

名称

if - 在条件成立时use Perl 模块

语法

use if CONDITION, "MODULE", ARGUMENTS;
no  if CONDITION, "MODULE", ARGUMENTS;

描述

use if

if 模块用于有条件地加载另一个模块。结构

use if CONDITION, "MODULE", ARGUMENTS;

... 仅在 CONDITION 求值为 true 时加载 MODULE;如果 CONDITION 求值为 false,则不产生任何效果。(如果 'use strict "subs";' 生效,则模块名称(假设它至少包含一个 ::)必须加引号。)如果 CONDITION 确实求值为 true,则上述行与以下内容具有相同的效果

use MODULE ARGUMENTS;

例如,Unicode::UCD 模块的 charinfo 函数仅在满足特定条件时才使用 Unicode::Normalize 的两个函数

use if defined &DynaLoader::boot_DynaLoader,
    "Unicode::Normalize" => qw(getCombinClass NFD);

假设您希望 ARGUMENTS 为空列表,,产生以下效果

use MODULE ();

您无法使用 if pragma 来实现此目的;但是,您可以在编译时使用以下方法实现此效果

BEGIN { require MODULE if CONDITION }

no if

no if 结构主要用于在特定版本的 perl 下这些类别会产生多余的输出时停用警告类别。

例如,redundant 类别警告在 Perl-5.22 中引入。此警告标记 printfsprintf 中某些多余参数的实例。但是,如果你的代码在早期版本的 perl 中运行时没有警告,并且不在乎较新版本中的 redundant 警告,则可以调用

use warnings;
no if $] >= 5.022, q|warnings|, qw(redundant);

my $test    = { fmt  => "%s", args => [ qw( x y ) ] };
my $result  = sprintf $test->{fmt}, @{$test->{args}};

no if 构造假定模块或 pragma 已正确实现 unimport() 方法——但大多数模块和 pragma 并未实现。这解释了为什么 no if 构造的适用性有限。

BUG

当前实现不允许指定模块的所需版本。

另请参阅

Module::Requires 可用于有条件地加载一个或多个模块,其约束基于模块的版本。但与 if 不同,Module::Requires 不是核心模块。

Module::Load::Conditional 提供了许多函数,你可以使用这些函数来查询可用的模块,然后在运行时加载一个或多个模块。

CPAN 中的 provide 模块可用于根据正在运行的 Perl 版本选择多个可能的模块之一进行加载。

作者

Ilya Zakharevich mailto:[email protected]

版权和许可

此软件的版权归 Ilya Zakharevich 所有 (c) 2002。

这是免费软件;你可以根据与 Perl 5 编程语言系统本身相同的条款重新分发或修改它。