簡體   English   中英

如何從在 Perl 中返回數組的函數中獲取第一項?

[英]How do I get the first item from a function that returns an array in Perl?

我有一個返回數組的函數,我只想從該數組中獲取第一項,而無需為該數組聲明變量。 基本上,它應該是這樣的:

functionReturningArray()[1]

除了那不起作用。

我真的不想浪費空間聲明整個數組,因為我不需要它,而且我不想浪費額外的一行代碼。 無論如何要在一行中做到這一點?

my $item = (function_returning_list())[0];

函數不能返回數組,它們可以返回數組(即列表)的內容。 列表從0開始索引,因此函數返回的第一項是(func)[0] 你也可以說

my ($item) = function_returning_list();

這將function_returning_list放在列表上下文中,並對左側列表中的變量進行賦值(按順序)。

需要注意的是

sub function_returning_list {
    return ("a", "b", "c")
}

my $item = function_returning_list();

可能不會做你期望的。 $item變量將被分配"c" 這是因為在標量上下文中沒有列表這樣的東西。 相反,您在標量上下文中有逗號運算符,它在 void 上下文中計算左側表達式,丟棄結果,然后在標量上下文中計算右側。

我調用一個序列(而不是一個列表)並且在一些情況下很有用,比如 C 風格的for循環。

首先, [1]是列表中的第二項,因為 Perl 使用基於 0 的索引。

其次,您需要在列表上下文中評估函數的返回值,以便訪問列表。

(functionReturningArray())[0]

比 Chas 的回答下面的討論更進一步,沒有列表周期這樣的東西。

與 Python 的元組類型扮演這個角色不同,Perl 的列表完全是編譯器/解釋器中堆棧的構造。 這就是您不能引用列表的原因。

就像 python 使用元組一樣,當使用諸如=賦值運算符之類的構造時,perl 會自動推送和移動其堆棧以移動變量組。 (Perl 的優先規則是需要括號的,因為=綁定比,更緊密)。 Perl 和 Python 的機制之間的宏觀級別差異在於上下文在整個表達式中傳播。

因此,當在標量上下文中時,該上下文被分配給每個,運算符,並且運算符在 void 上下文中執行其左側,在標量上下文中執行其右側,然后返回。 然而,在列表上下文中,運算符將其參數壓入堆棧,所有這些都在列表上下文中執行。 然后堆棧通過賦值運算符傳遞,然后移入左值。 堆棧/列表本身對於 Perl 級別的代碼是不可變的,它的修改工具實際上是 Perl 的所有語法。

因此,雖然在標量上下文中引用列表是不正確的(因為這樣的事情不可能發生),但您可以引用列表的行為,如語法構造(由,運算符構造,由數組切片或列表切片構造) . 在標量上下文中,類似列表的構造的行為是返回列表的最后一個元素。 如何實現取決於表達式中的運算符。 這當然與返回其長度的標量上下文中數組的行為形成對比。

用一個例子來澄清並最終遵守規則並實際回答問題:

假設my @array = (10, 11, 12);

  • 標量上下文

     my $val = (10, 11, 12); # $val is 12 my $val = (10 .. 20)[0 .. 5]; # $val is 15 my $val = @array; # $val is 3 my $val = function(); # $val is the last executed expression
    • 所以如果function10, 11, 12結尾10, 11, 12那么值將是 12
    • 如果它是@array那么值將是 3
    • 如果它以10, 11, 12, @array結尾10, 11, 12, @array則值也是 3

  • 列表上下文

     my ($val) = (10, 11, 12); # $val is 10 my ($val) = (10 .. 20)[0 .. 5]; # $val is 10 my ($val) = @array; # $val is 10 my ($val) = function(); # $val is the first executed expression # in the last statement.
    • 所以如果function10, 11, 12結尾10, 11, 12那么值將是 10
    • 如果它是@array則該值將為 10
    • 如果它以10, 11, 12, @array結尾10, 11, 12, @array則值也是 10

  • 為了完整起見,列出上下文將整個列表抓取到一個數組中

     my @val = (10, 11, 12); # @val is 10, 11, 12 my @val = (10 .. 20)[0 .. 5]; # @val is 10, 11, 12, 13, 14, 15 my @val = @array; # @val is 10, 11, 12 my @val = function(); # @val is the last executed statement
    • 所以如果function10, 11, 12結束10, 11, 12那么@val將是 10, 11, 12
    • 如果它是@array那么@val將是 10, 11, 12
    • 如果它以10, 11, 12, @array @val 10, 11, 12, @array那么@val將是 10, 11, 12, 10, 11, 12

暫無
暫無

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

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