kuwa0224kuwa @ ウィキ
http://w.atwiki.jp/kuwa0224kuwa/
kuwa0224kuwa @ ウィキ
ja
2012-01-24T14:58:40+09:00
1327384720
-
perl/memo
https://w.atwiki.jp/kuwa0224kuwa/pages/37.html
*Memo
**ダブルクォートの中で関数呼び出し
この2行は同じ意味。
でも上のほうがパフォーマンスいいらしい。
31 print $en->getAfter(),"\n";
32 print "@{[$en->getAfter()]}\n";
2012-01-24T14:58:40+09:00
1327384720
-
perl/pkg
https://w.atwiki.jp/kuwa0224kuwa/pages/36.html
* パッケージとモジュール
パッケージとモジュールの扱い方について。
** パッケージ
パッケージは、Javaでいうクラスに近いかも。
オブジェクトという意味で近いのではなく、変数のスコープとして近い。
1つの変数利用可能なスコープと考えていいかも。
今までは main パッケージを暗黙的に使っていた。
パッケージの定義の仕方
package hoge;
次のパッケージが出てくるまでは、hogeパッケージの範囲となる。
パッケージの使い方
require "pkg1.pl";
これでpkg1.pl をまず読み込む。
&pkg1::fun(); # pkg1のfun()を呼び出し。
$pkg1::name; # pkg1の$nameを呼び出し。
パッケージ名を付けないと、mainパッケージから呼ぶことになる。
** モジュール
モジュールは、Javaで言うところのライブラリ。
モジュールの利用のしかた。
use Hoge;
モジュール名は基本大文字スタート。
use は読み込み時にコンパイルが行われる。
require は実行時にコンパイルが行われる。
use Hoge qw/fun1 fun2/;
とすると、Hogeの中のfun1 と fun2 しか読み込まれない。
モジュールの作り方。
拡張子は.pm。
package Hoge;
use Exporter;
@ISA = (Exporter);
@EXPORT = qw(fun1);
sub fun1 {
# 処理
}
ファイル名はこのパッケージ名にあわせよう。
@EXPORT のところを、@EXPORT_OK にしたら、明示的にuse しない限りつかえない。
@EXPORT_FAIL にしたら、読み込めない。
環境によって、切り替えるなどで使う。
2011-07-31T18:41:30+09:00
1312105290
-
perl/sub
https://w.atwiki.jp/kuwa0224kuwa/pages/35.html
* サブルーチンについて
** 呼び出し方
do hoge;
&hoge;
hoge();
前方宣言も可能。
sub hoge;
これをやっとくと、何もつけないでサブルーチンを呼ぶことも可能。
hoge;
存在しないサブルーチンが呼び出されると、エラー出る。
定義されているかチェックするときは、 &italic(){defined} が使える。
返り値は、最後に評価した値か、returnで指定した値となる。
** 引数
@_ の中に引数で指定した値の配列が入っている。
中身を見るときは、$_[0], $_[1] みたいな感じ。
@_の変更についてだが、配列自体の変更については呼び出し元に影響はない。
ただ、配列の値を変更すると呼び出し元にも影響が出る。
影響が出ないようにするには、サブルーチンが変数を渡されたら、local変数にいれる。
&hoge("foo", "bar");
sub hoge{
local ($foo, $bar) = @_;
}
local のスコープは、そのサブルーチンから呼ばれたサブルーチンでも適用となるので注意。
本当にもうそこだけにしたいときは、my を使う。
逆に配列自体に影響を与えたい場合は、エイリアス指定で投げる。
**AUTOLOAD
これを使えば、定義していないサブルーチンを使ったときにこれが呼ばれる。
このサブルーチン内で使う、$AUTOLOADにはパッケージ名::呼び出したサブルーチン名が含まれている。
**BEGINとEND
BEGINはそのサブルーチン内で一番最初に評価される処理。
ENDはそのサブルーチン内で一番最後に評価される処理。
ENDはdie後でも評価される。
**subs
サブルーチンの前方宣言がらくちんに。
use subs ('fun1', 'fun2');
2011-07-31T17:58:32+09:00
1312102712
-
perl/testfile
https://w.atwiki.jp/kuwa0224kuwa/pages/34.html
* ファイルに対するテスト
shellと若干かぶってるやも。
|-r $file| 読み込み可能なファイルならtrue|
|-w $file| 書き込み可能なファイルならtrue|
|-x $file| 実行可能なファイルならtrue|
|-o $file| ownerが自分のファイルならtrue|
|-e $file| 存在するファイルならtrue|
|-z $file| 空ファイルならtrue|
|-s $file| 空ではないファイルならtrue。サイズを返す|
|-f $file| 普通のファイルならtrue|
|-d $file| ディレクトリファイルならtrue|
|-l $file| シムリンクならtrue|
|-T $file| テキストファイルならtrue|
|-B $file| バイナリファイルならtrue|
2011-07-25T23:50:07+09:00
1311605407
-
perl/arg
https://w.atwiki.jp/kuwa0224kuwa/pages/33.html
*実行時の引数
**ARGV
実行時の引数は、@ARGV配列に入る。
$ARGV[0]には、普通に最初の引数が入る。スクリプト名は入らない。
$0の中にスクリプト名が入ってる。
./sapmle,pl a b c
####
print $ARGV[0]; # print a
print $0; # print sample.pl
$#ARGV は配列の大きさかと思いきや、一番最後のインデックスが入る。
つまり配列の大きさは $#ARGV + 1 で表す。
./sapmle,pl a b c
####
print $#ARGV + 1; # print 3
<ARGV>とすると、各引数をファイルとして扱う。<>も同じ意味になる。
$ARGVには今扱っているファイルの名前が入る。
./sapmle,pl a.txt b.txt c.txt
####
while(<>) {
print; # print lines of files
print $ARGV; # print current using filename
}
2011-07-25T23:22:27+09:00
1311603747
-
perl/fileh
https://w.atwiki.jp/kuwa0224kuwa/pages/32.html
*ファイルハンドラの扱い
**オープン
ファイルのオープンにはopenを使う。
open(HANDLE,filename)
open(HANDLE)
open HANDLE
基本の型は一番上。ファイル名を指定しつつ、そのハンドラをHANDLEで指定する。
filenameを指定しなかった場合、HANDLEのスカラー値がファイル名として使われる。
ファイルを開くときに失敗する可能性があるので、例外対応するのがふつう。
open(HANDLE, "./file.txt") || die "Can't open: $!\n";
$!にはエラーMsgが入る。
open の後には;はいらないみたい。
出力内容ファイルに書き込む時のオープンはこんな感じ。
open(HANDLE, "> $file") || die "Can't open: $!\n";
print HANDLE "test\n";
このtestは$file のファイルに出力される。printのところにHANDLE設定してるからね。
これ設定しないと、デフォルト(STDOUT)のまま。
open 時に > を入れてるところがポイント。closeすれば、この状態から解き放たれる。
追記したい場合は、>> にする。
|も使える。これをするとつまり、ハンドラに与えられたものを echo して、パイプ後の処理をするイメージ。
open(HANDLE, "| wc -l") || die "Can't open: $!\n";
print HANDLE "one\ntwo\nthree\n";
これをすると3とでるよ。printの2引数が3行だからね。
コマンド| という形だったら、コマンドの実行結果がハンドラに渡される。
コマンド| の形は、コマンドの結果を1行1行処理したいときによく使うぽいぞ。
open (PROC, ps -aux | ) || die "Error: $!\n";
while ($line = <PROC>) {
print "$line" if $line =~ /^tomcat/;
}
***select
selectで明示的にデフォルトファイルハンドラが指定できる。
またこの処理の
2011-07-25T23:42:57+09:00
1311604977
-
perl/regex
https://w.atwiki.jp/kuwa0224kuwa/pages/31.html
*正規表現
**m演算子
mからはじまるマッチング。検索パターンの指定に使う。
m/regex/[修飾子]
mの修飾子の種類
|i|大文字と小文字を区別しない|
|m|文字列を複数行として扱う。(^と$が改行ごとにマッチする)|
|o|パターンのコンパイルを一度しか行わない|
|s|文字列を単一行として扱う。(^と$が最初と最後にしかマッチしない)|
|x|拡張正規表現をつかう。(空白を無視するようになる。エスケープと[ ]以外)|
|g|すべてのマッチを行う。配列でとればマッチしたものがとれ、スカラでとれば、true or falseがとれる|
mの後をスラッシュ/以外にすれば、それがデリミタとなります。
逆にデリミタを変えないのであれば、mはいらない。
**s演算子
sからはじまるマッチング。置換処理に使う。
これもデリミタの変更OK。
s/regex/replaceto/[修飾子]
sの修飾子の種類
|e|replacetoの式を評価する(足し算とか)|
|i|大文字と小文字を区別しない|
|m|文字列を複数行として扱う。(^と$が改行ごとにマッチする)|
|o|パターンのコンパイルを一度しか行わない|
|s|文字列を単一行として扱う。(^と$が最初と最後にしかマッチしない)|
|x|拡張正規表現をつかう。(空白を無視するようになる。エスケープと[ ]以外)|
|g|マッチしたものをすべて置換する|
s演算子を使って、こんなこともOK。
perl -ne 'print if s/ABC/DEF/;' names.txt
ABCにマッチするかどうかのif文にしておいて、printさせるのはDEFに置換後という技。
**パターン照合演算子
|$hoge =~ /abc/|$hogeがabcを含むかどうかの条件式|
|$hoge !~ /abc/|$hogeがabcを含まないかどうかの条件式|
|$hoge =~ s/abc/def/|$hogeのabcをdefに置換|
暗黙的にこれらは使っていた。
/abc/ が $_ ~= /abc/ と同じ意味だった。
**tr, y
trとyは同じ。
置換文字列の文字を1つずつ置換する。
返り値は置換した文字数。
-dオプシ
2011-07-18T22:40:06+09:00
1310996406
-
perl/string
https://w.atwiki.jp/kuwa0224kuwa/pages/30.html
*文字列に対する演算子や関数
**結合演算子
文字列を結合させる。
$str1 . $str2;
**繰り返し結合
文字列を繰り返して結合させる。
$str1 x $num;
**substr
文字列からの文字列の抽出
$ext = substr($str, $offset, $len);
** index
文字列のなかで文字列が見つかった位置を返す。見つからなかったら-1。
$i = index($str1, $str2);
**length
文字列の長さをかえす。
$l = length($str);
**rindex
文字列の中で文字列が見つかった最後の位置を返す。見つからなかったら、-1。
POSiTIONが指定されたら、その位置より前から探す。
$i = rindex($str1, $str2, $position);
**chr
文字コードから文字列を生成する。
$c = chr($num);
*lc
小文字の文字列を返す。
$str2 = lc($str1);
*uc
大文字の文字列を返す。
$str2 = uc($str1);
2011-07-18T18:43:58+09:00
1310982238
-
perl/operand
https://w.atwiki.jp/kuwa0224kuwa/pages/29.html
*演算子について
**等価演算子
数字の場合
|==|等しい場合に1,違えば0|
|!=|等しくない場合に1、違えば0|
|<=>|代償を比較して、左辺が小さければ-1、等しければ0、大きければ1|
文字の場合(文字コードを比較する)
|eq|等しい場合に1,違えば0|
|ne|等しくない場合に1、違えば0|
|cmp|代償を比較して、左辺が小さければ-1、等しければ0、大きければ1|
2011-07-18T18:31:11+09:00
1310981471
-
perl/spvariable
https://w.atwiki.jp/kuwa0224kuwa/pages/28.html
* Perl内で扱われる特別な変数
|$.|ファイルから読み込み時の現在の行数|
|$/|入力時のレコード区切り文字。通常は改行。|
|$,|出力時の項目区切り文字。print@xx;の時に有効|
|$"|出力時の項目区切り文字。print"@xx";の時に有効|
|$\|出力時の行末文字。print"$xx";の後ろに付加される|
|$#|出力時の数値形式。通常は"%.20g"。詳細はprintfを参照|
|$%|出力時の現在のページ番号|
|$=|出力時の現在のライン数|
|$-|出力時の残り行数|
|$~|出力時のフォーマット名(デフォルトはハンドル名と同じ)|
|$^|出力時のヘッダフォーマット名|
|$$|プロセスID|
|$?|最後に実行されたコマンドのステータス|
|$&|パターンマッチにマッチした部分文字列|
|$`|パターンマッチにマッチした部分の前側の文字列|
|$'|パターンマッチにマッチした部分の後側の文字列|
|$+|パターンマッチの最後の()に対応する文字列|
|$0|perlスクリプトのコマンド名|
|$1|パターンマッチの際の1番目の()に対応する文字列|
|$[|配列の最初の添え字。通常は0。|
|$]|perlのバージョン情報|
|$;|高次元連想配列の添え字の区切り文字|
|$!|エラー番号、もしくはエラー文字列|
|$@|直前のevalコマンドのエラーメッセージ|
|$<|このプロセスの実ユーザーID|
|$>|このプロセスの実効ユーザーID|
|$(|このプロセスの実グループID|
|$)|このプロセスの実効グループID|
|$||
|$^D|デバッグフラグの値|
|$^F|システムファイルディスクリプタの最大値|
|$^I|-iオプションで指定した拡張子の名前|
|$^L||
|$^P|デバッガが使用する内部フラグ|
|$^T|スクリプトを実行した時刻|
|$^W|警告スイッチの現在値|
|$^X|perl自身の起動時の名前|
|@_|サブルーチンへの引数|
|@INC|perlライブラリ検索ディレクトリ|
|%INC|読み込まれたライブラリファイルの配列|
|__LINE__|スクリプト中の現在の行数|
|__FILE__|スクリプト
2011-07-17T22:08:01+09:00
1310908081