Perl 數(shù)組

數(shù)組一個是存儲標(biāo)量值的無序列表變量。

數(shù)組變量以 @ 開頭。訪問數(shù)組元素使用 $ + 變量名稱 + [索引值] 格式來讀取,實例如下:

#!/usr/bin/perl

@hits = (25, 30, 40);             
@names = ("google", "youj", "taobao");

print "\$hits[0] = $hits[0]\n";
print "\$hits[1] = $hits[1]\n";
print "\$hits[2] = $hits[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";

程序中 $ 符號使用了 \ 來轉(zhuǎn)義,讓他原樣輸出。

執(zhí)行以上程序,輸出結(jié)果為:

$hits[0] = 25
$hits[1] = 30
$hits[2] = 40
$names[0] = google
$names[1] = youj
$names[2] = taobao

創(chuàng)建數(shù)組

數(shù)組變量以 @ 符號開始,元素放在括號內(nèi),也可以以 qw 開始定義數(shù)組。

@array = (1, 2, 'Hello');
@array = qw/這是 一個 數(shù)組/;

第二個數(shù)組使用 qw// 運(yùn)算符,它返回字符串列表,數(shù)組元素以空格分隔。當(dāng)然也可以使用多行來定義數(shù)組:

@days = qw/google
taobao
...
youj/;

你也可以按索引來給數(shù)組賦值,如下所示:

$array[0] = 'Monday';
...
$array[6] = 'Sunday';

訪問數(shù)組元素

訪問數(shù)組元素使用 $ + 變量名稱 + [索引值] 格式來讀取,實例如下:

@sites = qw/google taobao youj/;

print "$sites[0]\n";
print "$sites[1]\n";
print "$sites[2]\n";
print "$sites[-1]\n";    # 負(fù)數(shù),反向讀取

執(zhí)行以上程序,輸出結(jié)果為:

google
taobao
youj
youj

數(shù)組索引值從 0 開始,即 0 為第一個元素,1 為第二個元素,以此類推。

負(fù)數(shù)從反向開始讀取,-1 為第一個元素, -2 為第二個元素


數(shù)組序列號

Perl 提供了可以按序列輸出的數(shù)組形式,格式為 起始值 + .. + 結(jié)束值,實例如下:

#!/usr/bin/perl

@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);

print "@var_10\n";   # 輸出 1 到 10
print "@var_20\n";   # 輸出 10 到 20
print "@var_abc\n";  # 輸出 a 到 z
<p>執(zhí)行以上程序,輸出結(jié)果為:</p>
<pre>
1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z

數(shù)組大小

數(shù)組大小由數(shù)組中的標(biāo)量上下文決定。:

@array = (1,2,3);
print "數(shù)組大小: ",標(biāo)量 @array,"\n";

數(shù)組長度返回的是數(shù)組物理大小,而不是元素的個數(shù),我們可以看以下實例:

#!/uer/bin/perl

@array = (1,2,3);
$array[50] = 4;

$size = @array;
$max_index = $#array;

print "數(shù)組大小:  $size\n";
print "最大索引: $max_index\n";

執(zhí)行以上程序,輸出結(jié)果為:

數(shù)組大小:  51
最大索引: 50

從輸出的結(jié)果可以看出,數(shù)組元素只有四個,但是數(shù)組大小為 51。


添加和刪除數(shù)組元素

Perl 提供了一些有用的函數(shù)來添加和刪除數(shù)組元素。

如果你之前沒有編程經(jīng)驗,可能會問什么是函數(shù),其實我們之前使用的 print 即是一個輸出函數(shù)。

下表列出了數(shù)組中常用的操作函數(shù):

序號類型和描述
1push @ARRAY, LIST

將列表的值放到數(shù)組的末尾

2pop @ARRAY

彈出數(shù)組最后一個值,并返回它

3shift @ARRAY

彈出數(shù)組第一個值,并返回它。數(shù)組的索引值也依次減一。

4unshift @ARRAY, LIST

將列表放在數(shù)組前面,并返回新數(shù)組的元素個數(shù)。

實例

#!/usr/bin/perl

# 創(chuàng)建一個簡單是數(shù)組
@sites = ("google","youj","taobao");
print "1. \@sites  = @sites\n";

# 在數(shù)組結(jié)尾添加一個元素
push(@sites, "baidu");
print "2. \@sites  = @sites\n";

# 在數(shù)組開頭添加一個元素
unshift(@sites, "weibo");
print "3. \@sites  = @sites\n";

# 刪除數(shù)組末尾的元素
pop(@sites);
print "4. \@sites  = @sites\n";

# 移除數(shù)組開頭的元素
shift(@sites);
print "5. \@sites  = @sites\n";

執(zhí)行以上程序,輸出結(jié)果為:

添加和刪除數(shù)組元素


切割數(shù)組

我們可以切割一個數(shù)組,并返回切割后的新數(shù)組:

#!/usr/bin/perl

@sites = qw/google taobao youj weibo qq facebook 網(wǎng)易/;

@sites2 = @sites[3,4,5];

print "@sites2\n";

執(zhí)行以上程序,輸出結(jié)果為:

weibo qq facebook

數(shù)組索引需要指定有效的索引值,可以是正數(shù)后負(fù)數(shù),每個索引值使用逗號隔開。

如果是連續(xù)的索引,可以使用 .. 來表示指定范圍:

#!/usr/bin/perl

@sites = qw/google taobao youj weibo qq facebook 網(wǎng)易/;

@sites2 = @sites[3..5];

print "@sites2\n";

執(zhí)行以上程序,輸出結(jié)果為:

