《Beginning Perl》讀書筆記2:4~5章

來源:互聯網
上載者:User
第4章:列表與數組列表
  • ():空列表,當做條件判斷時為false
  • 兩個非空列表示例:("Hello ", "world", "\n") (123, 456, 789)
  • 同一列表中可以容納不同類型的元素
  • Perl中的列表只有一維。(3, 8, 5, 15)、((3, 8), (5, 15))和(3, (8, 5), 15)都等於(3, 8, 5, 15)
  • qw//可以用來聲明字串數組:qw/hello world good bye/等於('hello', 'world', 'good', 'bye'). 這裡有兩個要點:1. 元素以空格分隔 2. 空格分隔開的字串被當做單引號聲明的字串處理。同樣可以用#、|、<>、[]、{}、()代替//
  • 可以對整數定義區間:(1 .. 6)等價於(1, 2, 3, 4, 5, 6). 注意只能對整數定義。如果對小數定義則會導致整數截斷:(1.4 .. 6.9)等價於(1, 2, 3, 4, 5, 6). 由於字元也是整數,因此形如('a'..'k')的寫法也可以
  • reverse()函數將列表反序,例如reverse (qw(The cat sat on the mat))等於qw(mat the on sat cat The)
  • list[index]用於取列表中的元素。下標從0開始。負的下標表示倒序下標,例如list[-1]指最後一個元素,而list[-2]指倒數第二個元素。
    • (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[-2..1])等於(‘Nov’, ‘Dec’, ‘Jan’, ‘Feb’)
  • 使用多個下標可以將列表切片:(19, 68, 47, 60, 53, 51, 58, 55, 47)[(4, 5, 6)]將得到(53, 51, 58)
    • 也可寫作(19, 68, 47, 60, 53, 51, 58, 55, 47)[4, 5, 6]
  • 列表賦值:($mone, $mtwo) = (1, 3);等價於$mone=1;$mtwo=3;
    • ($mone, $mtwo) = ($mtwo, $mone);
  • 可以將多個下標和區間擷取切片:(qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[0,3,7..11])
數組
  • Perl中存有列表的變數稱為數組,數組名以@開頭,例如@array = (1,2,3);
  • print函數接受的參數本質上就是一個列表,所以可以直接將數組列印出來:

@array = (4, 6, 3, 9, 12, 10);

print @array, "\n";

得到:46391210

而如果使用這種寫法

print "@array\n";

得到自動按空格分隔好的列表:4 6 3 9 12 10

  • 將列表強制轉換為標量將會得到列表的長度(所含元素數)
    • $scalar1 = @array1;
    • 或使用scalar()函數:print scalar @array1;
  • 向數組中添加元素:
my @array1 = (1, 2, 3);my @array2;@array2 = (@array1, 4, 5, 6);@array2 = (3, 5, 7, 9);@array2 = (1, @array2, 11);
  • $#array擷取array的最大下標,例如my @array = (2, 4, 6, 8);則$#array為3
  • 可以用foreach遍曆列表和數組foreach scalar_variable ( list_or_array ) {...} 其中scalar_variable為迭代器。迭代過程中,可以通過膝蓋迭代器的值更新列表中的元素:my @array = (10, 20, 30, 40); foreach (@array) {$_ *=2;}執行後@array中每個元組增倍。上面給出的例子還說明如果不顯式指定迭代器名字,則$_為迭代器
  • foreach也具有和if類似的expression modifier用法:print "[$_]\n" foreach @a;
  • push(@array, $scalar)將標量$scalar加到@array最後(等價於@array = (@array, $scalar)),push(@array1, @array2)則將@array2接到@array1後(等價於@array1 = (@array1, @array2))
  • pop(@array)從@array中刪去最後一個元素,並返回這個元素
  • 與push類似,shift(@array, $scalar)等價於@array = ($scalar, @array);而shift(@array1, @array2)則等價於@array1 = (@array2, @array1)
  • unshift(@array)從@array中刪除第一個元素,並返回這個元素
  • sort(@array)將@array進行排序,預設排序方法是字母排序。而如果希望數值排序,則可以調用sort({comparator}, @array),並定義數值定序,例如:my @number = sort { $a <=> $b } @unsorted;為進行數值排序,而my @string = sort { $a cmp $b } @unsorted;為進行字母排序
  • exists(@array[index])如果存在元素@array[index]則為true,否則false
  • delete(@array[index])刪除@array中下標為index的元素,注意:如果刪除的不是數組中的最後一個元素,則該被刪除元素位置仍保留(即數組的長度不變),該位置上為一未初始化值的變數。如果刪除的是最後一個元素,則數組的長度將會減1.
第5章:雜湊
  • Perl裡的雜湊指的是雜湊映射,即類似stl::hash_map、java.util.HashMap
  • 雜湊變數聲明、初始化時以%開始,例如:
    • %where = ("Gary" , "Dallas","Lucy" , "Exeter","Ian" , "Reading","Samantha" , "Portland");基於這種寫法可以通過列表初始化雜湊:@array = qw(Gary Dallas Lucy Exeter Ian Reading Samantha Portland);%where = @array;
    • 也可以寫作%where = (Gary => "Dallas",Lucy => "Exeter",Ian => "Reading",Samantha => "Portland");
    • 但在使用時仍然以$開始,例如取值$where{Gary},$where{“Ian”}
  • 通過複製運算可以修改雜湊中儲存的值,也可以添加新值:$where{$key}=$value如果$key已存在,則將$key對應的值更新為$value,否則將$key=>$value對加入雜湊
  • exists()可用於檢查某個鍵在雜湊中是否存在,如果存在為true否則false. 例如:exists $where{Gary}
  • delete()可用於刪除雜湊中的值,例如delete $hash{$key}
  • 將雜湊轉換為列表:按雜湊中的key=>value對逐個列出,即(key1, value1, key2, value2 ...).
    • 通過將雜湊賦值給列表變數,可以將雜湊列表化:my %hash=(....); my @list=%hash;
    • 在print中使用雜湊%hash也會被強轉,因為print接受的是清單類型
  • 將雜湊轉換為標量,將得到一個分數,分子是雜湊表中已經使用的桶,分母是總共桶數my $scalar = %person;print "$scalar\n"; #輸出3/8
  • keys($hash)返回$hash中所有key的列表,values($hash)返回$hash中所有值的列表。注意既然為列表,那麼values($hash)中可能存在重複值
  • 可以用each()函數遍曆雜湊表中所有key=>value對。
my %where = (  Gary => "Dallas",  Lucy => "Exeter",  Ian => "Reading",  Samantha => "Portland");my($k, $v);while (($k, $v) = each %where) {  print "$k lives in $v\n";}

    注意由於($k, $v)的值是拷貝賦值,因此改變$k/$v並不能影響雜湊中的值

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.