2006-01-01から1年間の記事一覧

ファイルハンドルをオープンする

open演算子 open演算子は、OSにプログラムと外界との接続を開くように依頼する。つまり、ファイルハンドルを開き、それを使ってデータの入出力ができるようにする。 open ファイルハンドル, ファイル名open演算子は、成功すれば真、失敗すれば偽を返す。 ope…

Bloglines→はてなRSS

Bloglinesの調子がいまいちなんで、はてなRSSに移行。 http://www.bloglines.com/exportにアクセスして、OPMLをエキスポート。 それをはてなRSSにインポートして、移行完了。 と思ったらグループ分けがされてない。 仕方がないので、手作業で分ける。 たいし…

ファイルハンドルとは

ファイルハンドルとは、現在実行されているPerlプログラムと、入出力の対象となるものとの繋がりに対して、Perlプログラムが付けた名前のこと、と僕なりの解釈したが、少し自信ない。プログラムの外部とデータのやり取りをするための窓口のようなもの、と考…

Mと,でタブの切り替えができることに今更ながら気づいた件

たまたまMキーを押したところ、タブが切り替わった。調べてみると、どうやらmozlessのキーバインドのようだ。 公式サイトを見ればすぐにわかるのに、mozless導入から2週間、今までShift-Tabを使っていたとは、自分の間抜けっぷりに呆れてしまう。 そう思い、…

検索バーを表示していると、Spaceキーでスクロールできない件

ページ内検索バーを表示していると、Spaceキーでスクロールできない。矢印キーやPgUp、PgDn、mozlessのキーバインドも使えなくなる。一応調べてみたが、そういう仕様なのか僕の設定の問題があるのかはわからなかった。 検索バーを閉じれば済む話だけど、Ctrl…

use warningsプラグマ

-wオプションはプログラム全体の警告のOn/Offを切り替えるが、warningsプラグマを使えば、ブロックごとに警告のOn/Offを切り替えることができる。 #!/user/bin/perl use strict; use warnings; # ファイル全体の警告をOn my $str= undef; print "$str\n"; # …

10章練習問題

問1[20] #!/usr/bin/perl -w use strict; my $num = int(1 + rand 100); print "1〜100までの秘密の数字を当ててください : "; while (<STDIN>) { if (/^(exit|quit|\s*)$/i) { print "終了します。\n"; last; } elsif (! /^\d+$/) { print "数字を入力してください</stdin>…

部分評価演算子を使って制御構造を実現する

&&、||、?:は、演算子の両側の式を全て評価するとは限らないので、部分評価演算子と呼ばれている。 ($a > $b) && ($a = $b);左側が真なら、右側が評価される。つまり、($a > $b)が真なら代入が行なわれ、偽なら何もされない。 ifを使って書くと、こうなる。 …

三項演算子 ?:

