跳轉到內容

Perl 程式設計/陣列變數

來自華夏公益教科書
上一個:標量變數 索引 下一個:雜湊變數

Perl 語法同時包含列表和陣列。

Perl 中的列表是標量值的排序集合。它在你的程式碼中表示為用逗號分隔的值序列,這些值可能包含在標量變數中,也可能不包含。列表可以用於同時進行多個賦值,並且可以作為引數傳遞給幾個內建和使用者定義的函式。

#!/usr/bin/perl
use strict;
use warnings;

my ($length, $width, $depth) = (10, 20, 15);

print "The values are: ", $length, $width, $depth;
注意
構建列表時,不需要括號。它們只用於優先順序。

備用列表構建

[編輯 | 編輯原始碼]

建立不包含空格的多個字串的列表時,Perl 提供了一種快捷方式來避免鍵入多個引號和逗號。而不是

($name1, $name2, $name3, $name4) = ('Paul', 'Michael', 'Jessica', 'Megan');

你可以使用qw//運算子。此運算子使用任何非字母數字字元作為分隔符(通常是/字元),幷包含以空格分隔的裸詞序列。分隔符將命令與引數分隔開。上面的行與以下內容相同

($name1, $name2, $name3, $name4) = qw/Paul Michael Jessica Megan/;

兩者都等於此

($name1, $name2, $name3, $name4) = qw(Paul Michael Jessica Megan);

最後一個示例使用開啟和關閉圓括號作為不同的分隔符。如果你選擇的 delimit 選擇了開啟和關閉版本,你都需要使用它們。否則只需重複相同的符號兩次。例如,你不能鍵入qw<Paul Michael<你必須鍵入qw<Paul Michael>.

你也可以濫用 glob 語法,當字串不包含 shell 元字元時

($name1, $name2, $name3, $name4) = <Paul Michael Jessica Megan>;
注意
qw// 運算子生成的字串是單引號,這意味著集合中不會發生插值。如果你需要在列表中包含變數,則不能使用此方法。

列表賦值

[編輯 | 編輯原始碼]

如上所示,列表可用於同時進行多個賦值。如果左側變數的數量與右側值的數量相同,則所有變數都將按預期分配給相應的值。

如果左側變數少於右側值,則“額外”值將被簡單地忽略。

#!/usr/bin/perl

($length, $width) = (10, $w, 15);  #$length gets 10, $width gets the value of $w. 15 is ignored

如果左側變數多於右側值,則“額外”變數將分配預設值undef

#!/usr/bin/perl

($length, $width, $depth) = (10, $w); #$length gets 10, $width gets the value of $w. $depth is undef

列表賦值的存在可以建立“交換”兩個變數的值的能力,而無需中間臨時變數。

#!/usr/bin/perl

$foo = 10;

$bar = 5;

($foo, $bar) = ($bar, $foo);  #$foo now equals 5, while $bar equals 10;

Perl 中的陣列是一個包含列表的變數。陣列可以修改,新增和刪除元素,清空或重新分配到一個完全不同的列表。就像所有標量變數都以$字元開頭一樣,所有陣列變數都以@字元開頭。

注意
在 Perl 中,經常錯誤地將“列表”和“陣列”這兩個詞互換使用。它們並不具有相同的含義。
一個恰當的比喻是,列表(例如qw/foo bar baz/) 對應於陣列(例如@values),就像字串(例如'Paul') 對應於標量變數(例如$name).

陣列賦值

[編輯 | 編輯原始碼]

陣列被分配列表的值。值的列表可以任意大或小(甚至可以包含 0 個元素)。

 #!/usr/bin/perl

 @nums = (1,2,3,4,5);

 @more = 6..1000; #using the 'range' operator

 @none = ();  # empty array.

 @names = qw/Paul Michael Jessica Megan/;

 @all = (@nums, @more);  #@all contains all integers from 1 to 1000

最後一個示例說明了 Perl 中一個被稱為“陣列扁平化”的功能。當陣列在列表中使用時,填充列表的是陣列的元素,而不是陣列本身。如上所述,列表是一組標量值。因此,@all陣列包含 1000 個元素,而不是 2 個。

