Smart -Web Magazine

WEB開発者に嬉しいステキ講座

MENU

Headline

2011年9月20日
by リズムファクトリー
0 comments

send SOCKET, MSG, FLAGS, [TO]

SOCKETにMSGを送ります。FLAGSには、同名のシステムコールと同じフラグを指定します。接続していないソケットには、送信先TOを指定しなければならず、この場合、Cのsendtoを実行します。送信した文字数か、エラー時には、未定義値を返します。

このエントリーをはてなブックマークに追加

2011年9月20日
by リズムファクトリー
0 comments

semop KEY,OPSTRING

シグナルを送信や、待ち合わせなどのセマフォ操作を行なうために、System V IPC関数semopを呼び出します。

OPSTRINGは、semop構造体のpackされた配列でなければなりません。semop構造体は、それぞれ、pack("sss", $semnum, $semop, $semflag)のように作ることができます。セマフォ操作の数は、OPSTRINGの長さからわかります。成功時には真を、エラー時には偽を返します。 

semopの使い方

$semop = pack("sss", $semnum, -1, 0);
die "Semaphore trouble: $!\n" unless semop($semid, $semop);

上記は、セマフォ ID$semidのセマフォ$semnumで待ち合わせを行ないます。セマフォにシグナルを送るには、"-1"を "1" に変更してください。

このエントリーをはてなブックマークに追加

2011年9月20日
by リズムファクトリー
0 comments

semctl ID, SEMNUM, CMD, ARG

System V IPC関数semctlを呼び出します。CMDが、&IPC_STATか&GETALLのときには、ARGは、返されるsemid_ds構造体か、セマフォ値の配列を納める変数でなければなりません。ioctl と同じように、エラー時には未定義値、ゼロのときは"0 but true"、それ以外なら、その値そのものを返します。

このエントリーをはてなブックマークに追加

2011年9月20日
by リズムファクトリー
0 comments

select RBITS, WBITS, EBITS, TIMEOUT

指定したファイル記述子のうち、どれが入出力操作が可能になっているのか、またはどれが例外状態にあるかを調べるものです。selectシステムコールを実行します。

ファイル記述子については用語集「ファイル記述子」を参照してください。

ビットマスクは、filenovecを使って、次のようにして作成することができます。

$rin = $win = $ein = '';
vec($rin,fileno(STDIN),1) = 1;
vec($win,fileno(STDOUT),1) = 1;
$ein = $rin | $win; 

複数のファイルハンドルにselectを行ないたいのであれば、次のようなサブルーチンを書くとよいでしょう。

sub fhbits {
	local(@fhlist) = split(' ',$_[0]);
	local($bits);
	for (@fhlist) {
		vec($bits,fileno($_),1) = 1;
	}
	$bits;
}
$rin = &fhbits('STDIN TTY SOCK'); 

通常は、次のように使います。

($nfound,$timeleft) = select($rout=$rin, $wout=$win, $eout=$ein, $timeout);

いずれかの準備が整うまでブロックするには、次のようにします。

$nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef);

どのビットマスクにもundefを設定することができます。TIMEOUTを指定するときは、秒数で指定し、少数でかまいません。

250 ミリ秒のsleepと同じ効果が、次のようにして得られます。

select(undef, undef, undef, 0.25);
このエントリーをはてなブックマークに追加

2011年9月20日
by リズムファクトリー
0 comments

seekdir DIRHANDLE,POS

DIRHANDLEでのreaddirを行う位置を第2引数POSに設定します。POSは、telldirが返す値でなければなりません。同名のシステムライブラリルーティンと同じく、ディレクトリ縮小時の問題が考えられます。

このエントリーをはてなブックマークに追加

2011年9月20日
by リズムファクトリー
0 comments

seek FILEHANDLE, OFFSET, WHENCE

seekを使えば、ファイルの任意のレコードにアクセスできます。この関数は、FILEHANDLEOFFSET位置にファイルポインタをセットします。成功すると 1、失敗すると 0 を返します。

