在Perl中从子例程返回别名
在Perl中是否可以从子例程返回别名 我有一个简单的例子:在Perl中从子例程返回别名,perl,alias,subroutine,lexical-scope,Perl,Alias,Subroutine,Lexical Scope,在Perl中是否可以从子例程返回别名 我有一个简单的例子: #!/usr/bin/perl use warnings; use strict; use feature qw{ say }; { package Test; my $value = 'old'; sub get_value { return \$value; } sub set_value { my ($x) = @_; $value =
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
{
package Test;
my $value = 'old';
sub get_value {
return \$value;
}
sub set_value {
my ($x) = @_;
$value = $x;
}
}
my $test = Test::get_value();
say $$test;
Test::set_value('new');
say $$test;
这基本上就是我想要的功能,但是我想找到一种方法,将$test
和别名设置为$value
,这样我就可以访问数据而无需取消引用。这可能吗
下面是我想要的语法示例: ex(伪代码): 我一直在读关于别名的书,所有的东西都指向“typeglobs”。。。但使用typeglobs似乎需要使用全局变量,我真的希望避免这种情况
此外,我想一个解决方案,不需要安装任何额外的模块从CPAN,因为我需要得到他们的安全批准,并让他们安装它。。。这里任何想使用我的脚本的人也是如此。首先,我要提醒大家。您正在请求有关执行极差练习的信息。应该消除而不是寻求远距离的行动
您可以将两个名称绑定到同一个
SV
。这样绑定的名称称为别名。无法返回绑定名称,因此无法返回别名
返回一个重载字符串化的对象怎么样
$ perl -E'
use String::Defer qw( );
{
my $value = "old";
sub set_value { $value = $_[0] }
sub get_value { String::Defer->new(\$value) }
}
{
my $value = get_value();
say $value;
set_value('new');
say $value;
}
'
old
new
您应该做的是返回一个引用
$ perl -E'
{
my $value = "old";
sub set_value { $value = $_[0] }
sub get_ref { \$value }
}
{
my $value_ref = get_ref();
say $$value_ref;
set_value('new');
say $$value_ref;
}
'
old
new
您需要从CPAN获取已审核的代码,但不需要从SO获取代码?如果我在这里发布的代码也可以在CPAN上找到呢?让我们看看。我知道这似乎是一种非常糟糕的做法(可能是),但在我使用它的情况下,我希望值与外部数据源同步。如果该数据源中的值已更改,我希望使用新值。用户不需要知道该值已更改,因为新值始终有效。事实上,一旦数据发生更改,旧值将变得无效,并可能导致问题。我想让用户在每次使用变量之前不必手动检索新值。在这一点上,这已成为一个更具教育意义的问题,我真的很想知道是否有可能:)这似乎不是一个坏的做法;它是。很多事情都可能出错。
$ perl -E'
{
my $value = "old";
sub set_value { $value = $_[0] }
sub get_ref { \$value }
}
{
my $value_ref = get_ref();
say $$value_ref;
set_value('new');
say $$value_ref;
}
'
old
new