[英]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
function
以10, 11, 12
結尾10, 11, 12
那么值將是 12@array
那么值將是 310, 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.
function
以10, 11, 12
結尾10, 11, 12
那么值將是 10@array
則該值將為 1010, 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
function
以10, 11, 12
結束10, 11, 12
那么@val
將是 10, 11, 12@array
那么@val
將是 10, 11, 1210, 11, 12, @array
@val
10, 11, 12, @array
那么@val
將是 10, 11, 12, 10, 11, 12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.