發新話題

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

6.13 進入目錄中
Perl 具內建進入目錄的函式 chdir,用法如下:
引用:
chdir("/路徑/目錄名稱");

chdir;

# 若不加目錄名稱,則會進入個人自家目錄(Home Directory)中。

用例:

chdir("testdir") || die "$!";

TOP

6.14 標準輸入/輸出
輸出

Perl 輸出的方法,主要有三個:print、sprintf 及 printf。

sprintf,printf 和 C 語言中的 sprintf、printf 沒有太大的差別。

先來看 print:
引用:
print "Hello Perl!!!!\n";

和以下是一樣的。

print STDOUT "Hello Perl!!!!\n";
STDOUT 代表標準輸出,通常是螢幕,但我們可以視情況轉向到其它設備或檔案。其中,STDOUT 可以省略不寫。

輸出至檔案:
引用:
#! /usr/bin/perl

open(W, "> test.log") || die "$!\n";

# 針對檔案代碼 W 做寫入動作,即可存入 test.log 中
print W "Hello Perl!!!!\n";

close(W);
sprintf:格式化字串
引用:
# 以下會傳回一個格式化的字串,以 0 開頭,接著至多 8 個數字。

chomp($number=<STDIN>);

$result = sprintf("%08d", $number);

print $result, "\n\n";
上式中,%d 代表整數

若您想進一步瞭解 sprintf 還有那些格式化的代碼,請參考:訪客無法瀏覽此圖片或連結,請先 註冊登入會員

printf 是可格式化的輸出,用法和 C 中的 printf 一樣:
引用:
#! /usr/bin/perl

printf("我的姓名是:%s 我的代表號是: %d\n", "王大空", 5005);
上式中,%s 代表字串,%d 代表整數,因此,"王大空", 5005 會先分別被代入 %s 和 %d 中,再顯示出來。
引用:
結果:

我的姓名是:王大空 我的代表號是: 5005
若您想進一步瞭解 printf 還有那些格式化的代碼,請參考:訪客無法瀏覽此圖片或連結,請先 註冊登入會員

TOP

6.15 STDIN
標準輸入 <STDIN> 我們之前已經接觸過了,它可以由標準輸入設備(通常是鍵盤)取得資料。如下所示:
引用:
$yourans=<STDIN>;

上式,$yourans 包含:使用者輸入的一列資料,以及一個換行符號 \n 。

通常我們會將此一換行符號去掉:

方法有二種:

$yourans=<STDIN>;
chomp $yourans;

或者:

chomp ($yourans=<STDIN>);

TOP

6.16 角符: <>
角符 <> 和 <STDIN> 最大的不同是 <STDIN> 是由標準輸入取得資料,但:角符 <> 可以由指定的檔案取得資料,而該檔案檔名可以放在命令列中加以指定。如下例:
引用:
#! /usr/bin/perl

while (<>) {
        print;
}

# 上式存成 readfile.pl,執行法:

./readfile.pl index.html

即可將 index.html 這個檔案讀進來,並且顯示每一列的內容。

若 ./readfile 沒有任何檔案,則改由標準輸入來取得資料,此時,就和 &lt;STDIN&gt; 作用相同了。
注意:上式中 print; 其作用對像為預設變數 $_,其實它和以下的作用相同:

#! /usr/bin/perl

while (my $line=<>) {
        print $line;
}

TOP

6.17 萬用檔名展開
Perl 具 glob 的功能,可根據某一檔名樣式,找出符合樣式的檔案。
引用:
#! /usr/bin/perl

while (glob "*.html") {
        chmod 0644, $_;
}
上式同於:
引用:
#! /usr/bin/perl

while (<*.html>) {
        chmod 0644, $_;
}

TOP

6.18 命令列引數
在上面的例子中,index.html 為一命令列引數,readfile.pl 會對它進行處理。以下說明如何取得命令列引數:

命令列引數會形成一個陣列:@ARGV,比如:test.pl A B C 1 34 56,其中 A B C 1 34 56 組成 @ARGV 陣列

