To Home
Last modified: Wed Mar 25 08:06:18 JST 2009

perl

雑多なメモ

$スカラー変数
@配列
$#配列の最大添字
%連想配列
&サブルーチンの呼びだし
\リファレンス取り出し
<>ファイルハンドラ。コマンドライン引数が与えられていれば それらをファイル名としてファイルを開き順番に処理する。与えられて いなければ標準入力を読む。

パターンマッチ

検索
i大文字小文字の区別無し
gグローバルマッチ
oパターンのコンパイルを1度だけ行う
s文字列を単一行として扱う
置換
e置換後の文字列を式として評価する

ファイル入出力

read([FILEHANDLER],[DATA],[LENGTH])
   LENGTHは読み込んだ長さにセットされるらしい。
$data = <STDIN>
   ファイルハンドラから一行読み込み。
print <INPUTFILE>
   ファイルハンドラ全体を書きだし。
open([FILEHANDLER],[FILENAME_WITH_MODE])
   ファイル名の文字列の前にモードを示す文字列をつける。
< 読み込み(default)
> 書き込み
+> 読み込みと書き込み(新規)
+< 読み込みと書き込み(更新)
>> 追加書き込み

デバッガ

-dオプションをつけてperlを起動するとデバッガ上でスクリプトを実行できる。
hヘルプを表示(とっても長い)
n次の文を実行(関数呼び出しは一文として扱う)
b [line]ブレークポイントをつける

コマンドラインオプション

このへんのマニュアルはman perlではなくて、man perlrunでみられる。 man perlはマニュアルの目次のようなものになっている。
-nwhile(<>) { ... }ループのように実行
-p-nとほぼ同じ。ループの最後にprintする
-i[extension]ファイルをバックアップするときの拡張子を指定。
ファイルを置換する場合に使用
-PCのプリプロセッサに通してコンパイル
-e 'command'commandを実行し終了する


  perl -ne 'm/<img src="(.+?)"/gi && print "$1\n";' *.html
画像ファイル名の取得。
  perl -pe 's/speak/sendstring/g' -i.bak *.sh
ファイルの文字列置換。バックアップを .bak というsuffixつきのファイルに保存。
  perl -pe 's/public class (Mobile[^ ]+) {/public class $1Benchmark {/' -i.back *.java
Javaのクラス名の変更。後ろにBenchmarkとつける。超アドホック。前提多い。
  grep -n "a href" *.html | perl -ne 'm/^([^:]+:[^:]+:).*a href="([^"]*upp\.so-net\.ne\.jp[^"]*)".*$/ && print "$1$2\n"'
upp.so-net.ne.jpを含むリンクを出力。ファイル名、行番号つき。
一行 Perlで現在処理しているファイル名とその行数をとる方法はないかなぁ。。。。

