如何创建 perl 别名?类型团?

how to create perl aliases? typeglobs?

假设我正在操作另一个包中的散列,并且我想为该变量创建一个别名?什么是干净的方法来做到这一点?此示例代码显示了我想要执行的操作,但它及其十几种变体出现故障。

#!/usr/bin/perl
#use strict;  # I want it to work with strict.

my $p = Person->new("Joe");
my $name;
*name = \*$p->{"name"};     # Latest broken attempt

printf("'%s' should eq '%s' because they both point to the same place.\n",
       $name, $p->{"name"});

$name = "Sam";

printf("'%s' should eq '%s' because they both point to the same place.\n",
       $name, $p->{"name"});
exit 0;


package Person;

sub new {
    my $class = shift;

    my $this = {};
    bless $this, $class;

    $this->{"name"} = shift;

    return $this;
}

我想要的功能是能够操作 $p->{"name"} 几十次而不必重复输入 $p->{"name"}。真正的数据结构要复杂得多,有很多嵌套的散列。

这可能很简单。 谢谢

最简单的方法是复制:

use strict;
use warnings;
my $p = { name => "Joe" };
my $name = $p->{name};
print "'$name' is '$p->{name}'\n";

如果我不需要分配给 $name,这就是我要使用的。

如果你想能写通$name,最简单的方法就是做成引用:

use strict;
use warnings;
my $p = { name => "Joe" };
my $name = $p->{name};
print "'$$name' is '$p->{name}'\n";
$$name = "Jill";
print "'$$name' is '$p->{name}'\n";

如果你真的想要别名,最简单的方法是滥用 for 循环:

use strict;
use warnings;
my $p = { name => "Joe" };
for my $name ($p->{name}) {
    print "'$name' is '$p->{name}'\n";
    $name = "Jill";
    print "'$name' is '$p->{name}'\n";
}

如果你的perl足够新(5.22+),你也可以通过引用做别名:

use strict;
use warnings;
use feature 'refaliasing';
my $p = { name => "Joe" };
\my $name = $p->{name};
print "'$name' is '$p->{name}'\n";
$name = "Jill";
print "'$name' is '$p->{name}'\n";

最后,您可以通过分配给 typeglob 来为包变量设置别名,但这不是我在这里实际使用的东西:

use strict;
use warnings;
my $p = { name => "Joe" };
*name = $p->{name};  # sets *name{SCALAR} to point to $p->{name}
our $name;            # declares $name so we can use it to refer to $main::name
print "'$name' is '$p->{name}'\n";
$name = "Jill";
print "'$name' is '$p->{name}'\n";