双箭头(=>)运算符如何在Perl中工作?

时间:2010-11-04 04:27:39

标签: perl hash operators perl-data-structures

我知道=>运算符like this

的哈希使用情况
$ cat array.pl
%ages = ('Martin' => 28,
         'Sharon' => 35,
         'Rikke' => 29,);

print "Rikke is $ages{Rikke} years old\n";
$ perl array.pl
Rikke is 29 years old
$

我认为这只是初始化哈希的语法,但在How can I qualify a variable as const/final in Perl?的答案中,=>已经像这样使用了

use Readonly;
Readonly my $infilename => "input_56_12.txt";

=>究竟是什么意思?是否有更多方法可以使用=>

2 个答案:

答案 0 :(得分:33)

perl中的=>运算符与逗号基本相同。唯一的区别是,如果左边有一个不带引号的单词,它就像被引用的单词一样对待。所以你可以写Martin => 28,它与'Martin', 28相同。

你可以从任何偶数长度列表中创建一个哈希值,这就是你在你的例子中所做的一切。

您的Readonly示例通过省略括号来利用Perl对子例程参数的灵活性。它相当于Readonly(my $infilename, "input_56_12.txt")。 Readonly是Readonly模块导出的函数,它接受两个参数:引用和值。如果你想了解它们,Readonly的内部是值得的另一个问题。

以下是以意想不到的方式将其用作逗号的示例:

$ perl -e 'print hello => "world\n"'
helloworld

答案 1 :(得分:30)

来自perlop

  

=>运算符是该运算符的同义词   逗号除了它导致它的左边   操作数被解释为一个字符串   如果以字母开头或者   下划线,仅由...组成   字母,数字和下划线

     

这包括可能的操作数   否则被解释为运营商,   常量,单个数字的V字符串或   函数调用。如果对此有疑问   行为,左操作数可以   明确引用。

     

否则,=>操作员的行为   与逗号运算符或列表完全相同   参数分隔符,根据   上下文。

     

例如:

use constant FOO => "something";
my %h = ( FOO => 23 );
     

相当于:

my %h = ("FOO", 23);
     

不是:

my %h = ("something", 23);
     

=>运算符有帮助   记录之间的对应关系   哈希中的键和值等   列表中的成对元素

%hash = ( $key => $value );
login( $username => $password );

来自 PBP

我从 Perl最佳实践中找到了一些关于 Fat Commas =>的好信息,我认为在这里也应该提一下。

最好将胖字逗号保留为以下内容: -

构建哈希

时使用它
my %h = ( FOO => 23 );

或将命名参数传递给子程序,即。,

$text = format_text({FOO => 23, BAR => 30});

创建常量

 Readonly my $FOO => "23";

有关详细信息,请参阅Perl最佳实践的第4章:值和表达式(Fat逗号)部分。