从 Perl 中的子例程返回别名
Returning an alias from a subroutine in Perl
是否可以return 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;
我一直在阅读有关别名的内容,所有内容都指向 "typeglobs"...但看起来使用 typeglobs 需要使用全局变量,我真的很想避免这种情况。
另外我想要一个不需要从 CPAN 安装任何额外模块的解决方案,因为我需要让它们获得安全批准并让他们安装它......这里的其他人也一样谁想用我的脚本。
首先提醒一句。您正在请求有关执行极差实践的信息。远距离的行动应该被消除,而不是被寻求。
您可以将两个名称绑定到同一个 SV
。这样绑定的名称称为别名。您不能 return 绑定名称,因此您不能 return 别名。
return重载字符串化的对象怎么样?
$ 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
您应该做的是return参考。
$ 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
是否可以return 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;
我一直在阅读有关别名的内容,所有内容都指向 "typeglobs"...但看起来使用 typeglobs 需要使用全局变量,我真的很想避免这种情况。
另外我想要一个不需要从 CPAN 安装任何额外模块的解决方案,因为我需要让它们获得安全批准并让他们安装它......这里的其他人也一样谁想用我的脚本。
首先提醒一句。您正在请求有关执行极差实践的信息。远距离的行动应该被消除,而不是被寻求。
您可以将两个名称绑定到同一个 SV
。这样绑定的名称称为别名。您不能 return 绑定名称,因此您不能 return 别名。
return重载字符串化的对象怎么样?
$ 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
您应该做的是return参考。
$ 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