Eri*_*ett 1 perl alias perl-module
假设我正在操作另一个包中的哈希,我想为该变量创建一个别名?干净的方法是什么?这个示例代码显示了我想要做的事情,但是它和它的十几种变化都出现了故障.
#!/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;
}
Run Code Online (Sandbox Code Playgroud)
我想要的功能是能够操作$p->{"name"}数十次而无需$p->{"name"}重复输入.对于大量嵌套哈希,真正的数据结构要复杂得多.
这可能很简单.谢谢.
最简单的方法是制作副本:
use strict;
use warnings;
my $p = { name => "Joe" };
my $name = $p->{name};
print "'$name' is '$p->{name}'\n";
Run Code Online (Sandbox Code Playgroud)
如果我不需要分配,这就是我要使用的$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";
Run Code Online (Sandbox Code Playgroud)
如果你真的想要一个别名,最简单的方法就是滥用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";
}
Run Code Online (Sandbox Code Playgroud)
如果你的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";
Run Code Online (Sandbox Code Playgroud)
最后,您可以通过分配给typeglobs来对包变量进行别名处理,但这不是我在这里实际使用的内容:
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";
Run Code Online (Sandbox Code Playgroud)