【问题标题】:Why should use warnings; go last?为什么要使用警告;最后走?
【发布时间】:2016-12-02 23:35:37
【问题描述】:

我隐约记得warnings pragma 应该在我们加载use 的模块列表中排在最后。我也隐约记得这与模块注册自己的警告类别有关,但我无法重现任何问题。有人可以指出相关文章或展示warnings pragma 的位置产生影响的示例吗?

【问题讨论】:

    标签: perl warnings


    【解决方案1】:

    这可能就是您所指的。无论哪种方式,都需要注意,我将其作为错误提交。 编辑 bug 在 v5.27.6 中已修复。

    我的/Warnings.pm

    package My::Warnings;
    
    use warnings::register;
    
    sub test {
        warnings::warnif 'This is my warning';
    }
    
    1;
    

    main.pl

    use strict;
    use feature 'switch';
    
    use warnings 'all';
    
    use My::Warnings;
    
    print undef;
    
    given (1) { }
    
    My::Warnings::test();
    

    正如预期的那样,这将输出

    given is experimental at E:\Perl\source\main.pl line 10.
    Use of uninitialized value in print at E:\Perl\source\main.pl line 8.
    This is my warning at E:\Perl\source\main.pl line 12.
    

    但是,如果 any 警告类别被禁用,它也会禁用自定义类别。像这样

    use strict;
    use feature 'switch';
    
    use warnings 'all';
    no warnings 'experimental';
    
    use My::Warnings;
    
    print undef;
    
    given (1) { }
    
    My::Warnings::test();
    

    这只是输出

    Use of uninitialized value in print at E:\Perl\source\main.pl line 9.
    

    似乎有必要在use My::Warningsuse My::Warnings 之后启用警告 以让它们执行

    use strict;
    use feature 'switch';
    
    use My::Warnings;
    
    use warnings 'all';
    no warnings 'experimental';
    
    print undef;
    
    given (1) { }
    
    My::Warnings::test();
    

    生产

    Use of uninitialized value in print at E:\Perl\source\main.pl line 9.
    This is my warning at E:\Perl\source\main.pl line 13.
    



    更新

    更重要的是,重新启用关闭自定义警告的类别会使它们被禁用

    类似的东西

    use strict;
    use feature 'switch';
    
    use warnings 'all';
    no warnings 'experimental';
    use warnings 'experimental';
    
    use My::Warnings;
    
    print undef;
    
    given (1) { }
    
    My::Warnings::test();
    

    只打印

    given is experimental at E:\Perl\source\main.pl line 12.
    Use of uninitialized value in print at E:\Perl\source\main.pl line 10.
    

    【讨论】:

    • Here's my bug report。我还没有回应。 Chrysostomos 神父“前段时间我怀疑我们遇到了这样的问题”。他对底层代码的描述很有启发性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2019-09-04
    • 2013-02-27
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多