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