1

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

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

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

4

3 回答 3

8

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

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

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是 value 的键apple,那yellow是的键lemon等等。还要注意,只要我的键遵循 Perl 变量名称约定,我就不再需要在我的键周围加上引号(尽管它们可以包含一个或前面的两个破折号)。

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

=>会在这样的函数中看到 used:

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 和密码但不一定需要用户 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);

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

于 2012-06-14T18:43:50.380 回答
3

那么,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中。

于 2012-06-14T17:06:35.563 回答
1

David 的回答是关于 Perl 赋值运算符=和运算符的语法糖的一个很好的答案,。但是,如果您使用的是 HTML::Mason,则该=>运算符还可以具有其他含义。

Mason 组件可以接受各种参数,来自外部源(HTTP 请求)或内部源(一个组件调用另一个),并通过<%args>块声明参数的名称和数据类型:

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

这里=>操作符用于指定默认值。并且一个组件可以使用例如 & 标记调用另一个组件,而无需指定任何参数:

<& menu &>

或使用运算符指定一些参数=>

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

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

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

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

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

于 2013-11-14T09:34:08.240 回答