更新Perl全局变量的正确方法

Izz*_*zza 2 perl scope global-variables

我在main_1中的file_1.pl中有以下全局变量:

package main;

my $var = -1;
Run Code Online (Sandbox Code Playgroud)

如果我需要从另一个perl文件更新这个变量,那么这样做的方法是什么?我试过了:

$main::var = 1
Run Code Online (Sandbox Code Playgroud)

但它没有用.

这样做的正确方法是什么?

谢谢!

bri*_*foy 8

my是一个词汇变量.它的范围是它的块,或者,如果不是块,则是文件.他们不能在他们的范围之外看到他们.

您可以创建一个全局变量,如其他答案所示:

our $var;
Run Code Online (Sandbox Code Playgroud)

但是,更好的方法是为代码的其他部分提供更新词法版本的接口:

my $private;

sub set_private { $private = shift }
Run Code Online (Sandbox Code Playgroud)

但是,如果您要这样做,您可能还有一个用于获取值的界面.现在该变量只需要与使用它的子例程在同一范围内,因此您可以将其与文件的其余部分隐藏:

{
my $private;
sub set_private { $private = shift }

sub get_private { $private }
}
Run Code Online (Sandbox Code Playgroud)

现在距离一个对象只有一步(在这种情况下,是一个单例):

use v5.12;

package Foo {
    my $private;
    sub new { bless \$private, shift }
    sub set { my $self = shift; $$self = shift; }

    sub get { my $self = shift; $$self; }
    }
Run Code Online (Sandbox Code Playgroud)