my $c = ($a < $b) ? $a : $b;($a if-elseを使って書くと、こうなる。 if ($a < $b) { $c = $a; } else { $c = $b; } 三項演算子を使って、多方向分岐もできる。 my $size = ($width < 10) ? "小さい" : ($width < 20) ? "普通" : "大きい"; if-elseを使って…

論理演算子

$a && $b # 両方とも真なら真 $a || $b # どちらかが真なら真$aと$bは必ずしも、両方ともチェックされるわけではない。論理AND演算子(&&)の左側が偽なら、全体が偽であることは確定なので、右側はチェックされない。同様に、論理OR演算子(||)の左側が真…

ループを制御する

Perlには、ループを制御するための演算子が三つある。 last ループの実行を即座に終了 next 次の繰り返しに移動 redo 現在の繰り返しの先頭に戻るループ制御演算子が使えるのは、for、foreach、while、until、裸のブロックの五種類のループ。制御の対象とな…

for制御構造

Perlでは、forループはwhileループの変形らしい。 下の二つは、同じような動作をする。 for (my $i = 0; $i < 10; $i++) { print "$i\n"; }my $i = 0; while ($i < 10) { print "$i\n"; } continue { $i++; }continueブロックに書かれた処理は、次の条件が評…

インクリメントとデクリメント

++(インクリメント演算子)は、スカラー変数に1を加える。 --(デクリメント演算子)は、スカラー変数の値を1つ減らす。 ++と--を変数の前に置くか後ろに置くかで、動作が異なる。 #!/usr/bin/perl -w use strict; my $a = 5; my $b = 5; print ++$a, "\n";…

裸のブロック制御構造

裸のブロックとは、キーワードも条件も付いていないブロックのこと。これを使うことで、レキシカル変数のスコープを限定できる。 #!/usr/bin/perl -w use strict; my $n = "外です。"; { my($n, $root); # このブロックの中だけで有効 print "数字を入力して…

式修飾子

式の後ろの、その式を制御する修飾子を置くことができる。例えば、if修飾子はif制御構造と似た働きをする。 下の2行は等価。 #!/usr/bin/perl -w use strict; my $n = -10; print "\$nは負の数です。\n" if $n < 0; if ($n < 0) { print "\$nは負の数です。\…

until制御構造

until制御構造は、条件式が偽である間、処理を繰り返す。 下の2行は等価。 until ($n < $s) { $s++ }; while (! ($n < $s) ) { $s++ };

unless制御構造

unless制御構造は、条件式が偽の場合に限って、処理を行なう。 下の2行は等価。 unless ($hoge =~ /^\d$/) { print "数字ちゃいます。\n" } if ( ! ($hoge =~ /^$d$/) ) { print "数字ちゃいます。\n"} unlessにもelse節を持たせることができる。けど、やや…

9章練習問題

問1[3] /($what){3}/OK 問2[7] #!/usr/bin/perl -w use strict; @ARGV = "/usr/lib/perl5/5.8/pods/perlfunc.pod"; while (<>) { if (/^=item\s+([a-zA-Z_]\w+)/) { print "$1\n"; } }\w+ではなくて、\w*、うっかりミス。 問3[5] #!/usr/bin/perl -w use str…

join関数

join 結合文字列, リストjoin関数は、リストの要素を結合文字列で貼り合わせて、出来上がった文字列を返す。 join ":", qw/ a b c d e /; # "a:b:c:d:e"

split演算子/

split /パターン/, 文字列, LIMITsplit演算子は、パターンにマッチするものを区切り文字として、文字列を分割し、そのリストを返す。 split /:/, "a:b:c:d:e"; # ("a", b", "c", "d", "e") LIMITに0以上の数を指定した場合、最大その数までのフィールドに分…

s///を使って置換を行なう

s/パターン/置き換え文字列/s///演算子は、パターンにマッチするものを置き換え文字列で置き換える。また、s///演算子は置換演算子ともいう。 #!/usr/bin/perl -w use strict; my $string = "There are 37 books.\n"; $string =~ s/\d+/xxx/; print $string;…

注目エントリーの閾値

sbm

はてブの注目エントリーの閾値を、3と5以外にできないものかと思っていたら、単純にURLのthresholdの値を変えればいいことに、今更ながら気づいた。

マッチ変数

正規表現の外で正規表現メモリを参照するには、マッチ変数を使う。マッチ変数は$1のように、$と数字を組み合わせて表す。 #!/usr/bin/perl -w use strict; my $line = "There are 678 trees.; if ($line =~ /(\D*)(\d+)(\D*)/) { print "$1<$2>$3\n"; }There…

m//を使ってマッチを行なう

パターンマッチを行なうには、m//演算子を使う。 m/hoge/ m[hoge] m(hoge) m#hoge# m!hoge!と、好きなデリミタでパターンを挟むことができる。ただし、デリミタにスラッシュを使った場合だけ、先頭のmを省略できる。 オプション修飾子 オプション修飾子を指…

正規表現の優先順位

優先順位とは、ターンのどの部分が最も強く結びつくのかを示すもの。 1. カッコ 2. 量指定子 3. アンカーと文字の並び 4. 選択肢(|)dogかdogsだけを含む行にマッチさせるパターンは/^dogs?$/ dogかcatだけを含む行にマッチさせたるパターンは、/^(dog|cat)…

後方参照

パターンをカッコで囲むと、マッチした部分が正規表現メモリに記憶される。後方参照を使うと、正規表現メモリに保存した値を参照することができる。後方参照は、逆スラッシュと数字を組み合わせて表す。 /([a-zA-Z])\1/ # happy、lookなどにマッチ カッコが…

アンカー

アンカーとは、パターンの位置を指定するもの。 ^(キャレットアンカー)は、文字列の先頭を表す。 $(ドル記号アンカー)は、文字列の末尾を表す。 /^hoge/ # 文字列の先頭にあるhoge /hoge$/ # 文字列の末尾にあるhoge パターンを^と$で挟むと、そのパター…

汎用の量指定子

*、+、?以外の繰り返し回数を指定した場合は、繰り返しの最小回数と最大回数を{ }(ブレース)で囲んで指定する。コンマを残して最大回数を省略すると、マッチする回数の上限がなくなる。最大回数とコンマを省略すると、その回数にだけマッチする。 /\d{3,8}…

文字クラス

文字クラスとは、[ ](ブラケット)の間に文字を並べたもの。その中の文字のどれか一つにだけマッチする。また、ハイフンを使って文字の範囲を指定することもできる。 [abcdefg] # abcdefgのどれか一文字にマッチ [a-zA-Z] # アルファベットのどれか一文字に…

選択肢

|(縦棒)は、その左側か右側のどちらかにマッチ。/(is|are)/は、isかareのどちらかを含む文字列にマッチする。/h(o|u)+ge/は、hoooge、huuge、houuogeなどにマッチする。hとgeの間を同じ文字だけにしたい場合は、/h(o+|u+)ge/とする。これだと、houuageには…