Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中从子例程返回别名_Perl_Alias_Subroutine_Lexical Scope - Fatal编程技术网

在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 =

在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 = $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