一語中的


關於 perl 命令列上的各種 options, 例如 -a 是什麼意思, 請參考 perlrun(1)

例: 印出系統中每位使用者自己提供的公開資訊: perl -F: -nae 'printf "%-8s | $F[4]\n", $F[0]' /etc/passwd 這裡的 -a 及 -F: 是指: 對讀進來的每一列, 以 : 為欄位分隔符號, 進行自動拆解, 彷彿自動加了一句: @F = split /:/;

例: 想比對的字串, 在一列上出現多次, 可以全部抓出來, 而不要只抓每列的第一個符合字串嗎? 例如想將一個網頁 abc.html 內所有網址全部抓出來: perl -ne 'print join("\n",@x),"\n" if (@x=m#href="(.*?)"#g)' abc.html 因為比對 (m#...#) 的時候, 後面加上 g, 且傳回值存入陣列, 所以會把一列上所有合乎條件的字串, 逐個放入陣列當中。 印出來的時候, 用換列字元把陣列中的字串接起來, 每個網址單獨印在一列, 看起來比較整齊, 也比較方便後續處理。

例: 一次設定許多帳號的密碼perl -ne 'chomp; print "$_:", join("",reverse split //), "\n"' names | chpasswd 不過這個例子不好... 這種密碼不安全。

例: Debian 套件管理: 誰佔了多少空間?perl -000 -ne 'printf "%6d $1\n",$2 if /^Package:\s*(.*?)\n.*?^Status:[^\n]*\sinstalled\n.*?^Installed-Size:\s*(\d+)/ms' /var/lib/dpkg/status | sort -n > by-size.txt

status 的內容長得像 這樣

其實有指令可以直接查: dpkg-query -W -f '${Installed-Size;6} ${Package}\n' 詳見 dpkg-query 手冊

例: 「課表 ==> 課表」 HTML entity 轉換

有時候某些軟體產生的 html 檔案, 裡面的中文用 html entity 表示, 例如 「課表」 這兩個字變成 「課表」。 如何將它轉換成普通文字編輯器 (例如 vim 或 nano) 可以編輯的檔案呢? 請把上面兩個 html entity 剪貼到一個文字檔, 叫做 sched.html 好了。 perl -pe 's/\&#(\d+);/chr($1)/eg' sched.html | u8tob5 > sched-big5.html 轉完之後記得進去把編碼 (charset 欄位) 從 utf-8 改成 big5。

其他類似文章:

  1. Unix Review > Perl Is a Gem: One-Liners and Programs

Perl 語言

  1. 新手上路
  2. 基本要素
  3. 餵資料
  4. 常用句型
  5. regexp
  6. 詳談變數
  7. 一語中的
  8. 副程式
  9. 模組
  10. 外界對話

附錄

  1. 參考資料
  2. scripting
  3. Windows
  4. 圖形介面
  5. big-5 碼