2017-02-11 74 views
0

如何在子例程调用表达式中使用\字符,如my_subroutine(%my_hash),如何通过引用子例程来传递散列?通过使用“”引用子例程的散列来传递散列:my_subroutine(%my_hash)


更多解释(如果先前的单行的问题是不足够的描述)

传递变量参照的子程序,而不在子程序调用表达式使用\字符

sub my_subroutine { 
    my $var_ref = \shift; 
    ... 
} 

我曾尝试相同的:等my_subroutine($my_var)可以通过定义子程序作为这样来实现与哈希方法,但它不能正常工作:

sub my_subroutine { 
    my $hash_ref = \shift; 
    ... 
} 

我认为这是因为Perl片段任何哈希键 - 值对传入列表(一维数组),这是@_,也同样是用传入的数组完成(但值仅用于键)。

我正在寻找在解决类似的问题,使通过参考my_subroutine(%my_hash)通散而不需要通过我每次调用子程序时反斜杠字符\先于我的子程序参数(哈希值)。这将有助于使我的主代码看起来更整洁,并使子程序内部看起来不整齐。另外,如果我与一大群开发人员合作,有人可能会忘记添加引用字符。我需要在子例程中设置它(散列总是通过引用my_subroutine传递),而不是由其他调用my_subroutine的开发人员设置。

+0

Re“*我认为这是因为... *”,唯一可以传递给subs(以及从subs返回的)是一些标量。您在执行'my_subroutine(%my_hash)'时传递的标量包含密钥的副本和散列的(实际非复制)值。 (原型可以影响通过哪个标量。) – ikegami

+0

Re * *通过引用传递变量而不使用'\'字符... *“,变量总是[传递* *引用](http://在Perl中(这就是为什么'我的$ var_ref = \ shift;'可以得到一个引用的原因(stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by-value)到它)。在调用方使用'\'传递* a *引用(当然,这是通过引用传递的)。 – ikegami

+2

*“这将有助于使我的主代码更整洁”*这也会误导实际发生的事情。如果那是你唯一的目标,那么就忘记它。 – Borodin

回答

5

Prototypes may still considered bad,但此处您可以用它们来实现自己的目标。

sub my_subroutine (\%) { 
    my $hashref = shift; 
    ... 
} 

my_subroutine(%hash); 

通过原型,子例程的第一个参数被强制为散列引用。

请注意,在子例程中,散列是作为散列引用接收的。您还需要使用命名的哈希来调用子例程。

my_subroutine({ "anonymous" => "hash", "not" => "OK" }); # not OK with proto 
+2

优秀的汤姆克里斯琴森(Tom Christiansen)看看[* Prototypes Considered Harmful *](http://www.perlmonks.org/?node_id=861966)。我认为向大概是初学者的OP暗示,使用原型子程序是可以的,这样他们就不必在反向参数中加反斜杠。 – Borodin

0

怎么是这样的:

#!/usr/bin/perl 
use warnings; 
use strict; 
use Data::Printer; 

my %h1 = (a => 10, b => 20); 
mySub(%h1); 

sub mySub { 
    my ($h1) = {@_}; 
    p $h1; 
} 
+0

有什么问题。它不支持编辑传入的散列。请检查我的测试代码[这里](https://gist.github.com/omarabdelsalam/2e238f24ae9961a984a9a40e97fe7439)。 – Omar

+1

@Omar这是因为{@_}将'@ _'的内容复制到新的匿名哈希中。您将无法使用此方法修改原始哈希值。 – ThisSuitIsBlackNot

+0

在这种情况下,您必须使用原型(并确保在使用它之前定义该子)。请检查您的要点回复 –