網頁

2011年1月4日 星期二

Perl – 字串操作

Perl最強項的能力就在於字串的處理能力,不管是比對、擷取或是核心的regular expression(RE),透過這些處理能讓字串變成非常有用的資訊。


常用的字串操作(可透過 http://perldoc.perl.org/ 來查詢perl function 的使用方式)
length 取得指定字串長度
標準語法:
length EXPR

my $str = “hello”;
print length($str);    # 長度5

控制字元也是有佔長度的
my $str = “hello\n”;
print length($str);    # 長度6

index 取得子字串在主字串第一次出現的位置(找不到傳回-1)
標準語法:
index STR,SUBSTR,POSITION
index STR,SUBSTR

my $mains = “hello world”;
my $subs = “world”;
print index($mains, $subs);     # 印出6

需注意的一點 index 永遠只傳回第一次找到的子字串位置
my $mains = “well, well, well”;
my $subs = “well”;
print index($mains, $subs);     # 印出0

那要如何找出第二個 well 位置,這時就要利用POSITION 來處理,預設值為0
my $mains = “well, well, well”;
my $subs = “well”;
my $first = index($main, $subs);
print index($mains, $subs, $first+1);      # 找到第二個

那要如何找到最後一個子字串出現的位置,用迴圈一直找下去,….
Perl 提供了另一個 rindex function

rindex 取得子字串從主字串最後面往回找的第一個位置
標準語法:
rindex STR,SUBSTR,POSITION
rindex STR,SUBSTR

my $mains = “well, well, well”;
my $subs = “well”;
print rindex($mains, $subs);    # 印出12

substr 取出字串中的某字串
標準語法:
substr EXPR,OFFSET,LENGTH,REPLACEMENT
substr EXPR,OFFSET,LENGTH
substr EXPR,OFFSET

my $str = “Misunderstood”;
print substr($str, 3);         # 印出 understood

沒傳入長度參數,perl會自動取出到字串最後。

my $s = "The black cat climbed the green tree";
my $color        = substr $s, 4, 5;      # black
my $middle     = substr $s, 4, -11;   # black cat climbed the
my $end          = substr $s, 14;        # climbed the green tree
my $tail           = substr $s, -4;         # tree
my $z              = substr $s, -4, 2;     # tr

由標準語法可以看出,substr也可以用在字串取代上,以下各種方法雖然不一樣,但目的是相同的。
my $str = "Love is only rule";
substr($str, 0, 4, "True");         # True is only rule
substr($str, 0, 4) = "Good";     # Good is only rule
$str =~ s/Good/Love/;             # Love is only rule

uc 轉換成大寫
標準語法:
uc EXPR

my $str = “good”;
print uc $str;    # GOOD

ucfirst 首字母轉成大寫

lc 轉換成小寫
標準語法:
lc EXPR

my $str = “GOOD”;
print lc $str;     # good

lcfirst 首字母轉換成小寫

sprintf 格式化字串輸出
標準語法:
sprintf FORMAT,LIST

# Format number with up to 8 leading zeroes
$result = sprintf("%08d", $number);

各式各樣的表示:
%% 百分比符號
%c 字元
%s 字串
%d 包含正負號的十進位整數
%u 不包含正負號的十進位整數
%o 不包含正負號的八進位整數
%x 不包含正負號的十六進位整數
%e 以科學符號表示的浮點數
%f 固定長度的十進位浮點數
%g %e %f 表示的浮點數

%X 以大寫表示的%x
%E %e一樣,但以大寫顯示"E"符號
%G %g一樣,但以大寫顯示"E"符號
%b binary
%B %b一樣,但以大寫顯示"B"符號(5.8.0版試不出來)
%p a pointer (outputs the Perl value's address in hexadecimal)
%n special: *stores* the number of characters output so far into the next variable in the parameter list

%i %d
%D %ld
%U %lu
%O %lo
%F %f

format parameter index 這是perl 提供一個很不一樣的功能,讓你能直接明確指出要輸出的順序,例如2$
printf '%2$d %1$d', 12, 34;                    # 印出 "34 12"
printf '%3$d %d %1$d %d', 1, 2, 3;       # 印出 "3 1 1 2"
printf '%2$d %d %d', 1, 2, 3;                 # 印出來的是 “2 1 2”

需注意的地方,當你指明順序後,下一個輸出為你指定的位置後下一個未使用的值。

flag
space       prefix non-negative number with a space
+              prefix non-negative number with a plus sign
-               left-justify within the field
0              use zeros, not spaces, to right-justify
#              ensure the leading "0" for any octal,
prefix non-zero hexadecimal with "0x" or "0X",
prefix non-zero binary with "0b" or "0B"

printf '<% d>', 12; # prints "< 12>"
printf '<%+d>', 12; # prints "<+12>"
printf '<%6s>', 12; # prints "< 12>"
printf '<%-6s>', 12; # prints "<12 >"
printf '<%06s>', 12; # prints "<000012>"
printf '<%#o>', 12; # prints "<014>"
printf '<%#x>', 12; # prints "<0xc>"
printf '<%#X>', 12; # prints "<0XC>"
printf '<%#b>', 12; # prints "<0b1100>"

flag +space同時出現時

printf '<%+ d>', 12; # prints "<+12>"
printf '<% +d>', 12; # prints "<+12>"

實際上的輸出顯示並不是和perldoc上說的一樣,實際結果如下:
< 12>
<+12>

#. Padding zero
printf '<%#.10d>', 12; # 印出 "<0000000012>"


chomp 移除字串尾端的換行字元
標準語法:
chomp VARIABLE
chomp(LIST)

$a = <STDIN>;       # 從鍵盤(即標準輸入裝置,STDIN)取得一列文字輸入 chomp($a);                # 刪除此輸入字串尾端的換行符號

chop 移除字串的最後一個字元和回傳此字元
標準語法:
chop VARIABLE
chop(LIST)

$str = “0123456789”;
print chop($str);      # return 9
print $str;                 # return 012345678

reverse 字串反轉
標準語法:
reverse LIST

$str = “0123456789”;
print reverse($str);   # return 9876543210


沒有留言:

張貼留言