注意
儘管這暗示你不能建立“陣列的陣列”或“二維陣列”,但這些東西在 Perl 中確實存在。它們透過使用引用模擬。

標量上下文中陣列

[編輯 | 編輯原始碼]

當陣列在標量上下文中使用時 - 無論是透過將標量變數分配給陣列的值,還是在需要標量的操作或函式中使用它 - 陣列都返回其大小。也就是說,它返回它當前包含的元素數量。

 #!/usr/bin/perl

 @names = ('Paul','Michael','Jessica','Megan');

 $how_many = @names;

 print "I have a total of $how_many names\n";
注意
一個常見的誤解是,列表在標量上下文中也會返回其大小。這是不正確的。事實上,在標量上下文中不存在列表:在標量上下文中使用逗號運算子不會建立列表,而是從左到右評估每個引數,並返回最後一個引數。

$name = ('Paul','Michael','Jessica','Megan');
 print "The last name in my list is $name\n";

列印陣列

[編輯 | 編輯原始碼]

一般來說,列印陣列的值有兩種方法。你可以直接列印陣列中的專案列表,或者可以在雙引號字串中插入陣列。

 @names = qw/Paul Michael Jessica Megan/;
 print "My names are: ", @names, ".\n";
 print "My names are: @names.\n";

在第一個示例中,print函式被賦予 6 個引數:字串“我的名字是:”,@names中的四個值中的每一個,以及字串“。\n”。每個引數都以$,變數的值(預設為空字串)分隔列印,導致陣列中的值“擠壓”在一起。

My names are: PaulMichaelJessicaMegan.

在第二個示例中,print函式被賦予一個引數:一個包含插入陣列的字串。當 Perl 插入陣列時,結果字串將包含陣列中的所有值,並以$"變數的值(預設為單個空格)分隔。

My names are: Paul Michael Jessica Megan.
注意
兩者$,$"變數都可以更改為任何你喜歡的字串。例如,要以逗號和空格而不是單個空格分隔陣列的專案,可以
$" = ', ';
 print "My names are: @names.\n";
My names are: Paul, Michael, Jessica, Megan.

一般來說,你不想這樣做,因為根據這些變數的預設值,這可能會在程式的其他部分引起問題!稍後將解釋使用自定義分隔符安全地列印陣列的方法。

訪問陣列元素

[編輯 | 編輯原始碼]

陣列的元素使用方括號內的數字引用訪問。因為陣列中的每個專案都是一個標量值,你需要使用$來引用一個值。陣列的第一個元素是數字 0,所有其他元素都從那裡開始向上計數。

負數將從陣列的右側向下計數。這意味著 -1 引用陣列的最後一個元素,-3 引用倒數第三個元素。讓我們看一些例子。

 @array = (1, 2, 3, 4, 5);
 print $array[0];   # Prints 1
 print $array[3];   # Prints 4
 print $array[-1];  # Prints 5

如果你需要知道最後一個索引怎麼辦?$#array將為你返回它。

 @array = (1, 2, 3, 4, 5);
 print $array[4];         # Prints 5
 print $array[-1];        # Same as above
 print $array[ $#array ]; # Also prints 5

一個常見的錯誤是這樣做

 print @array[0];  # Also prints 1, but for the wrong reasons

事實上@array[0]是一個切片(即陣列的子陣列),它包含一個元素,而$array[0]是一個包含值 1 的標量。

常用陣列函式

[編輯 | 編輯原始碼]

命令列引數

[編輯 | 編輯原始碼]

您可能想知道,Perl 指令碼支援命令列引數。所有引數都儲存在陣列中@ARGV中,第一個條目包含第一個命令列引數。如果未傳遞任何命令列引數,@ARGV將是一個空陣列。

上面列出的陣列函式和運算子可輕鬆用於檢測傳遞的命令列引數,以及檢測提供的引數數量。

[編輯 | 編輯原始碼]
上一個:標量變數 索引 下一個:雜湊變數
華夏公益教科書