FILEHANDLE
FILEHANDLE は、ファイルハンドル名またはファイルハンドルオブジェクトへのリファレンスになるような式でもかまいません。
OFFSET
OFFSET はバイト単位で位置を指定します。
WHENCE
WHENCE によって、OFFSET がファイルのどこを基点とするかを指定します。WHENCE の値が、0 ならば、ファイルポインタを OFFSET の位置へ、1 ならば、現在位置から OFFSET 離れた位置へ、2 ならば、EOF から OFFSET だけ離れた位置へ、ファイルポインタを設定します。

WHENCE

WHENCE 意味
0 ファイルの先頭
1 現在の位置
2 ファイルの末尾

seekの使い方

open (FH, $log);
# ファイルの末尾に移動
seek(FH, 2, 0); 

他のプロセスによって長さが増えるようなファイルに追随

for ( ;; ){
while ( <LOG> ){
...
}
sleep 15;
seek LOG, 0, 1;
}

プロセスについては用語集「プロセス」を参照してください。

このエントリーをはてなブックマークに追加

2011年9月20日
by リズムファクトリー
0 comments

s/PATTERN/REPLACE/egimosx

検索文字PATTERNを使ってパターンを検索し、もし見つかれば、置換文字REPLACEで置き換え、置換した数を返します。見つからなければ、"偽"を返します。
=~演算子などによって文字列が指定されていなければ、$_が使われます。

スラッシュ( / )の区切り文字以外にも、英数字、空白ではない任意の文字が使えます。シングルクォート( ` )を使うと置換文字列での展開はされません。バッククォートを使うと、置換文字列をコマンドとして実行して、その出力が実際の置換文字列に使われます。PATTERNをカッコ類で括った場合には、REPLACE用にもう一組の区切り文字を用意します。

sの使い方

# スラッシュ( / )以外の区切り文字を使う
$path =~ s|/usr/bin|/usr/local/bin|;

# カッコ類も可
$path =~ s(/usr/bin)(/usr/local/bin);

PATTERNREPLACEの文字列に変数を含めると、文字列として展開されます。

$num = '[0-9]+';
$str = "test 1 2 3";
$str =~ s/$num//gxo;
print $str, "\n";
> test

s/// 演算子の応用

gオプションを使って繰り返し置換

s/<[^>]+>/ /g;

置換した値を他の変数に代入

$str = "if you aint runnin game.\n";
($str2 = $str) =~ s/aint/are not/;
print $str, $str2;
> if you aint runnin game.
> if you are not runnin game.

マッチしたパターンの順番を入れ替える

$str = "back Looking";
$str =~ s/([^ ]*) *([^ ]*)/$2 $1/; # 最初の 2 語の入れ替え
print $str, "\n";s
> Looking back

s/// 演算子用のオプション

オプション 意味
e 式の右側の評価を行なう
ee 式の右側の評価を行い、実行後の返却値を再度評価する
g 繰り返し置換
i 大文字、小文字を区別しないで検索
m 文字列を複数行として扱う
o パターンのコンパイルを 1 度だけにする
s ワイルドカードのドット( . )が改行にもマッチするようにする
x 拡張正規表現を使用する

e オプション-REPLACE を式として評価

e オプションは置換文字列を式として解釈し、evalします。

s/\d+/sprintf("%02d",$&)/e; # マッチした文字列を sprintf で整形

s/^=(\w+)/&func($1)/e; # サブルーチン呼び出しを使う

その他のオプションについては m// 演算子を参照してください。

このエントリーをはてなブックマークに追加

2011年9月20日
by リズムファクトリー
0 comments

rmdir FILENAME

FILENAMEで指定したディレクトリが空であれば、そのディレクトリを削除します。

成功時には 1 を返します。失敗時には 0 を返し、$!を設定します。

rmdirの使い方

# /hotm/httpd/html/test ディレクトリの削除
rmdir "/hotm/httpd/html/test" or die "Can't remove dir $!\n"; 
このエントリーをはてなブックマークに追加

Jump to the top