tutorial - strawberry perl




在Perl中查找數組的大小 (8)

perlintro文檔“Perl變量類型”部分包含

特殊變量$#array告訴你$#array最後一個元素的索引:

print $mixed[$#mixed];       # last element, prints 1.23

您可能會試圖使用$#array + 1來告訴您數組中有多少項。 不要打擾。 實際上,使用@array在Perl期望找到一個標量值(“在標量上下文中”)會給你數組中元素的數量:

if (@animals < 5) { ... }

perldata也在“標量值”部分介紹了這一點。

如果您在標量上下文中評估數組,它將返回數組的長度。 (請注意,對於列表來說,這不是真的,它返回最後一個值,比如C逗號操作符,也不是內置函數,它們返回他們想要返回的任何內容。)以下情況總是如此:

scalar(@whatever) == $#whatever + 1;

一些程序員選擇使用明確的轉換,以便毫無疑問:

$element_count = scalar(@whatever);

前面在同一節中介紹瞭如何獲取數組最後一個元素的索引。

數組的長度是一個標量值。 您可以通過評估$#days來查找array @days的長度,如csh 。 但是,這不是數組的長度; 它是最後一個元素的下標,這是一個不同的值,因為通常有第零個元素。

我似乎遇到了幾種不同的方法來查找數組的大小。 這三種方法有什麼區別?

my @arr = (2);
print scalar @arr; # First way to print array size

print $#arr; # Second way to print array size

my $arrSize = @arr;
print $arrSize; # Third way to print array size

int(@array)如何以標量威脅參數呢?


如果我們稍微修改第二個,所有三個都會得到相同的結果:

my @arr = (2, 4, 8, 10);

print "First result:\n";
print scalar @arr; 

print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.

print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;

從perldoc perldata ,這應該是安全的引用:

以下情況總是如此:

scalar(@whatever) == $#whatever + 1;

只要你沒有$#任何++,神秘地增加了大小或你的數組。

數組索引以0開頭。

您可以通過將空列表()分配給它來截斷數組。 以下是等同的:

    @whatever = ();
    $#whatever = -1;

這將我帶到我正在尋找的是如何檢測數組是空的。 我發現它如果$#空== -1;


第一種和第三種方式是相同的:他們在標量上下文中評估數組。 我會認為這是獲得數組大小的標準方法。

第二種方法實際上返回數組的最後一個索引,它不是(通常)與數組大小相同。


要使用第二種方法,請添加1:

print $#arr + 1; # Second way to print array size

這通過將數組強制為一個標量上下文來獲取大小,在該上下文中將其評估為其大小:

print scalar @arr;

這是強制數組成為標量上下文的另一種方式,因為它被分配給了一個標量變量:

my $arrSize = @arr;

這會得到數組中最後一個元素的索引,所以它實際上是大小減1(假設索引從0開始,可以在Perl中調整,儘管這樣做通常是一個壞主意):

print $#arr;

最後一個不太適合用於獲取數組大小。 如果你只想獲得數組的最後一個元素,這將是有用的:

my $lastElement = $arr[$#arr];

另外,正如你在堆棧溢出中看到的那樣,這個構造不能被大多數語法突出顯示器正確處理......


首先,第二個不等於另外兩個。 $#array返回$#array的最後一個索引,它比數組的大小小一個。

其他兩個實際上是一樣的。 您只是使用兩種不同的方法來創建標量上下文。 這歸結為可讀性問題。

我個人比較喜歡以下內容:

say [email protected];          # Represent @array as a number

我覺得它比

say scalar(@array);    # Represent @array as a scalar

my $size = @array;
say $size;

後者看起來很清楚,但是我發現當其他代碼的一部分出現時,額外的一行消除了清晰度。 這對於教導@array在標量上下文中所做的工作很有用,也許你想要多次使用$size





perl