【问题标题】:require File::Find: how to use File::Find::name without getting a warning?需要 File::Find: 如何使用 File::Find::name 而不会收到警告?
【发布时间】:2013-01-02 23:25:22
【问题描述】:

当我像这样用require 加载File::Find 时,如何修改此脚本以不收到警告?

#!/usr/bin/env perl
use warnings;
use strict;
use 5.10.1;

require File::Find;
File::Find->import('find');

find( {
    wanted     => sub {
        my $file = $File::Find::name;       
        #say $file; 
    },
    no_chdir   => 1,
},
shift );

输出:

#Name "File::Find::name" used only once: possible typo at ./perl9.pl line 11.

【问题讨论】:

    标签: perl file find warnings require


    【解决方案1】:

    对于初学者,不要这样加载文件。 :)

    如果你这样做,只需添加:

    $File::Find::name if 0;
    

    干净的做法是将$File::Find::name更改为

    do { no warnings 'once'; $File::Find::name }
    

    【讨论】:

    • 这看起来不太漂亮。
    • 那么在加载之前不要使用模块。
    【解决方案2】:

    只需将require 替换为use。这样就解决了。

    通常,唯一 使用require 的原因是如果您有特定原因在运行时执行延迟模块加载。通常,你不会。

    如果您不想从模块中导入任何符号,请将一个空列表传递给use,如下所示:

    use File::Find ();
    

    use File::Find qw();
    

    编辑:如果您确实有正当理由推迟模块加载,并且发现 ikegami 的解决方法太丑陋,您可以通过以下方式在本地禁用警告:

    no warnings 'once';
    

    在生成警告的语句之前。这将为最里面的封闭代码块的其余部分禁用该特定警告。要了解哪些警告消息属于哪些类,请参阅perldiag

    【讨论】:

    • 我只想在条件为真时加载模块。
    • 好吧,很公平,这是require 的合法用途。一开始您可能想在问题中提及这一点。无论如何,请参阅上面对我的答案的编辑。
    • 那么在相同条件下只加载使用模块的代码。
    • 禁用一种类型的所有警告以使一种警告静音是丑陋的,因为它会削弱范围内的所有代码。还是您建议do { no warnings 'once'; $File::Find::name }?将后者添加到我的答案中。
    • @ikegami: 可以,但如果他的wanted sub 真的只有他的例子中的几行,我会在它的开头添加no warnings 'once'; 并仔细检查我没有不小心在这些行上拼错任何变量名。 (无论如何,如果您使用strict 'vars',“仅使用一次”警告并不是那么有用,幸运的是,OP 是这样。)但是您当然是正确地禁用任何警告,即使是那些边际效用的警告,长期代码部分是一个坏习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多