【问题标题】:Difference between perl commands '=>' and '='perl 命令 '=>' 和 '=' 之间的区别
【发布时间】:2012-06-14 17:02:28
【问题描述】:

以下 perl/mason 命令有什么区别。

$test = $test1; $test => $test1;

具体来说,这里的实例化是如何工作的?

【问题讨论】:

  • 这个问题是关于使用= 进行正常初始化,然后在<%args> 内部使用=> 吗?

标签: perl mason


【解决方案1】:

Mason 是一个 Perl 框架,供不知道的人使用...

= 是一个 Perl 赋值运算符。对于 , 运算符,=>syntactic sugar。它主要用于散列,以帮助将键与值相关联。以下三个是等价的:

my %hash = ("red", "apple", "yellow", "lemon", "green", "lime");

my %hash = (red => "apple", yellow => "lemon", green => "lime");

my %hash = ("red", apple => "yellow", lemon => "green", "lime");
  • 第一个看起来可能只是一个列表。我必须密切注意才能看到它是%hash 而不是@hash。另外,如果我有 100 个键值对,而不仅仅是其中的 3 个,您可能会开始忘记哪些是键,哪些是值。

  • 第二个非常清楚red 是值apple 的关键,yellowlemon 的关键,等等。还要注意我不再需要引号我的键,只要我的键遵循 Perl 变量名称约定(尽管它们前面可以包含一两个破折号)。

  • 第三个只是为了扰乱你的想法。并且向您展示=> 只是语法糖,并不一定将之前的内容与之后的内容联系起来。对于 Perl,它只是一个列表分隔符。你的大脑是形成这种关联的大脑。

你看到=> 用在这样的函数中:

my_function(
   -bar   => $bar_value,
   -fubar => $fu_value,
   -futz  => $futz_value,
);

这是一个名为myFunction 的函数,它将一组键控值作为参数。我也可以这样做:

my_function("-bar", "$bar_value", "-fubar", $fu_value, "-futz", "$futz_value");

然而,这个函数的作用是这样的:

sub my_function {
   my %params = @_;

所以,它使用哈希作为它的参数,而不仅仅是一个列表。当参数的顺序可能会因为太长或函数使用的许多参数是可选的而变得混乱时,函数往往会使用散列。想象一个功能可能需要用户 ID 和密码,但不一定需要。

您可以在任何情况下使用=> 而不是逗号。例如,Perl 中的最新风格是不使用括号作为函数参数:

chomp $foo;

比:

chomp( $foo );

但是,当你的函数有多个参数时,这有时更难阅读:

join ", ", @foo;

在这些情况下,我有时会使用=> 来替换命令:

join ", " => @foo;

现在,我可以看到“、”和@foo 都是join 函数的参数。小心点,不然会咬你的:

my @array = ( join ", " => @foo, @bar);

等同于:

my @array = ( join ", ", @foo, @bar );

my @array = ( join (", ", @foo, @bar ) );

而不是:

my @array = ( join (", ", @foo) , @bar);

仅仅因为我只在", "@foo 之间使用了=>,并不意味着@bar 不是参数的一部分!

【讨论】:

  • 您暗示但没有明确说明 => 糖还包括自动引用左操作数。
  • 我在第二个要点中确实说过:还要注意,只要我的键遵循 Perl 变量名称约定(尽管它们可以包含一两个前面的破折号)。 但是,在玩了之后,我意识到双破折号不起作用。
【解决方案2】:

嗯,Perl 还是 Mason?我不认识 Mason,所以我会回答有关 Perl 的问题。

«=»是赋值运算符。

$test = 'test';  # $test now contains the 4-char string "test".

«=>» 是«,» 的精美版本,它会自动引用其左侧。以下都是等价的:

print "a", "b";
print "a" => "b";
print a => "b";    # Auto-quoting in effect

两者都与实例化无关,尽管 Perl 在使用时会自动实例化一个包变量。这通常是一个坏主意,并被use strict; 禁用。 (始终使用use strict; use warnings;!)

操作员记录在perlop

【讨论】:

    【解决方案3】:

    David 的回答是关于 Perl 赋值运算符 =, 运算符的语法糖的一个很好的答案。但如果您使用的是 HTML::Mason,=> 运算符也可以有额外的含义。

    Mason 组件可以采用多种参数,来自外部源(HTTP 请求)或内部源(一个组件调用另一个),并通过 @987654326 声明参数的名称和数据类型@块:

    <%args>
      $width
      $admin => 0  # A default value
      @items => ( 1, 2, 'something else' )
      %pairs => ( key1 => 1, key2 => 'value' )
    </%args>
    

    这里=&gt; 运算符用于指定默认值。一个组件可以调用另一个组件,例如使用 & 标记,而无需指定任何参数:

    <& menu &>
    

    或使用=&gt; 运算符指定一些参数:

    <& menu, width => 640, admin => 1 &>
    

    您可以查看Mason Book 的组件章节。

    在 Mason2(简称 Mason)中,&lt;%args&gt; 块消失了,您仍然可以使用 &lt;&amp; &amp;&gt; 标签调用组件,但要声明属性,您必须在 &lt;%class&gt; 部分中使用 Moose 'has' 语法:

    <%class>
      has 'foo';
      has 'bar' => (required => 1);
      has 'baz' => (isa => 'Int', default => 17);
    </%class>
    

    这里有一些参考:Mason::Manual::Components

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      相关资源
      最近更新 更多