珀尔 |警告以及如何处理它们
Perl 中的警告是 Perl 编程中最常用的 Pragma,用于捕获“不安全代码”。 pragma 是 Perl 包中的一个特定模块,它可以控制 Perl 的编译时或运行时行为的某些功能,即严格或警告。所以第一行是这样的,
use warnings;
当使用警告编译指示时,编译器将检查错误,对代码发出警告,并禁止某些编程结构和技术。只要出现可能的印刷错误,此编译指示就会发送警告并查找可能的问题。在程序执行期间可能会出现许多可能的问题,但“警告”编译指示主要查找最常见的脚本错误和语法错误。
Note: This ‘use warnings‘ pragma was introduced in Perl 5.6 and later versions, for older versions, warnings can be turned on by using ‘-w’ in the shebang/hashbang line:
#!/usr/local/bin/perl -w
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 @_;
}
上面的示例在已弃用的类别中产生警告。