iPh*_*ian 6 perl hash subroutine subroutine-prototypes
在Perl中,我总是喜欢参数传递的键值对样式,
fruit( apples => red );
我做了很多:
sub fruit {
my %args = @_;
$args{apples}
}
Run Code Online (Sandbox Code Playgroud)
纯粹为了紧凑而且有多种方法可以做到这一点,有没有办法:
访问键值对而不分配@_哈希?即一个声明?
让子程序的参数自动成为哈希引用,也许通过子程序原型?
分配给临时变量 my %args = @_;
让呼叫者通过引用传递,即fruit({ apples => red }); 纯粹为了美学
${%{\@_}}{apples}
尝试引用@_,将其解释为哈希引用,并通过键访问值.
但我得到一个错误,它不是哈希引用.(它不是^.^)我正在考虑C,你可以在其中投射指针,并避免明确的重新分配.
我也试过子程序原型
sub fruit (%) { ... }
......但是这些论点@_像往常一样崩溃了.
如果没有哈希,则无法执行哈希查找(${...}{...}).但是你可以创建一个匿名哈希.
my $apples = ${ { @_ } }{apples};
my $oranges = ${ { @_ } }{oranges};
Run Code Online (Sandbox Code Playgroud)
您还可以使用更简单的取消引用语法
my $apples = { @_ }->{apples};
my $oranges = { @_ }->{oranges};
Run Code Online (Sandbox Code Playgroud)
那将是非常低效的.您将为每个参数创建一个新哈希.这就是通常使用命名哈希的原因.
my %args = @_;
my $apples = $args{apples};
my $oranges = $args{oranges};
Run Code Online (Sandbox Code Playgroud)
然而,另一种方法是使用散列片.
my ($apples, $oranges) = @{ { @_ } }{qw( apples oranges )};
Run Code Online (Sandbox Code Playgroud)
以下是de-derefence版本,但它仅在5.24+ [1]中提供:
my ($apples, $oranges) = { @_ }->@{qw( apples oranges )};
Run Code Online (Sandbox Code Playgroud)
如果您使用以下内容,它在5.20+中可用:
use feature qw( postderef );
no warnings qw( experimental::postderef );
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |