如何自动初始化Perl中的所有标量变量?

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)

毫无疑问的是值$counterundef不是一些随机的垃圾.

因此,建议背后的动机,即确保所有变量都以已知值开始,在Perl中自动满足,并且没有必要做任何事情.

你用计数器做的是增加或减少它们.的结果:

my $counter;
# ...
++ $counter;
Run Code Online (Sandbox Code Playgroud)

在Perl中有明确的定义.$counter将保持价值1.

最后,我认为,在大多数情况下,Perl中不需要计数器,并且可能需要重写广泛使用计数器变量的代码.

  • 通过优雅的解释来取消隐藏+1 (2认同)
  • 什么时候*改写*变成*重构*,无论如何?☺ (2认同)

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)


Eth*_*her 5

不这样做可能会导致一些非常可怕且难以破译的错误,因此无论如何改变这样的行为并不是一个好主意.

在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