-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これは可能ですか?


これが私が望む構文の例です:

ex (疑似コード):

#!/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;

エイリアスについて読んでいて、すべてが「型グロブ」を指し続けています...しかし、型グロブを使用するにはグローバル変数を使用する必要があるようで、それを避けたいと思います。


また、CPAN から追加のモジュールをインストールする必要のないソリューションが必要です。セキュリティによって承認されてインストールされる必要があるためです...そして、私のスクリプトを使用したい他の人も同様です。

4

1 に答える 1

2

最初に警告の言葉。あなたは非常にまずい行為を行っていることについての情報を求めています。離れた場所での行動は、求められるのではなく、排除されるべきです。


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 に答える