$ スカラー変数 @ 配列 $# 配列の最大添字 % 連想配列 & サブルーチンの呼びだし \ リファレンス取り出し <> ファイルハンドラ。コマンドライン引数が与えられていれば それらをファイル名としてファイルを開き順番に処理する。与えられて いなければ標準入力を読む。
- 連想配列のアクセスにおいて、キーは{}でくくる。
- chopで文字列の最後のひと文字を落す
- local関数で、変数を局所化する
- サブルーチンのキーワード sub
- 引数は@_という配列に値渡しではいる
- 型宣言 sub fun($$$) のように引数の型を宣言できる。 $はスカラー型で個数が引数の数に等しい。
- myを使うと(関数)変数を局所化できる。局所化をしないと思わぬところから参照されたり。
- @ARGVがコマンドライン引数。スクリプトファイル名は入らず純粋な引数が0から入る。 ifのような真偽値のコンテキストでは引数の数を表す(argc)
- eval内部で複文を書ける。最後に評価した値を返す。
- ``でプロセスの標準出力を文字列として取得できる。
サンプルプログラム- リストコンテキストとスカラコンテキストで関数の返り値が変わる
my $line = <STDIN> ## 区切り(デフォルトで改行)までよみこみ
my @lines = <STDIN> ## 最後まで読んで、区切りで区切った文字列を 要素とするリストにする- ファイルを指定バイト数読みこむ perlread.pl
- 組み込み関数のマニュアルは man perlfunc
- 配列長は scalar(@array) のようにscalarで得られる。lengthではない
検索
- m//,s///がパターンマッチ演算子。それぞれ検索、置換。
- =~で任意の変数に対しパターンマッチ可能
- perl 5.6.0 ではマッチした位置を @+, @- というリストに保持するようになった。(man perlretut)
- 次に検索する位置はposで設定できる。文字列毎に次にマッチングを開始する位置を 保持している。
例) get_function.pl置換
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はマニュアルの目次のようなものになっている。
-n while(<>) { ... }ループのように実行 -p -nとほぼ同じ。ループの最後にprintする -i[extension] ファイルをバックアップするときの拡張子を指定。
ファイルを置換する場合に使用-P Cのプリプロセッサに通してコンパイル -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で現在処理しているファイル名とその行数をとる方法はないかなぁ。。。。
- hex2dec.pl
とっても簡単- grep(って正規表現くみこまれてんだから簡単じゃん)
- makecard.cgi
QUOTED-PRINTABLEへのエンコード。yyyy/mm/dd:SUMMARY 形式のファイルからvcalendarを生成。- memo2text.pl
QUOTED-PRINTABLEのデコード。vCalendarのSUMMARY部分をデコードしてテキストへ。
使い方例
> cat memo.txt | memo2text.pl | qkc -u
改行コードをLFへ。qkcのオプション-IOは別につけなくてもよいようで。- LWP::Simpleのサンプル
Webページを得る- LWP::Simple::headのさんぷる
更新時刻などの値のみを配列にして返す- 亜紀報の更新をみつめるスクリプト(.cgiとかいいつつ違うけど放置) aki_script.cgi
フォーマットが変わったので改造。デバッグのためにオプションもつけてみました。→ get_akiho.pl 要 Mylib
さらに毎日のようにフォーマットが変わるので正規表現を強化してみました。 super_get_akiho.pl
これを定期的に起動。 ライブラリを含む
さらに、他のモジュールを真似て作ってみたもの 本体,ライブラリ
外部から参照される名前を制限するにはどうするのかな Exporterがそれっぽい- ライブ情報をみつめるスクリプト
一つ前のものもそうであるが、このアプリケーション単体では見るだけ。みつめるには工夫が必要- MIME::QuotedPrintのサンプル
あるものは使う。しかし動作が怪しげである
バージョンをみる mime_version.pl- 自分向けライブラリ2
メールに添付ファイルを付けられるようにした- 簡単なメールコマンド
Getopt::Stdのサンプル- 簡単なメールコマンド(添付ファイルを付けられる)
オプションが複雑。添付ファイルは意外に面倒
ezmail.pl使用例
ezmail.pl -c hello -a memo.vcs -t text/x-vcalendar hoge@address.ne.jp
LWPのマニュアルはLWP,LWP::Simpleなど。lwpcookにサンプルコードが多く出ている。- お気軽かつ便利な使い捨てスクリプト
=~を=にしていたことに気づくのに数分かかる...。(涙) ディレクトリリストは別ルートでとってきて、 cat [file] | ./rpmget.pl を実行すると役にたつかも?- HTML中の画像をアップロードする
``でなくて、素直にsystemでコマンド実行したサンプル。とっても スパゲティ。(古いほう)- mk_index.pl
HTMLのおしながきをつくるためのお手軽スクリプト(使うのに神経必要) (cf. tool.html)- add_link.pl
HTMLのおしながきから飛べるようにa nameをつける。 (cf. Tool.html)- ftpdu.pl
ncftplsとか一般的lsのロングフォーマットの出力をえて、 ファイルサイズを合計する。ただしディレクトリを除く(行頭が-であればカウント することにしている)
使用例
> ncftpls -x "-lR" -f HOGE ftp://XXX.COM | ./ftpdu.pl
TOTAL SIZE: 4742458 byte
ELEMENT : 725- make_greek_table.plとその入力 greek.txt
- お引越し先案内, リネーム
ホームページお引越しに使ったスクリプト- サーバーのクラッシュに備えよう? get_akibbs.pl
またまた、こういうの書きました(汗)- Makefileの依存グラフの描画 プロトタイプ版
drawMakefile.pl, テスト入力testMakefile結果
![]()
上下さかさまが自然ですね。そんなときはグラフに orientation 属性をつけましょ。
graph: { title: "test" orientation: bottom_to_top- RPMたちをダウンロードするが、指定した正規表現にマッチするものは避ける。 Net::FTP を使ってみた。 (正規表現でバージョンの部分は近似的に取り除いている のでうまく取り除けなくて、無駄にダウンロードしたり、しなかったりするかも)
turbo_get2.pl
turbo_get_matched.pl- Lispをターゲットとしてある変数や変数がどの関数から参照されるかを正規表現で 近似して求める。funcgrep.pl
例
funcgrep.pl -w dired-insert-directory dired.el | sed -e 's/^/dired.el:/';- HTML内のリンク先を表示 get_aref.pl
- 新しいページへジャンプするページを作成。 make_guide_to_new_page.pl
- リストをハッシュの要素として登録。正確にはリストへのリファレンス。実は 詳しくしらない。function_range.pl
- ocamlyaccの.outputファイルを描画する drawParserOutput.pl
- ただのサンプルプログラム Getopt::Mixedを使ってみた。長いオプションも扱える
- 部分的にグラフをみてみたい。開発中 ゴミコードいっぱいdrawParserOutputPartial.pl
perlなトピックは ハッシュ、リストのリファレンスぐらい
drawParserOutput2Debug.pl
PODとか書いてみる drawParserOutputPartial2.pl- URLの操作 URI::URL urltest.pl
- cgiによるファイルのアップデート multipart/form-data を観察 file.cgi
- hputにオプションを通してホスト上のディレクトリを指定できるようにしたもの hput2, 引数でとってきたパスをちょっと処理(汗) hput2.pl
getoptのサンプル- URLの操作 again. 絶対パスを作成 url_abs.pl
- たとえば、ファイルを一括ダウンロード get_all_akiho.pl
- 引数でホスト、正規表現を指定。HTTP / anonymous FTP で取得できる。 turbo_get_matched.pl
- メールからアドレスを取り出すけれども出力フォーマットは間違っているらしい(bbdbにしたかったが) get_address.pl
- HTMLを簡単にする。画像や、装飾タグをとる mobile_html.pl
- linux kernel の patch で付け加える部分 (行頭に+) でかつソース部分 (多分+の後はタブ) をみる。 patch_grep.pl
- 暇なときにもうちょっと書こう HTML_graph.pl
- cvs でディレクトリまるごと add したいと、そう思った cvs_add_whole.pl, 参考 CVSの機能をちょっと追加しよう
- 配列の結合は pushでやるんだね push_array.pl
- 配列の頭への要素追加 , でできるのか。 addhead.pl
- 快適なmap map_test.pl
- 自分のだらしなさを思い知った。最新版の Mylibはこちら Mylib.pm
- 日付の基本。perlはじめたときからこんなんばっか書いてる。 date.pl
- gtar cfvz の結果ファイル名に圧縮した日の日付情報を入れる。引数には一つのディレクトリ名を指定する。 (hoge-2003-01-27.tar.gzのように)dtar.pl
- get_akihoのメール送信関数などの定義部分と、それを使う部分を分けてみた。メール送信部分を ライブラリとして使用したかったから getakiho_package.tar.gz
.pm では最後に真偽値のようなものを返すように書く、、のかな?最後の 1; の 行を削除するとそんなようなエラーがでた。- 端末の設定をsttyで行う。エコーを止める whats_stty.pl
- tcupの掲示板を保存 backup_mameshitsu.pl
過去ログファイル (一つ)を指定して現在のBBSとマージする機能をつけた (-m オプション)- HTML::Parser を使ってみた。タグの開き閉じをインデントをつけて表示してみる。 html_parser_test.pl
- html_parser_test.pl をちょっと変更。みたくないタグを取り除く。テキストを表示する。 属性(attribute)を表示するなど。 html_viewer.pl
- MozillaにはXULというXMLでGUIを記述する機構があるらしい。それを使って 階層構造を表示してみた。動作を記述したいなぁ。JavaScriptなの??
html_to_xul.pl / screenshot using phoenix!!- javadocしよう。
みたいなコメントを
public String m_hoge; //ほげさんに変換する lift.pl
/** ほげさん */ public String m_hoge;- これでしばし時間をとられた!! (涙) 便利 vs 汚い。
コンテキストの違い。 結果を $hoge に代入するか @hoge に代入するかに依存しちゃうんだよねぇ。 そして、 @hoge に代入するときにどういうリストが返ってくるかが、関数によってまちまちだったりするんだろう。 きっと。 context.pl- Ocamlファイルのprefixからそのprefixにマッチするソースファイル (ml, mliなど) の ファイル名を出力するプログラム getOcamlSources.pl
と、その使い方- 複数行にわたるマッチについて。正規表現の s, m オプションの違いについて。multiple_lines.pl
- ニュースサイトのタイトルだけとってくる。発見法的。headlines.pl
- CVSで無視したいファイルってこんなもんかな? ignore_list.pl
- メールで受け取った亜紀報 を HTML に変換する。ときどき日付が 全角文字になる日があったけど、それには未対応です。
- cvs の 履歴表示は横に長過ぎるので切ってみよう cut_cvs_history.pl
- 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- HTML::HeadParser を使ってHTMLのタイトルをとってくる get_html_title.pl
- 部分文字列。それだけです。 substr.pl
- リンクを集めてみた make_index_from_link.pl
- ファイルを定期的にチェックしたり、定期的にプロセス起動してその結果を表示してみたり。 display_result.pl
ちらつきが気になる。。。
いろんなコマンドで poling.pl
例
> poling.pl "ncftpbatch -l ; echo ; df -h; ls -hl ~/backup/lib-user-etc-boot.tar.gz"- 7dream.com!! 7dream_test.pl
- migemoを利用して日本語サーチ jgrep
- 他のページに遷移 ステータスコード302 redirect.cgi
- dpkg -l の出力を加工 getlist.pl
- Net::Smtpをマニュアル通りに使ってみた smtp_sample.pl
jcode::convert(\$line,'jis')
リファレンスを渡す。
Jcode.pmというperl5.*用のモジュールもある。なんと、半角全角の変換もできる(z2h,h2z)
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;
perlpod Perlに埋め込むドキュメントデータはPOD形式
Gtk2を使ってみる gtk_hello.pl