以下這個程式可以把所有命令列引數顯示出來。
引用:
#! /usr/bin/perl

foreach (@ARGV) {

        print "引數 ===> $_\n";
}

$num=$#ARGV + 1;

print "\n程式名稱為:$0\n";
print "\n共有 $num 個引數\n";

# 執行:test.pl A B C 1 34 56 秀出:

引數 ===> A
引數 ===> B
引數 ===> C
引數 ===> D
引數 ===> 12
引數 ===> 43

程式名稱為:test.pl

共有 6 個引數
再來看一個例子:
引用:
#! /usr/bin/perl

$i=0;
foreach (@ARGV) {
        $j=$i+1;
        print "第 $j 個引數 ===> $ARGV[$i]\n";
        $i++;
}

# 執行:test.pl A B C 1 34 56 秀出:

第 1 個引數 ===> A
第 2 個引數 ===> B
第 3 個引數 ===> C
第 4 個引數 ===> 1
第 5 個引數 ===> 34
第 6 個引數 ===> 56
程式本身的檔名為:$0 。而命令列中的第一個引數為 $ARGV[0],第二個引數為 $ARGV[1],其餘依此類推。

TOP

7. 副程式
我們經常把若干程式碼集合在一起,以完成特定的功能,並且予以命名,俾供重覆叫用。像這樣的區塊,我們稱為副程式或函式。

7.1 副程式的寫法
引用:
sub 副程式名稱 {

        程式區塊;

}

例:身份證字號檢查副程式

sub check_pslno {

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

        # 取得身份證字號
        $pno = $_[0];
       
        # 分別取得十個字元
        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];

        ($checkno % 10) ? 0 : 1;

}
叫用上述副程式的方法:
引用:
# 傳入一個身份證字號,並用 $rt 接取傳回值
$rt = check_pslno("R121212121");

TOP

7.2 引數:傳入值
引用:
@_ 為傳入值所形成的陣列。

$_[0] 是第一個引數,$_[1] 是第二個引數,其餘依此類推。

用例:

sub max {
        my ($a, $b) = @_; # 取得傳入的二個引數

        ($a > $b) ? $a : $b; # 傳回較大值
}
其中 my 使 $a 及 $b 變成區域變數,一旦副程式結束,區域變數也就消失,不會影響主程式中同名的變數。

TOP

7.3 叫用副程式
引用:
方法 1:

        $rt = max(20, 30);

方法 2:

        $rt = &max(20, 30);
用例:
引用:
#! /usr/bin/perl

print "請輸入第一個數:";
chomp($x=<STDIN>);

print "請輸入第二個數:";
chomp($y=<STDIN>);

$max_num_is = max($x, $y);

print "$x 和 $y 中,較大者為: $max_num_is\n\n";


sub max {
        my ($a, $b) = @_; # 取得傳入的二個引數

        ($a > $b) ? $a : $b; # 傳回較大值
}
註:副程式可以放在程式中的任何一個位置。

TOP

7.4 傳回值
如果副程式的運算結果需要傳回,可以使用 return 將結果傳回給叫用者去接收:
引用:
例如:

$max_num_is = max($x, $y);  # 這支程式叫用了 max 副程式,並用 $max_num_is 來接收傳回值。
但如果副程式中沒有明顯使用 return,則 Perl 將以最後一條敘述的執行結果,做為副程式的傳回值。
引用:
例如:

sub max {
        my ($a, $b) = @_; # 取得傳入的二個引數

        ($a > $b) ? $a : $b; # 傳回較大值
}

# 最後一個敘述的結果是較大的數,因為沒有 return 這個關鍵字,所以用該數傳回。
上式,其實等同於以下這個副程式:
引用:
sub max {
        my ($a, $b) = @_; # 取得傳入的二個引數

        my $max_num=($a > $b) ? $a : $b; # 傳回較大值

        return $max_num;
}
不過,這樣比較麻煩一點,多了一道步驟,但好處時,易於理解。

TOP

發新話題

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