簡単なアプリケーション

  動作保証一切なし。
  1. hex2dec.pl
      とっても簡単
  2. grep(って正規表現くみこまれてんだから簡単じゃん)
  3. makecard.cgi
      QUOTED-PRINTABLEへのエンコード。yyyy/mm/dd:SUMMARY 形式のファイルからvcalendarを生成。
  4. memo2text.pl
      QUOTED-PRINTABLEのデコード。vCalendarのSUMMARY部分をデコードしてテキストへ。
      使い方例
        > cat memo.txt | memo2text.pl | qkc -u
        改行コードをLFへ。qkcのオプション-IOは別につけなくてもよいようで。
  5. LWP::Simpleのサンプル
      Webページを得る
  6. LWP::Simple::headのさんぷる
      更新時刻などの値のみを配列にして返す
  7. 亜紀報の更新をみつめるスクリプト(.cgiとかいいつつ違うけど放置) aki_script.cgi
      フォーマットが変わったので改造。デバッグのためにオプションもつけてみました。→ get_akiho.plMylib
      さらに毎日のようにフォーマットが変わるので正規表現を強化してみました。 super_get_akiho.pl
      これを定期的に起動。 ライブラリを含む
      さらに、他のモジュールを真似て作ってみたもの 本体,ライブラリ
        外部から参照される名前を制限するにはどうするのかな Exporterがそれっぽい
  8. ライブ情報をみつめるスクリプト
      一つ前のものもそうであるが、このアプリケーション単体では見るだけ。みつめるには工夫が必要
  9. MIME::QuotedPrintのサンプル
      あるものは使う。しかし動作が怪しげである
      バージョンをみる mime_version.pl
  10. 自分向けライブラリ2
      メールに添付ファイルを付けられるようにした
  11. 簡単なメールコマンド
      Getopt::Stdのサンプル
  12. 簡単なメールコマンド(添付ファイルを付けられる)
      オプションが複雑。添付ファイルは意外に面倒
    ezmail.pl使用例
    ezmail.pl -c hello -a memo.vcs -t text/x-vcalendar hoge@address.ne.jp
    LWPのマニュアルはLWP,LWP::Simpleなど。lwpcookにサンプルコードが多く出ている。
  13. お気軽かつ便利な使い捨てスクリプト
      =~を=にしていたことに気づくのに数分かかる...。(涙) ディレクトリリストは別ルートでとってきて、 cat [file] | ./rpmget.pl を実行すると役にたつかも?
  14. HTML中の画像をアップロードする
      ``でなくて、素直にsystemでコマンド実行したサンプル。とっても スパゲティ。(古いほう)
  15. mk_index.pl
      HTMLのおしながきをつくるためのお手軽スクリプト(使うのに神経必要) (cf. tool.html)
  16. add_link.pl
      HTMLのおしながきから飛べるようにa nameをつける。 (cf. Tool.html)
  17. ftpdu.pl
      ncftplsとか一般的lsのロングフォーマットの出力をえて、 ファイルサイズを合計する。ただしディレクトリを除く(行頭が-であればカウント することにしている)
    使用例
      > ncftpls -x "-lR" -f HOGE ftp://XXX.COM | ./ftpdu.pl
      TOTAL SIZE: 4742458 byte
      ELEMENT : 725
  18. make_greek_table.plとその入力 greek.txt
  19. お引越し先案内, リネーム
      ホームページお引越しに使ったスクリプト
  20. サーバーのクラッシュに備えよう? get_akibbs.pl
      またまた、こういうの書きました(汗)
  21. Makefileの依存グラフの描画 プロトタイプ版
    drawMakefile.pl, テスト入力testMakefile

    結果
    draw Makefile

    上下さかさまが自然ですね。そんなときはグラフに orientation 属性をつけましょ。
    graph: { title: "test"
      orientation: bottom_to_top
    

  22. RPMたちをダウンロードするが、指定した正規表現にマッチするものは避ける。 Net::FTP を使ってみた。 (正規表現でバージョンの部分は近似的に取り除いている のでうまく取り除けなくて、無駄にダウンロードしたり、しなかったりするかも)
      turbo_get2.pl
      turbo_get_matched.pl
  23. Lispをターゲットとしてある変数や変数がどの関数から参照されるかを正規表現で 近似して求める。funcgrep.pl

      funcgrep.pl -w dired-insert-directory dired.el | sed -e 's/^/dired.el:/';
  24. HTML内のリンク先を表示 get_aref.pl
  25. 新しいページへジャンプするページを作成。 make_guide_to_new_page.pl
  26. リストをハッシュの要素として登録。正確にはリストへのリファレンス。実は 詳しくしらない。function_range.pl
  27. ocamlyaccの.outputファイルを描画する drawParserOutput.pl
  28. ただのサンプルプログラム Getopt::Mixedを使ってみた。長いオプションも扱える
  29. 部分的にグラフをみてみたい。開発中 ゴミコードいっぱいdrawParserOutputPartial.pl
    perlなトピックは ハッシュ、リストのリファレンスぐらい
    drawParserOutput2Debug.pl
    PODとか書いてみる drawParserOutputPartial2.pl
  30. URLの操作 URI::URL urltest.pl
  31. cgiによるファイルのアップデート multipart/form-data を観察 file.cgi
  32. hputにオプションを通してホスト上のディレクトリを指定できるようにしたもの hput2, 引数でとってきたパスをちょっと処理(汗) hput2.pl
      getoptのサンプル
  33. URLの操作 again. 絶対パスを作成 url_abs.pl
  34. たとえば、ファイルを一括ダウンロード get_all_akiho.pl
  35. 引数でホスト、正規表現を指定。HTTP / anonymous FTP で取得できる。 turbo_get_matched.pl
  36. メールからアドレスを取り出すけれども出力フォーマットは間違っているらしい(bbdbにしたかったが) get_address.pl
  37. HTMLを簡単にする。画像や、装飾タグをとる mobile_html.pl
  38. linux kernel の patch で付け加える部分 (行頭に+) でかつソース部分 (多分+の後はタブ) をみる。 patch_grep.pl
  39. 暇なときにもうちょっと書こう HTML_graph.pl
  40. cvs でディレクトリまるごと add したいと、そう思った cvs_add_whole.pl, 参考 CVSの機能をちょっと追加しよう
  41. 配列の結合は pushでやるんだね push_array.pl
  42. 配列の頭への要素追加 , でできるのか。 addhead.pl
  43. 快適なmap map_test.pl
  44. 自分のだらしなさを思い知った。最新版の Mylibはこちら Mylib.pm
  45. 日付の基本。perlはじめたときからこんなんばっか書いてる。 date.pl
  46. gtar cfvz の結果ファイル名に圧縮した日の日付情報を入れる。引数には一つのディレクトリ名を指定する。 (hoge-2003-01-27.tar.gzのように)dtar.pl
  47. get_akihoのメール送信関数などの定義部分と、それを使う部分を分けてみた。メール送信部分を ライブラリとして使用したかったから getakiho_package.tar.gz
      .pm では最後に真偽値のようなものを返すように書く、、のかな?最後の 1; の 行を削除するとそんなようなエラーがでた。
  48. 端末の設定をsttyで行う。エコーを止める whats_stty.pl
  49. tcupの掲示板を保存 backup_mameshitsu.pl
      過去ログファイル (一つ)を指定して現在のBBSとマージする機能をつけた (-m オプション)
  50. HTML::Parser を使ってみた。タグの開き閉じをインデントをつけて表示してみる。 html_parser_test.pl
  51. html_parser_test.pl をちょっと変更。みたくないタグを取り除く。テキストを表示する。 属性(attribute)を表示するなど。 html_viewer.pl
  52. MozillaにはXULというXMLでGUIを記述する機構があるらしい。それを使って 階層構造を表示してみた。動作を記述したいなぁ。JavaScriptなの??
      html_to_xul.pl / screenshot using phoenix!!
  53. javadocしよう。
    public String m_hoge; //ほげさん
    
    みたいなコメントを
    /** ほげさん */
    public String m_hoge;
    
    に変換する lift.pl
  54. これでしばし時間をとられた!! (涙) 便利 vs 汚い。
      コンテキストの違い。 結果を $hoge に代入するか @hoge に代入するかに依存しちゃうんだよねぇ。 そして、 @hoge に代入するときにどういうリストが返ってくるかが、関数によってまちまちだったりするんだろう。 きっと。 context.pl
  55. Ocamlファイルのprefixからそのprefixにマッチするソースファイル (ml, mliなど) の ファイル名を出力するプログラム getOcamlSources.pl
      と、その使い方
  56. 複数行にわたるマッチについて。正規表現の s, m オプションの違いについて。multiple_lines.pl
  57. ニュースサイトのタイトルだけとってくる。発見法的。headlines.pl
  58. CVSで無視したいファイルってこんなもんかな? ignore_list.pl
  59. メールで受け取った亜紀報 を HTML に変換する。ときどき日付が 全角文字になる日があったけど、それには未対応です。
  60. cvs の 履歴表示は横に長過ぎるので切ってみよう cut_cvs_history.pl
  61. cvs history -a ってやるとユーザー名でソートされてから時刻でソートされるけど、時刻のソートをみたいんだ!! sort_cvs_history_by_date.pl
      使用例)
        > cvs history -x M | cut_cvs_history.pl -n | sort_by_date.pl | less
    面倒なので二つを一つの perl スクリプトにしてみました。 cvs_history_filter.pl
  62. HTML::HeadParser を使ってHTMLのタイトルをとってくる get_html_title.pl
  63. 部分文字列。それだけです。 substr.pl
  64. リンクを集めてみた make_index_from_link.pl
  65. ファイルを定期的にチェックしたり、定期的にプロセス起動してその結果を表示してみたり。 display_result.pl
      ちらつきが気になる。。。
      いろんなコマンドで poling.pl
     
        > poling.pl "ncftpbatch -l ; echo ; df -h; ls -hl ~/backup/lib-user-etc-boot.tar.gz"
  66. 7dream.com!! 7dream_test.pl
  67. migemoを利用して日本語サーチ jgrep
  68. 他のページに遷移 ステータスコード302 redirect.cgi
  69. dpkg -l の出力を加工 getlist.pl
  70. Net::Smtpをマニュアル通りに使ってみた smtp_sample.pl

jcode (in perl5.*)

jcode::convert(\$line,'jis')
リファレンスを渡す。
Jcode.pmというperl5.*用のモジュールもある。なんと、半角全角の変換もできる(z2h,h2z)

HTML::TreeBuilder etc...

HTMLを処理したいと思ったら man HTML::Tree::Scanning を読む。

treeを作成

my $content = get("http://www.google.co.jp");
my $tree = HTML::TreeBuilder->new;
$tree->parse($content);

textに変換

$tree->as_text;

parse_html.pl

リンク

メモ

perlpod Perlに埋め込むドキュメントデータはPOD形式
Gtk2を使ってみる gtk_hello.pl

参考書、リンク


作者: 増山隆 address
To Home
Valid HTML 4.01!