perl

sprintfとhex

まずsprintfがprintと同じものかと誤解していた。 そうじゃなくてフォーマットした文字列を返してくれるのね。 16進数⇔10進数変換はこんな感じ。 print hex '1f', "\n"; print sprintf "%x", 31, "n";

each, keys, values

eachはリストコンテキストではkeyとvalueのセットを1つずつ取り出す。スカラーコンテキストではkeyのみ。 keysはすべてのkeyのリストを、valuesはすべてのvalueのリストを返す。 use strict; my %hash = ('key1' => 1, 'key2' => 2, 'key3' => 3); while ((m…

delete

配列およびハッシュの要素を削除する。 配列の場合、長さは変わらず空要素になる。つまりundefしたのと同じ。 use strict; my %hash = (key1=>"value1", key2=>"value2", key3=>"value3"); delete($hash{key1}); if (exists($hash{key1})) { print "ここは出…

undef, defined, exists

perlにおける未定義値はundef。これはmy $var;と同値である。 変数の値が定義されているかは、defined関数で調べる。 hashのキーが定義されているかはexists関数。 use strict; my $var; my $foo = undef; print "\$var eq \$foo is TRUE\n" if ($var eq $fo…

undef

my $hoge; print "\$hoge is undef\n" if ($hoge eq undef); print "\$hoge is undef\n" if ($hoge == undef);

ハッシュ化

パスワードを平文で保存しては危ないのでハッシュ化するのだけれど、少々調べてみた。 まずcrypt関数。マシン依存でDES暗号かMD5ハッシュになるのだそう。 print crypt("hoge", "1234567"); 12.aCGsm0z7ngが戻ってきたので、使っているのはDESの模様。 そも…

配列

いまさら感はあるが、知らないことがあったので書いてみる。 まずスライス。 my @list = (0..9); print @list[3..5]; #$list[3], $list[4], $list[5]を要素に持つ print @list; #@listはそのまま 続いてsplice(スプライス) こちらは配列要素を切り取る。第…

デバッグ

perl -d script.pl 最低限以下だけ覚えておけば使えそうな気がする。後はhelp&使いながら覚える戦法。 h #ヘルプ s #ステップ実行 l #次の行表示 b #ブレークポイント設定 d #ブレークポイント解除 V PKG VARS #パッケージ変数 y #レキシカル変数 T #スタッ…

pack/unpack

理解できていなかったので、色々やってみる(scriptの文字コードはEUC) まずはpack。 print pack('CC', 97, 0x61), "\n"; print pack('C2', 97, 0x61), "\n"; print pack('B16', '0110000101100001'), "\n"; print pack('H4', 6161), "\n" 実行結果。 aa aa…

文字、バイト、正規表現

理解があいまいなので、試しに色々書いてみる。 まずはeuc-jpでスクリプトを書いてみる。 my $str = "漢"; print ".は文字にマッチする\n" if ($str =~ /^.{1}$/); print ".はバイトにマッチする\n" if ($str =~ /^.{2}$/); 「.はバイトにマッチする」が出力…

tie変数

tie変数は普通の変数のように見えて実はオブジェクトな変数。スカラーのtie変数の書き方 (ほとんどプログラミングPerl丸うつし) use strict; package Person; sub TIESCALAR { bless (\my $name, shift); } sub STORE { ${$_[0]} = $_[1]; } sub FETCH { $…

サブルーチン

引数を指定しないと、暗黙に@_が渡される。 かつ引数は参照渡しになる。 my @list = qw(1 2 3 4 5); test(@list); sub test { &print_args; &change_args; &print_args; } sub print_args { print "@_\n"; } sub change_args { @_ = qw(6 7 8 9 0); } 実行結…

オブジェクト

オブジェクト指向なモジュールの書き方を勉強したけど、忘れてた。 プログラミングPerlのコードをちょこっと変えたものを書いてみる。 モジュール package Person; use strict; #引数を受け取るコンストラクタ sub new { my $invocant = shift; my $self = b…

定数のつくりかた

use strict; *PI = \3.141592; print $main::PI,"\n"; #上書きしようとするとエラー => 定数! #our $PI = 1234; #print $PI,"\n";

シンボルテーブルと型グロブ

なんとなくは理解していたけど、さらに理解を深めるためにコードを書いてみる。 use strict; our $foo = "This is foo."; sub foo { print $foo, "\n"; } our $bar = "This is bar."; sub bar { print $bar, "\n"; } print "1.----\n"; #型グロブ *hoge = *f…

シンボリックリファレンス

人に説明できるほど知らなかったので調べてみた。 プログラミングPerl P304から引用。 ハードリファレンス以外の値をデリファレンスしようと試みると、何が起こるだろうか?その場合には、値はシンボリックリファレンス(symbolic reference)として扱われる。…

ワンライナー

datファイルを1行ずつ出力 perl -e 'print $_ while (<>)' dat datファイルのうち、Kotaroにマッチする行を出力 perl -n -e 'print "$_\n" if m/Kotaro/' dat datファイルを置換して出力 perl -p -e 'print s/Kotaro/Taro/' dat numファイル中にある数字表…

Encode

よく理解していなかったので、覚えたことを書いておく。 エンコード変換 入力されるファイルはutf-8で、Linuxの文字コードはeuc-jp前提。 use strict; use Encode; open (my $fh, "<$ARGV[0]"); while(<$fh>) { chomp; Encode::from_to($_, "utf-8", "euc-jp…

正規表現

先読み 先を読む=現在位置よりも前を覗き込み。 正規表現的には幅0の文字、つまり位置にマッチ。 (?=some_regex) #肯定先読み (?!some_regex) #否定先読み 後読み 後から読む=現在位置よりも前を覗き込み。 正規表現的には幅0の文字、つまり位置にマッチ。…

Benchmark

使い方 http://search.cpan.org/~dapm/perl-5.10.1/lib/Benchmark.pm 読み方 http://iandeth.dyndns.org/mt/ian/archives/000588.html が参考になった。いじょ。

local宣言

よくわかっていないので、コードを書いてみる。 use strict; use warnings; our $var = 1; sub func() { $var = 2; print "in func: $var\n"; } func(); print "out of func: $var\n"; 実行結果 in func: 2 out of func: 2 use strict; use warnings; our $v…

tr///演算子

これもあまり理解していないので、使い込んでみる。まずは、Programming Perlに載っているサンプルを my $str = "ABCDEFG"; $str =~ tr/A-Z/a-z/; print $str."\n"; 実行結果 nopqrst 曰く、A-Zは正規表現ではなくて文字集合だと。 ということは。。。 my $s…

Web::Scraperを読みながら

Web::Scraperのソースを題材にして、perlで知らなかったことをメモしていく。 Web::Scraperのサンプルコード http://e8y.net/mag/013-web-scraper/ を参考に、ちょっと改変 use Web::Scraper; use URI; # 価格部分を yen という名前で取るスクレイパーを作成…

おもしろそうなモジュール発見vol.1

http://perl-mongers.org/2008/09/perl-kuronekoyamato.html 仕事をしていると、荷物を宅配便で送る業務っていうのがあるんですけれども、宅配便業者さんに引き渡した後、ちゃんと届いたか確認したいってことありますよね。というわけで、今回はPerlでクロネ…

.pmのパス

たまに このモジュールどこにインストールされてるっけなぁ? と思うのだが、コマンドがすぐに思いつかない。 (しょせんアマグラマーなので)ということでメモ。 モジュールの検索パスをリスト perl -e 'for (@INC){print "$_\n"}' モジュールがインストー…

File::FindとHTML::Parser

File::FindとHTML::Parserを使ってみた。備忘のためのメモを。 File::Find 指定ディレクトリ配下を再帰的に探索して、発見したらコールバック関数を呼ぶ。 といったところ。 use File::Find; find(\&findFile, "/home/hoge"); sub findFile{ my $path; #ディ…

MobaSiFをインストール

あしかけ2週間、ようやくインストールできた。 はぅぅ。FastCgiWrapperとsuEXECにはまりまくった。 以下参考にしたサイトをメモ。■MobaSiF http://www.webbozu.com/?p=15 http://d.hatena.ne.jp/mobiledeveloper/20080622/1214121178 http://www.omnibase.ne…

ファイルIO

超基本だけど、たまに忘れるので。 use IO::File; my $fh = IO::File->new('./foo.txt','r') or die "cannot create file handle: $!"; my $line = $fh->getline; $fh->close; http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2FIO%3A%3AFile%…

正規表現

知らなかったことをメモ(恥ずかしい、、、、) 変換演算子 tr/// #小文字にする $str =~ tr/A-Z/a-z/; デフォルト変数は$_ マッチ演算子、置換演算子、変換演算子は通常入力として $_ が使用される。 パターン結合演算子「=~」は$_以外を対象とする時に使う…

Fast CGIの基礎

perlで使えるモジュール CGI::FastとFCGIの2つがある。 CGI::FastはCGI.pmによって作成されるCGIオブジェクトのサブクラスなので、CGI関連のモジュールを使いたいのであれば、CGI::Fastを使うのがよいと思われる。FCGIについては以下が参考になる。 http://f…