weibo qq facebook

替換數(shù)組元素

Perl 中數(shù)組元素替換使用 splice() 函數(shù),語法格式如下:

splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

參數(shù)說明:

  • @ARRAY:要替換的數(shù)組。
  • OFFSET:起始位置。
  • LENGTH:替換的元素個數(shù)。
  • LIST:替換元素列表。

以下實例從第6個元素開始替換數(shù)組中的5個元素:

#!/usr/bin/perl

@nums = (1..20);
print "替換前 - @nums\n";

splice(@nums, 5, 5, 21..25); 
print "替換后 - @nums\n";

執(zhí)行以上程序,輸出結(jié)果為:

替換前 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
替換后 - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20

將字符串轉(zhuǎn)換為數(shù)組

Perl 中將字符串轉(zhuǎn)換為數(shù)組使用 split() 函數(shù),語法格式如下:

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

參數(shù)說明:

  • PATTERN:分隔符,默認(rèn)為空格。
  • EXPR:指定字符串?dāng)?shù)。
  • LIMIT:如果指定該參數(shù),則返回該數(shù)組的元素個數(shù)。

實例

#!/usr/bin/perl

# 定義字符串
$var_test = "youj";
$var_string = "www-youj-com";
$var_names = "google,taobao,youj,weibo";

# 字符串轉(zhuǎn)為數(shù)組
@test = split('', $var_test);
@string = split('-', $var_string);
@names  = split(',', $var_names);

print "$test[3]\n";  # 輸出 o
print "$string[2]\n";  # 輸出 com
print "$names[3]\n";   # 輸出 weibo

執(zhí)行以上程序,輸出結(jié)果為:

o
com
weibo

將數(shù)組轉(zhuǎn)換為字符串

Perl 中將數(shù)組轉(zhuǎn)換為字符串使用 join() 函數(shù),語法格式如下:

join EXPR, LIST

參數(shù)說明:

  • EXPR:連接符。
  • LIST:列表或數(shù)組。

實例

#!/usr/bin/perl

# 定義字符串
$var_string = "www-youj-com";
$var_names = "google,taobao,youj,weibo";

# 字符串轉(zhuǎn)為數(shù)組
@string = split('-', $var_string);
@names  = split(',', $var_names);


# 數(shù)組轉(zhuǎn)為字符串
$string1 = join( '-', @string );
$string2 = join( ',', @names );

print "$string1\n";
print "$string2\n";

執(zhí)行以上程序,輸出結(jié)果為:

www-youj-com
google,taobao,youj,weibo

數(shù)組排序

Perl 中數(shù)組排序使用 sort() 函數(shù),語法格式如下:

sort [ SUBROUTINE ] LIST

參數(shù)說明:

  • SUBROUTINE:指定規(guī)則。
  • LIMIT:列表或數(shù)組。

實例

#!/usr/bin/perl

# 定義數(shù)組
@sites = qw(google taobao youj facebook);
print "排序前: @sites\n";

# 對數(shù)組進(jìn)行排序
@sites = sort(@sites);
print "排序前: @sites\n";

執(zhí)行以上程序,輸出結(jié)果為:

排序前: google taobao youj facebook
排序前: facebook google youj taobao

注意:數(shù)組排序是根據(jù) ASCII 數(shù)字值來排序。所以我們在對數(shù)組進(jìn)行排序時最好先將每個元素轉(zhuǎn)換為小寫后再排序。


特殊變量: $[

特殊變量 $[ 表示數(shù)組的第一索引值,一般都為 0 ,如果我們將 $[ 設(shè)置為 1,則數(shù)組的第一個索引值即為 1,第二個為 2,以此類推。實例如下:

#!/usr/bin/perl

# 定義數(shù)組
@sites = qw(google taobao youj facebook);
print "網(wǎng)站: @sites\n";

# 設(shè)置數(shù)組的第一個索引為 1
$[ = 1;

print "\@sites[1]: $sites[1]\n";
print "\@sites[2]: $sites[2]\n";

執(zhí)行以上程序,輸出結(jié)果為:

網(wǎng)站: google taobao youj facebook
@sites[1]: google
@sites[2]: taobao

一般情況我們不建議使用特殊變量 $[,在新版 Perl 中,該變量已廢棄。


合并數(shù)組

數(shù)組的元素是以逗號來分割,我們也可以使用逗號來合并數(shù)組,如下所示:

#!/usr/bin/perl

@numbers = (1,3,(4,5,6));

print "numbers = @numbers\n";

執(zhí)行以上程序,輸出結(jié)果為:

numbers = 1 3 4 5 6

也可以在數(shù)組中嵌入多個數(shù)組,并合并到主數(shù)組中:

#!/usr/bin/perl

@odd = (1,3,5);
@even = (2, 4, 6);

@numbers = (@odd, @even);

print "numbers = @numbers\n";

執(zhí)行以上程序,輸出結(jié)果為:

numbers = 1 3 5 2 4 6

從列表中選擇元素

一個列表可以當(dāng)作一個數(shù)組使用,在列表后指定索引值可以讀取指定的元素,如下所示:

#!/usr/bin/perl

$var = (5,4,3,2,1)[4];

print "var 的值為 = $var\n"

執(zhí)行以上程序,輸出結(jié)果為:

var 的值為 = 1

同樣我們可以在數(shù)組中使用 .. 來讀取指定范圍的元素:

#!/usr/bin/perl

@list = (5,4,3,2,1)[1..3];

print "list 的值 = @list\n";

執(zhí)行以上程序,輸出結(jié)果為:

list 的值 = 4 3 2