顯示具有 Perl 標籤的文章。 顯示所有文章
顯示具有 Perl 標籤的文章。 顯示所有文章

27 9月 2007

[Perl] 用正規表示法做出trim的功能

trim的功能就是去掉前後多餘的空白

$var = " abc_ def_ ";
$var =~ s/^(s)+//; # 去前面空白
$var =~ s/(s)+$//; # 去後面空白
#$var結果="abc_ def_"

[Perl] 做出2維陣列

Perl有@var的1維Array
這是大家所熟悉的
至於要如何做出2維的Array呢?

在Perl裡面
如果@var是1維
那麼@@var就是2維!? 錯了!大錯特錯.... 我一開始就是這麼想的...Embarassed


其實Perl的2維陣列 是透過reference(參照)所產生出來的
ex:
my @one_dim = split(/ /, "a b c d e");
my @two_dim = (); # 此時的@two_dim還是1維的
$two_dim[0] = @one_dim; # @即是Reference, 此時的@two_dim就變2維的了!
for(my $i=0 ; $i<5 ; $i++ ){
print $two_dim[0][$i];
}

不過,這種方法有幾個缺點

缺點一:
就是,這種方法是利用「Reference」!
所以$two_dim[0]是參考了@one_dim的東西
而不是整個複製過來
因此,如果@one_dim的東西改變了
$two_dim[0]的東西(實際上也就是@one_dim的東西)也就跟著改變了!!!

缺點二:無法用foreach取得$two_dim[0]的個數
foreach( $two_dim[0] ){...}
這樣就變得很麻煩了...
如果當@two_dim有很多個element時
每一個element都需要一個1維的變數在儲存才行
而且這每一個element的名稱都要不一樣...這樣就會有砂鍋大的問題了!!!

[Perl] swap()

sub swap{
( $_[0], $_[1] ) = ( $_[1], $_[0] );
}


my $a = 100;
my $b = 200;

swap($a, $b);

print $a . ", " . $b . "n";

#結果會是200, 100

[Perl] Sub function傳入兩個以上的Array的問題...

sub FUNC{
foreach(@_){
print "$_n";
}
}
my @zzz1 = split(/ /,"ab1 cd1 ef1");
my @zzz2 = split(/ /,"ab2 cd2 ef2");

FUNC(@zzz1, @zzz2);

原本Perl的sub function傳入多個參數是允許的
但是它會自動將傳入的參數存成@_的Array
所以若傳入兩個Array當參數
則在Sub FUNC中會將這兩個Array視為一個Array...
這樣就會產生問題了...

上面的程式碼就是將@zzz1,@zzz2兩個Array傳入sub FUNC
而sub FUNC會將這兩個Array存至@_中, 視為同一個Array

[Perl] local的用法

原本local的用法
是為了怕變數被sub function更改到 才有這個用法的
因為perl原本都不用宣告就能使用參數了
所以若是
sub Test
{
$abc = 0;
}
$abc = 100;
Test();
print $abc;
#印出來的值會是0
#因為 sub function中,使用了$abc在之前就宣告了, 所以程式會拿之前宣告的$abc的memory來使用
# 所以呼叫Test()後 值就變了

因此,若是不希望sub function會改到全域(呼叫它的也可能是sub function)原有的變數
就必須在sub function裡的變數 加上local這個關鍵字
sub Test
{
local $abc = 0;
}
$abc = 100;
Test();
print $abc;
#印出來的值會是100


另外一點就是...若程式使用了
use strict
就不能使用local了
因為上面這種情形就不會出現了...凡事要用的變數都要宣告
就不會分不清楚是「區域變數」還是「全域變數」了

[Perl] 精要整理

正規表示式m// 比對
s/// 取代(只取代一次)

加在字尾部分 ex: m/falldog/ig
/s 跨行比對
/g 全域取代
/i 忽略大小寫

字符集...
d 數字(digital),代表[0-9]
w 單字(word),代表[A-Za-z0-9_]
s 空白(space)
f 跳頁(form-feed)
t 跳格(tab)
n 換行(new-line)
r 回行首(carriage return)
....w* => 0個以上的單字
....w+ => 1個以上的單字