Fra*_*rba 15 perl warnings undefined
如果打开了警告,Perl中通常会打印Use of uninitialized value $foo如果$foo在表达式中被使用和尚未分配的值,但在某些情况下,它的确定,该变量被当作假的,0或者''没有警告.
在没有警告的情况下可以使用未初始化/未定义的变量的情况是什么?
Gre*_*con 18
根据perlsyn文档,
数字
0,字符串'0'和'',空列表(),并且undef都在布尔上下文假的.所有其他值都是真的.
由于未定义的值为false,因此以下程序
#! /usr/bin/perl
use warnings;
my $var;
print "A\n" if $var;
$var && print "B\n";
$var and print "C\n";
print "D\n" if !$var;
print "E\n" if not $var;
$var or print "F\n";
$var || print "G\n";
Run Code Online (Sandbox Code Playgroud)
D通过G没有警告输出.
如果您的代码至少增加或减少一次,则无需将标量显式初始化为零:
#! /usr/bin/perl
use warnings;
my $i;
++$i while "aaba" =~ /a/g;
print $i, "\n";
Run Code Online (Sandbox Code Playgroud)
上面的代码输出3没有警告.
与隐式零相似,如果您至少将其添加到空字符串,则无需将标记初始化为空字符串:
#! /usr/bin/perl
use warnings;
use strict;
my $str;
for (<*>) {
$str .= substr $_, 0, 1;
}
print $str, "\n";
Run Code Online (Sandbox Code Playgroud)
一个例子是"自动化".来自维基百科的文章:
自动生成是Perl编程语言的一个显着特征,涉及动态创建数据结构.自动生成是在取消引用未定义值时自动创建变量引用.换句话说,Perl autovivification允许程序员引用结构化变量和该结构化变量的任意子元素,而不事先明确声明变量的存在及其完整结构.
例如:
#! /usr/bin/perl
use warnings;
my %foo;
++$foo{bar}{baz}{quux};
use Data::Dumper;
$Data::Dumper::Indent = 1;
print Dumper \%foo;
Run Code Online (Sandbox Code Playgroud)
即使我们没有显式初始化中间键,Perl也会处理脚手架:
$VAR1 = {
'bar' => {
'baz' => {
'quux' => '1'
}
}
};
如果没有自动更新,代码将需要更多样板:
my %foo;
$foo{bar} = {};
$foo{bar}{baz} = {};
++$foo{bar}{baz}{quux}; # finally!
Run Code Online (Sandbox Code Playgroud)
不要将autovivification与它可以产生的未定义值混淆.例如用
#! /usr/bin/perl
use warnings;
my %foo;
print $foo{bar}{baz}{quux}, "\n";
use Data::Dumper;
$Data::Dumper::Indent = 1;
print Dumper \%foo;
Run Code Online (Sandbox Code Playgroud)
我们得到
Use of uninitialized value in print at ./prog.pl line 6.
$VAR1 = {
'bar' => {
'baz' => {}
}
};
请注意,中间键是自动生成的.
其他自动化的例子:
对数组的引用
my $a;
push @$a => "foo";
Run Code Online (Sandbox Code Playgroud)参考标量
my $s;
++$$s;
Run Code Online (Sandbox Code Playgroud)参考哈希
my $h;
$h->{foo} = "bar";
Run Code Online (Sandbox Code Playgroud)可悲的是,Perl(尚未!)自动生成以下内容:
my $code;
$code->("Do what I need please!");
Run Code Online (Sandbox Code Playgroud)
在回答类似的问题时,ysth报道
某些操作符故意省略"未初始化"警告以方便您使用,因为它们通常用于左侧或唯一操作数的0或""默认值有意义的情况.
它们是:
++和--(无论是之前或之后), ,+=,-=,.=,|=,^=,.&&=||=
被"定义 - 或者" //=在没有警告的情况下愉快地改变未定义的值.
| 归档时间: |
|
| 查看次数: |
1956 次 |
| 最近记录: |