perl用途 - 在Perl中查找數組的大小




perl教學 perl中文 (10)

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

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

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

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

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

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

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 。 但是,這不是數組的長度; 它是最後一個元素的下標,這是一個不同的值,因為通常有第零個元素。


要找到數組的大小,請使用scalar關鍵字:

print scalar @array;

要找出數組的最後一個索引,有$# (Perl默認變量)。 它給出了數組的最後一個索引。 當數組從0開始時,我們通過給$#添加一個來獲得數組的大小:

print "$#array+1";

例:

my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";

輸出:

3

3

有多種方法可以打印數組的大小。 這裡是所有的意思:讓我們說我們的數組是my @arr = (3,4);

方法1:標量

這是獲取數組大小的正確方法。

print scalar @arr;  # prints size, here 2

方法2:索引號

$#arr給出數組的最後一個索引。 所以如果數組大小為10,那麼它的最後一個索引是9。

print $#arr;     # prints 1, as last index is 1
print $#arr + 1; # Add 1 to last index to get array size

我們在這裡考慮數組0作為索引 。 但是,如果它不是基於零,那麼這個邏輯將失敗

perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;'   # prints 6

上面的例子打印6,因為我們已經將其初始索引設置為4.現在索引將是5和6,分別是元素3和4。

方法3:

在標量上下文中使用數組時,將返回數組的大小

my $size = @arr;
print $size;   # prints size, here 2

實際上方法3和方法1是一樣的。


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

以下情況總是如此:

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

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

數組索引以0開頭。

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

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

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


首先,第二個不等於另外兩個。 $#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


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


例:

my @a = (undef, undef);
my $size = @a;

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2

因為如果require指令必須成功(返回true值)或失敗(返回false值,則需要Perl模塊返回一個值來發出信號;如果模塊由於某種原因未能初始化,這可能是有意義的)。

如果您不返回任何內容,則口譯員無法知道require必須成功或失敗; 同時,由於很容易忘記將真值放在包的末尾,它建議對此錯誤進行“常見修復”:添加一個真值作為返回。

有關模塊返回值的其他信息/民間傳說,請查看此問題





perl