發新話題

網路管理語言 Perl 入門與實作

4.3.4 keys
取出雜湊的鍵,傳回一個陣列
引用:
#! /usr/bin/perl

%A=("m", 1, "n", 5, "g", 2, "p", 9);

@keys = keys %A;

print '雜湊 %A 的鍵有: ';
foreach (@keys) {
        print "$_ ";
}

# 註: $_ 是預設變數,代表每一個取出的鍵

上式,其實等同於:

foreach $item (@keys) {
        print "$item ";
}
可以寫的更簡潔一點:
引用:
#! /usr/bin/perl

%A=("m", 1, "n", 5, "g", 2, "p", 9);

print '雜湊 %A 的鍵有: ';

foreach (keys %A) {
        print "$_ ";
}

# 輸出:雜湊 %A 的鍵有: p n g m

TOP

4.3.5 values
取出雜湊的值,傳回一個陣列
引用:
#! /usr/bin/perl

%A=("m", 1, "n", 5, "g", 2, "p", 9);

print '雜湊 %A 的值有: ';

foreach (values %A) {
        print "$_ ";
}

# 輸出:雜湊 %A 的值有: 9 5 2 1

TOP

4.3.6 each
取出雜湊的鍵/值對,傳回一個串列
引用:
#! /usr/bin/perl

%A=("m", 1, "n", 5, "g", 2, "p", 9);

print '雜湊 %A 的鍵=>值配對為:', "\n";

while (($key, $value)=each %A) {
        print "$key ====> $value\n";
}

# 輸出:

雜湊 %A 的鍵=>值配對為:
p ====> 9
n ====> 5
g ====> 2
m ====> 1

TOP

4.3.7 exists
判斷某鍵是否存在?
引用:
#! /usr/bin/perl

%A=("m", 1, "n", 5, "g", 2, "p", 9);

if (exists $A{g}) {
        print '%A 中有鍵 g', "\n";

}

# 輸出:%A 中有鍵 g

# 再看以下例子:

#! /usr/bin/perl

print '請問你要查 %A 的那一個鍵?';
chomp($key=<STDIN>);

%A=("m", 1, "n", 5, "g", 2, "p", 9);

if (exists $A{$key}) {
        print '%A 中有鍵 ', $key , "\n";
} else {
        print "$key 這個鍵不存在!" , "\n";
}

# 輸出結果:
請問你要查 %A 的那一個鍵?n
%A 中有鍵 n

請問你要查 %A 的那一個鍵?k
k 這個鍵不存在!

TOP

4.3.8 delete
將某一對鍵/值刪除
引用:
#! /usr/bin/perl

%A=("m", 1, "n", 5, "g", 2, "p", 9);

delete $A{p};

# 顯示 %A 剩下的鍵值
foreach $k (keys %A) {
        print "$k ===> $A{$k}\n";
}

# 輸出:
n ===> 5
g ===> 2
m ===> 1
若您又要新增一對鍵/值放 %A 中要怎麼做呢?很簡單! 用動態產生即可,比如:$A{k}="OhSolaMiLo"; 如下所示:
引用:
#! /usr/bin/perl

%A=("m", 1, "n", 5, "g", 2, "p", 9);

delete $A{p};

$A{k}="OhSolaMiLo";

# 顯示 %A 剩下的鍵值
foreach $k (keys %A) {
        print "$k ===> $A{$k}\n";
}

# 輸出結果:
n ===> 5
k ===> OhSolaMiLo
g ===> 2
m ===> 1
若能善用上述功能,那麼雜湊可以幫您完成非常多重要的功能喔!

TOP

4.4 特殊符號
Perl 定義許多特殊的符號,常用的有:
引用:
ARGV 命令列數陣列名 (用法:@ARGV)
STDIN 標準輸入
STDOUT 標準輸出
STDERR 標準錯誤

__DATA__ 程式編譯至此,以下為資料,可用 DATA 檔案代碼讀取
__END__ 標示程式結束
__FILE__ 程式檔名
__LINE__ 目前列數
__PACKAGE__ 目前套件名稱

@ARGV 命令列引數陣列
%INC 已由 do/requrie 引入的檔案
%ENV 環境變數
%SIG 系統信號

$_ 預設變數
$! 錯誤訊息內容
$$ Perl script 執行時的行程代碼(PID)
$0 Perl script 程式本身的檔名
這裡有更詳細的說明,請參考:perlvar.html

TOP

