Laz*_*zer 7 variables perl initialization
Perl的自动初始化变量到undef默认.
有没有办法覆盖这个默认行为并告诉Perl解释器将变量初始化为zero(或其他一些固定值)?
Sin*_*nür 13
代码完成中的建议对于诸如C之类的语言非常重要,因为当您拥有时
int f(void) {
int counter;
}
Run Code Online (Sandbox Code Playgroud)
价值counter就是无论发生什么事占用内存.
在Perl中,当您使用声明变量时
my $counter;
Run Code Online (Sandbox Code Playgroud)
毫无疑问的是值$counter是undef不是一些随机的垃圾.
因此,建议背后的动机,即确保所有变量都以已知值开始,在Perl中自动满足,并且没有必要做任何事情.
你用计数器做的是增加或减少它们.的结果:
my $counter;
# ...
++ $counter;
Run Code Online (Sandbox Code Playgroud)
在Perl中有明确的定义.$counter将保持价值1.
最后,我认为,在大多数情况下,Perl中不需要计数器,并且可能需要重写广泛使用计数器变量的代码.
Eri*_*rom 11
据我所知,这是不可能的(而且不应该,它甚至更危险$[).
您可以按如下方式初始化变量以减少样板:
my ($x, $y, $z) = (0) x 3;
Run Code Online (Sandbox Code Playgroud)
或者将初始化移动到一个函数:
sub zero {$_ = 0 for @_}
zero my ($x, $y, $z);
Run Code Online (Sandbox Code Playgroud)
甚至:
$_ = 0 for my ($x, $y, $z);
Run Code Online (Sandbox Code Playgroud)
不这样做可能会导致一些非常可怕且难以破译的错误,因此无论如何改变这样的行为并不是一个好主意.
在Perl中,您可以在第一次需要时正确声明变量,因此通常不需要首先声明它们(有或没有初始化),然后再使用它们.此外,运算符++将使用未定义的值同样为零,因此您根本不需要初始化计数器:
# this is perfectly legal:
my $counter;
while ($some_loop)
{
$counter++;
}
Run Code Online (Sandbox Code Playgroud)
但是,我可以通过提及您可以在Moose类中实现属性的自动初始化来为Moose插入一个插件:
package MyClass;
use strict;
use warnings;
use Moose;
has some_string => (
is => 'rw', isa => 'Str',
default => 'initial value',
);
has some_number => (
is => 'rw', isa => 'Int',
default => 0,
);
__PACKAGE__->meta->make_immutable;
1;
package main;
my $object = MyClass->new;
print "string has value: ", $object->some_string, "\n";
print "number has value: ", $object->some_number, "\n";
Run Code Online (Sandbox Code Playgroud)
打印:
string具有值:初始值
编号具有值:0
| 归档时间: |
|
| 查看次数: |
9957 次 |
| 最近记录: |