簡體   English   中英

Perl中的`$ this`,`@ that`和`%that`有什么區別?

[英]What is the difference between `$this`, `@that`, and `%those` in Perl?

Perl中的$this ,@ @that%those什么區別?

Perl sigils的一個有用的助記符是:

  • $日歷
  • @rray
  • %灰

Matt Troutblog.fogus.me上寫了一篇關於Perl sigils的評論,我覺得它很有用,所以粘貼如下:

實際上,perl sigils並不表示變量類型 - 它們表示共軛 - $是'the',@是'這些',%是'map of'左右 - 變量類型通過[]或{}表示。 你可以看到這個:

 my $foo = 'foo'; my @foo = ('zero', 'one', 'two'); my $second_foo = $foo[1]; my @first_and_third_foos = @foo[0,2]; my %foo = (key1 => 'value1', key2 => 'value2', key3 => 'value3'); my $key2_foo = $foo{key2}; my ($key1_foo, $key3_foo) = @foo{'key1','key3'}; 

所以當瀏覽perl代碼時會看到這個印記,告訴你你要做什么 - 而不是你正在操作的東西,幾乎就是這樣。

不可否認,這一點在您習慣之前確實令人困惑,但是一旦您習慣了它,它就可以成為一個非常有用的工具,可以在瀏覽代碼時吸收信息。

當然,你仍然完全有權討厭它,但這是一個有趣的概念,我認為你可能更喜歡討厭實際發生的事情,而不是你認為發生的事情:)

$this是一個標量值,它包含1個項目,如apple

@that是一個值數組,它有幾個像("apple", "orange", "pear")

%those是值的哈希值,它保存鍵值對,如("apple" => "red", "orange" => "orange", "pear" => "yellow")

有關Perl變量類型的更多信息,請參閱perlintro

Perl的發明者是語言學家,他試圖讓Perl成為一種“自然語言”。

這篇文章

按數字,案例和單詞順序消除歧義

語言可以通過某些局部模糊性消失的部分原因是其他歧義被各種機制所抑制。 英語使用數字和單詞順序,在代詞中用案例系統的痕跡:“男人看着男人,他們回頭看着他。” 在這句話中,對於向誰做的事情是完全清楚的。 同樣,Perl在其名詞上有數字標記; 也就是說,$ dog是一個狗,而@dog(可能)很多。 所以$和@有點像英語中的“this”和“these” [強調補充]

人們經常嘗試將符號綁定到變量類型,但它們只是松散相關。 這是我們在學習Perl有效Perl編程時非常努力的一個主題,因為當你理解sigils時,理解Perl要容易得多。

許多人忘記了變量和數據實際上是分開的東西。 變量可以存儲數據,但您不需要變量來使用數據。

$表示單個標量值(不一定是標量變量):

$scalar_var
$array[1]
$hash{key}

@表示多個值。 這可能是整個數組,切片或取消引用:

@array;
@array[1,2]
@hash{qw(key1 key2)}
@{ func_returning_array_ref };

%表示對(鍵和值),可能是哈希變量或取消引用:

%hash
%$hash_ref

在Perl v5.20下, %現在可以表示鍵/值切片或散列或數組:

%array[ @indices ];  # returns pairs of indices and elements
%hash{ @keys };      # returns pairs of key-values for those keys

您可能需要查看perlintroperlsyn文檔才能真正開始理解Perl(即閱讀翻轉手冊)。 :-)

那說:

  • $this是一個標量,可以存儲一個數字(int或float),一個字符串或一個引用(見下文);
  • @that是一個數組,可以存儲一個有序的標量列表(見上文)。 您可以使用pushunshift函數向數組添加標量(請參閱perlfunc ),您可以使用括號括號的逗號分隔的標量文字或變量列表來創建數組文字(即, my @array = ($a, $b, 6, "seven");
  • %those是哈希,它是一個關聯數組。 散列具有鍵值對的條目,以便您可以通過提供其鍵來訪問散列的值。 哈希文字也可以像列表一樣指定,除了每個奇數條目都是一個鍵,每個偶數都是一個值。 您還可以使用=>字符而不是逗號來分隔鍵和值。 (即, my %ordinals = ("one" => "first", "two" => "second");

通常,當您將數組或哈希值傳遞給子例程調用時,各個列表將被展平為一個長列表。 這有時是可取的,有時不是。 在后一種情況下,您可以使用引用將對整個列表的引用作為單個標量參數傳遞。 但是,引用的語法和語義很棘手,並且超出了本答案的范圍。 但是,如果您想查看它,請參閱perlref

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM