2012-06-14 219 views
1

以下perl/mason命令之間有什麼區別?perl命令之間的區別'=>'和'='

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

具體如何在這裏實例化?

+0

這個問題是關於使用'='進行正常初始化,然後在'<%args>'內使用'=>'? –

回答

3

那麼,Perl或梅森?我不認識梅森,所以我會回答一下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

8

Mason是爲那些誰不知道一個Perl框架...

=是一個Perl的賦值操作符。對於,運營商,=>syntactic sugar。它主要用於散列,以幫助將關鍵與價值聯繫起來。以下三個equivelent:

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,那yellow的關鍵是lemon等還要注意,我不再需要大約只要我的鑰匙遵循的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不是參數的一部分!

+0

你暗示但沒有明確說明'=>'糖還包括自動引用左操作數。 –

+0

我在第二個項目符號中聲明:_注意,我不再需要引號圍繞我的鍵,只要我的鍵遵循Perl變量名稱約定(儘管它們可以在前面包含一個或兩個破折號)。在附近,我意識到雙重破折號不起作用。 –

1

David的回答是關於Perl賦值運算符=,運算符的語法糖的一個很好的答案。但是,如果您使用HTML :: 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(簡稱梅森)的<%args>塊就沒了,你仍然可以調用使用<& &>標籤組件,但申報的屬性,你必須使用穆斯「有」語法<%class>段內:

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

這裏有一些參考:Mason::Manual::Components