📜  珀尔 |警告以及如何处理它们

📅  最后修改于: 2022-05-13 01:54:55.036000             🧑  作者: Mango

珀尔 |警告以及如何处理它们

Perl 中的警告是 Perl 编程中最常用的 Pragma,用于捕获“不安全代码”。 pragma 是 Perl 包中的一个特定模块,它可以控制 Perl 的编译时或运行时行为的某些功能,即严格或警告。所以第一行是这样的,

use warnings;

当使用警告编译指示时,编译器将检查错误,对代码发出警告,并禁止某些编程结构和技术。只要出现可能的印刷错误,此编译指示就会发送警告并查找可能的问题。在程序执行期间可能会出现许多可能的问题,但“警告”编译指示主要查找最常见的脚本错误和语法错误。

use strict pragma 的工作方式也与use warnings相同,但唯一的区别是如果发现错误, strict pragma 将中止程序的执行,而warning pragma 只会提供警告,它不会中止执行.

例子:

Perl
#!/usr/bin/perl
use strict;
use warnings;
 
local $SIG{__WARN__} = sub
{
    my $msz = shift;
    log1('warning', $msz);
};
 
my $count1;
count();
print "$count1\n";
 
sub count
{
    $count1 = $count1 + 42;
}
 
sub log1
{
    my ($level, $msg) = @_;
    if (open my $out, '>>', 'log.txt')
    {
        chomp $msg;
        print $out "$level - $msg\n";
    }
}


Perl
#!/usr/bin/perl
use warnings;  
 
# Assigning variable to the file
my $filename = 'Hello.txt'; 
 
# Opening the file using open function
open(my $fh, '>', $filename) or warn "Can't open file";    
print "done\n";


Perl
use warnings;
my @a;
{
    no warnings;
    my $b = @a[0];
}
 
my $c = @a[0];


Perl
#!/usr/bin/perl
package Geeks::Perl_program;
 
use warnings::register;
 
sub import
{
    warnings::warnif( 'deprecated',
        'empty imports from ' . __PACKAGE__ .
        ' are now deprecated' )
    unless @_;
}


输出:

用于存储警告的日志文件:

如何生成警告

Perl 中的警告可以通过使用 Perl 中称为'warn'的预定义函数来创建。
Perl 中的警告函数会为错误生成警告消息,但不会退出脚本。该脚本将继续执行其余代码。因此,当需要仅打印警告消息然后继续执行程序的其余部分时,使用警告函数。

Perl

#!/usr/bin/perl
use warnings;  
 
# Assigning variable to the file
my $filename = 'Hello.txt'; 
 
# Opening the file using open function
open(my $fh, '>', $filename) or warn "Can't open file";    
print "done\n"; 

输出:

启用和禁用警告

可以通过在代码中使用“使用警告”杂注来启用警告。然而,这个 pragma 只能用于更新的 Perl 版本,即 5.6 或更高版本。对于旧版本,-w 用于启用警告。这个 -w 添加在 Hashbang 行中:

#!/usr/local/bin/perl -w

虽然这可以用来启用警告,但是这个'-w'会在整个程序中启用警告,即使在其他人正在编写和维护的外部模块中也是如此。

这个警告编译指示也可以用use Modern::Perl代替。此方法在词法范围内启用警告。

可以通过在范围内使用“无警告”编译指示以及参数列表来选择性地禁用警告。如果未提供参数列表,则此编译指示将禁用该范围内的所有警告。

例子:

Perl

use warnings;
my @a;
{
    no warnings;
    my $b = @a[0];
}
 
my $c = @a[0];

在上面的代码中,标量值的赋值会导致赋值给 $c 而不是 $b 的错误,因为在块中使用了no warnings pragma。

创建自己的警告

Perl 允许创建和注册您自己的警告,以便其他用户可以在词法范围内轻松启用和禁用它们。这可以通过使用预定义的 pragma 'warnings::register'来完成。

package Geeks::Perl_program;

use warnings::register;

上面给出的语法将创建一个以包Geeks::Perl_program命名的新警告类别。现在这个警告类别被创建并且可以使用use warnings 'Geeks::Perl_program'来启用,并且可以通过使用no warnings 'Geeks::Perl_program'来进一步禁用。
要检查调用者的词法范围是否启用了警告类别,可以使用warnings::enabled() 。另一个 pragma warnings::warnif()仅在警告已经生效时才可用于生成警告。

例子:

Perl

#!/usr/bin/perl
package Geeks::Perl_program;
 
use warnings::register;
 
sub import
{
    warnings::warnif( 'deprecated',
        'empty imports from ' . __PACKAGE__ .
        ' are now deprecated' )
    unless @_;
}

上面的示例在已弃用的类别中产生警告。