4.5 變數的範圍
若沒有特別宣告,您使用的變數為一全域變數,這並不是很好的習慣,有時這容易造成不良的影響,使程式變得不易偵錯。因此之故,Perl 提供一 my 的關鍵字,可讓您將某一變數變成區域變數,該區域變數的作用範圍限制在某一區塊中,如下例:
引用:
$a = "foo";
if ($some_condition) {
    my $b = "bar";      # my 宣告 $b 為區域變數,只在 { } 才有效,只要離開區塊,$b 內容自動消失。
    print $a;           # 印出 "foo"
    print $b;           # 印出 "bar"
}
print $a;               # 印出 "foo"
print $b;               # 沒有顯示任何東西; 因為 $b 已經離開 { } 區塊範圍了,此 $b 並非區塊中的 $b。
通常,我們在程式一開始,會宣告 use strict; 搭配 my 來使用,表示我們將使用嚴格的變數檢查。這樣做的好處之一是,避免不小心打錯變數名稱,將來有利於程式偵錯。比如:
引用:
#! /usr/bin/perl

use strict; # 表示:變數使用前,需先 my 宣告一下才行

my $name = "foo";
if (some_condition) {
    my $base = "bar";   
    print $name;
    print $base;
}

print $mame;   # 打錯字了,應該是 $mame,由於 $mame 這個變數沒有事先用 my 宣告,
所以程式執行時會發生錯誤,您便可藉此得知:原來是變數 $mame 打錯了,應該是 $name 才對。
除了 my 之外,另有一 local 作用類似,但意義不同。由於初學者不易弄懂 local 和 my 的差別,因此暫不說明 local 的用法。

TOP

4.6 引號整理
Perl 的引號寫法多種:括號均可任意換成其它符號。
引用:
1. 單引號:q

$target = q[This is what you have];

同於

$target = 'This is what you have';


2. 雙引號:qq

$target = qq[This is what you have];

同於

$target = "This is what you have";


3. 執行符:qx

$run = qx[ls -la];

同於

$run = `ls -la`;


4. 串列:qw

@str = qw( ABC EDF XYZ 123 );

同於

@str = ("ABC", "EDF", "XYZ", "123");

同於

@str = split(/ /, q/ABC EDF XYZ 123/);


5. 正規表示式:qr

foreach $pattern (@patterns) {
        $reg = qr/$pattern/;
        foreach $line (@lines) {
                print "$line 符合" if ($line =~ /$reg/);
        }

}

TOP

4.7 使用預設值
Perl 經常使用預設值的觀念,來設定變數的初始值,作法如下:
引用:
# 若 $ARGV[0] 為空,則 $target 的初始值為 "10.0.0.1"
$target = $ARGV[0] || "10.0.0.1";
注意! 雖然 or 和 || 都是邏輯上的 OR,但二者的運算優先順序不同,or 太低了,or 比 = 還低 (詳見 4.1.3),因此,以下式子不同於上式:
引用:
$target = $ARGV[0] or "10.0.0.1";

同於:

($target = $ARGV[0]) or "10.0.0.1";

因此,$target 永遠不會被指定為 "10.0.0.1"

TOP

4.8 範例
身份證檢查程式
引用:
#! /usr/bin/perl

# Copyright 2003 by OLS3 (ols3@訪客無法瀏覽此圖片或連結,請先 註冊登入會員
# 檢查身份證號碼的合法性

# 取得身份證字號
chomp($pno = <STDIN>);
       
# 分別取得十個字元
for ($i=1;$i<=10;$i++) {
        $D[$i]=substr($pno,$i-1,1);
}

# 將第一個字元, 轉成大寫
$firstno=uc($D[1]);

# 每一個英文字母都有其代碼
%FNO=(
"A", 10, "B", 11, "C", 12, "D", 13, "E", 14, "F", 15, "G", 16, "H", 17,
"I", 34, "J", 18, "K", 19, "L", 20, "M", 21, "N", 22, "O", 35, "P", 23,
"Q", 24, "R", 25, "S", 26, "T", 27, "U", 28, "V", 29, "W", 32, "X", 30,
"Y", 31, "Z", 33
);

# $x2= 個位數字
$x2=$FNO{$firstno} % 10;

# $x1= 十位數字
$x1=($FNO{$firstno} - $x2) / 10;

$checkno=$x1 + 9*$x2 + 8*$D[2] + 7*$D[3] + 6*$D[4] + 5*$D[5]
             + 4*$D[6] + 3*$D[7] + 2*$D[8] + $D[9] + $D[10];

if ($checkno % 10)        {
        print "身份證字號 $pno 不正確!\n";
} else {
        print "身份證字號 $pno 正確!\n";
}
上面的範例僅供參考,沒有考慮效率,只作為檢查流程說明之用。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。