-1

是否可以从 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这样我就可以在不取消引用的情况下访问数据。这可能吗?


这是我想要的语法示例:

前(伪代码):

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

{
    package Test;
    my $value = 'old';

    sub get_value {
        # return alias to $value
    }

    sub set_value {
        my ($x) = @_;
        $value = $x;
    }
}

# Gets an alias, NOT a reference
my $test = Test::get_value();

# Print old
say $test;

Test::set_value('new');

# Print new
say $test;

我一直在阅读有关别名的内容,并且所有内容都指向“typeglobs”……但看起来使用 typeglobs 需要使用全局变量,我真的很想避免这种情况。


此外,我想要一个不需要从 CPAN 安装任何其他模块的解决方案,因为我需要让它们得到安全部门的批准并让他们安装它......这里任何想要使用我的脚本的人也一样。

4

1 回答 1

2

首先是警告。您正在请求有关执行极差练习的信息。远距离的行动应该被消除,而不是寻求。


您可以将两个名称绑定到同一个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
于 2015-08-06T18:08:20.830 回答