書式: splice(array, offset, length, list) 配列要素arrayのoffset番目の要素からlength分削除する。lengthが省略された場合、offset以降の要素全てを削除。 [サンプル] my @array = (1,2,3,4,5); my $deleted_num = splice(@array, 2, 1); print $deleted_num . "\n"; print @array; [実行結果] 3 1245
List::Utilのshuffle関数を使用すればよい。 use List::Util qw(shuffle); @array = shuffle(@array);
配列の個数を参照するには$#変数名を参照すればよい。（添字の数のため実際の個数は+1した値) $#array; もしくはscalar変数に代入を行うことでもわかる。（こちらは実際の個数） 1. $sample_num1 = @array; 2. $sample_num2 = scalar(@$array); #リファレンスの場合
[ウィンドウ操作] c - ウィンドウの作成 A - タイトルの変更 S - ウィンドウの分割 Q - 現在のウィンドウ以外をクローズ [ copy & paste ] [ - copyモードへ ] - paste [その他] : screenコマンドの入力へ [.screenrc] # statuslineの表示 hardstatus alwayslastline "%{= wk} %-w%{=bu dr}%n %t%{-}%+w %= %{=b wb}%y/%m/%d %{=b wb}%c" 参考サイト: screenコマンド一覧
stat関数はファイルの様々な情報を得るための関数です。この関数を使うことでファイルサイズや、ファイル所有者、最終更新時間などを調べることができます。 [対応表] 0 ファイルシステムのデバイス情報 1 Iノード番号 2 ファイルのパーミッション情報 3 ファイルへのハードリンク数 4 ファイル所有者のユーザID 5 ファイル所有者のグループID 6 デバイス識別子 7 ファイルサイズ(バイト） 8 最終アクセス時間 9 最終変更時間 10 最終iノード変更時間 11 最適ブロックサイズ 12 ファイルに割当てられているブロック数 [使用例] #ファイルサイズを調べる $file_size = (stat'./power.pl')[7]; print "$file_size\n";
select関数は現在設定されているファイルハンドルを調べたり、設定するために使用されます。またsleepのようにプログラムを一時停止する際にも使用される。sleepは1秒単位の指定しかできないが、selectでは整数値以外も指定できるため、より細かいコントロールが可能。 [使用例] #ファイルハンドルにWRITERを設定する select WRITER; #0.1秒プログラムを停止 select(undef, undef, undef, 0.1); [関連記事] sleep - プログラムの一時停止
DBIx::Class::Schema::Loaderを使用すればスキーマを作成する手間が省ける。 #!/usr/bin/perl package My::Schema; use base qw/DBIx::Class::Schema::Loader/; # constraintで正規表現にマッチするテーブルのみロード # excludeは正規表現にマッチするテーブルを除外 # debugオプションを指定することで自動解析したスキーマをダンプ # その他loader_optionsに指定できるオプションはDBIx::Class::Schema::Loader::Baseを確認のこと __PACKAGE__->loader_options( constraint => qr/point/, debug => 1 ); package Main; use warnings; use strict; my $dsn = 'DBI:Pg:dbname=dbname;host=localhost'; my $user = 'username'; my $password = 'password'; my $attrs = { AutoCommit => 1 }; my $schema = My::Schema->connect($dsn, $user, $password, $attrs); # primary_keyでの検索にはfind()を使用 my $result_set = $schema->resultset('Point')->search( { timestamp => { '<=' => '2008-01-01' } }, { order_by => 'timestamp' } ); while (my $record = $result_set->next ) { print $record->id . "\t" . $record->timestamp . "\n"; } # 検索してそのまま削除 $schema->resultset('Point')->search( { id => { '<=' => '514' } })->delete; __END__
ファイルを読み書きモードで開くには
+> もしくは +< を使えばファイルを読み書きモードで開くことができます。 +> はオープン時にファイルを空にしてくれます。一方 +< ではファイルの内容は保持されたままになります。 例: ファイルの中身はそのままで、読み書きモードにてファイルを開きます。 open(FILE, "+< file.txt"); 処理 ・ ・ ・ close(FILE)
flockは開いたファイルをロック（保護）するために使用されます。Windowsサーバなど、flockが使用できない環境下では使えません。 [例] ------------------------------------------------------------------- open(SERIAL, "+< ./serial.txt"); #ファイルを読み書きモードで開く flock(SERIAL, 2); #書き込み宣言 my ($serial) = <SERIAL>; #値を読み込む chomp $serial; #改行を取り除く $serial = $serial+1; #値に1追加する truncate(SERIAL, 0); #ファイルを空にする seek(SERIAL, 0, 0); #ファイルの先頭に移動 print SERIAL "$serial"; #新しい値を書き込み close(SERIAL); #ファイルを閉じる。ロックは自動的に解除されます ------------------------------------------------------------------- [例: 追記の場合] ------------------------------------------------------------------- open(LOG, "+< ./log.txt"); #ファイルを読み書きモードで開く flock(LOG, 2); #ロック seek(LOG, 0, 2); #ファイルの末尾に移動 print LOG "$log\n"; #ファイルに追記 close(LOG); #ファイルを閉じる ------------------------------------------------------------------- ※補足 以下のように書くのは間違い。ファイルを開いた時点でファイルサイズは0になっているため、ロックする意味はない。 open(SERIAL, "> ./serial.txt"); flock(SEIRAL, 2);
seek関数 - ファイルの途中から読み込み（書き込み）をする
seek関数はファイルポインタをセットするための関数です。主にファイルの途中から読み込みや書き込みを行う際に使用されます。 [書式] seek(FILEHANDLE, オフセット, 起点); オフセットは起点からのバイト数です。 起点は以下のように 0, 1, 2 の数字で指定します。 0 ･･･ ファイルの先頭 1 ･･･ 現在のファイルポインタ 2 ･･･ ファイルの末尾 [使用例] seek(FILEHANDLE, 0, 0); #ファイルの先頭に移動します seek(FILEHANDLE, 0, 2); #ファイルの末尾に移動します
DirHandle - ディレクトリのファイル一覧を取得
DirHandleを使用すれば簡単にディレクトリのファイル一覧を取得できます。 [例 dirhandle.pl] #!/usr/bin/perl use DirHandle; #カレントディレクトリ内のファイルを表示 my $dir = new DirHandle '.'; print "$name\n" while ($name = $dir->read); $dir->close; [出力例] [root@server temp]# ./dirhandle.pl . .. package.pl dirhandle.pl
ファイルのコピーや移動にはFile::Copy モジュールを使用します。 use File::Copy; copy("コピー元のファイル名", "コピー先のファイル名"); move("移動元", "移動先");
XML::RSS::Parserを使ったRSSのparser例。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; binmode STDOUT, ':utf8'; use XML::RSS::Parser; use LWP::UserAgent; use HTTP::Request::Common; use Date::Manip; use Data::Dumper; my $uri = 'http://b.hatena.ne.jp/hotentry/it.rss'; my $ua = new LWP::UserAgent; my $request = GET($uri); my $response = $ua->request($request); my $parser = XML::RSS::Parser->new; my $feed = $parser->parse_string($response->content); foreach ( $feed->query('item') ) { my $title = $_->query('title')->text_content; my $description = $_->query('description')->text_content; my $timestamp = $_->query('dc:date')->text_content; my $link = $_->query('link')->text_content; print "$title ($link)\n\n $description \n\n ($timestamp)\n\n"; }
perlにて使用される特殊変数の一覧。 $0 スクリプトのコマンド名 $! エラー番号、もしくはエラー文字列 $? 外部コマンドなどを実行した際の最後のステータス値 $@ 直前のevalで発声した例外メッセージ $n パターンマッチ時にn番目の()にマッチした文字列 $| 出力のバッファリング、0以外でバッファリングが無効になる $. ファイルハンドルの現在ある位置の行数 $/ 入力時の区切り文字。デフォルトは改行文字。 $, print使用時のセパレーター $" print "@list_context"とした際の区切り文字 $$ プロセスのpid @ARGV スクリプトに渡された引数 $^D デバッグフラグの値 $^E OS特有のエラーメッセージ $^T スクリプト実行時刻(epoch time) %ENV 環境変数 %INC インクルードされたライブラリなどを記録 %SIG シグナルハンドラを設定するためのハッシュ @INC ライブラリの検索対象ディレクトリ $0の使用例 [例: test.pl] #!/usr/bin/perl print "$0\n"; [実行結果] [testuser@server testuser]$ ./test.pl ./test.pl [testuser@server testuser]$ /home/testuser/test.pl /home/testuser/test.pl [例 argv.pl] #!/usr/bin/perl print @ARGV"; [実行結果] [testuser@server testuser]$ ./argv.pl a b c d e a b c d e
viでの置換は:sコマンドを使用します。 :%s/置換前の文字列/置換後の文字列/g で開いているファイル全てにおいて置換をします。置換をするかどうかを確認したい場合は以下のようにcをつけます。 ：%s/置換前文字列/置換後文字列/gc パス名などを変更する際には/を区切り文字に使うのではなく、;などを区切り文字に使うと便利 %s;/var/home;/home;gc 文章全体でなく、特定範囲のみ置換したい場合は置換したい行の範囲を指定すればよい。 [例] - 63行目から79行目まででbeautyをhairnailに一括置換 :63,79s /beauty/hairnail/g マッチングを利用した置換は正規表現を使います。 [例] :s /$\(.*\)/$form->{'\1'}/g マッチした部分\(.*\)は\1に入るので、例えば$certCompanyEngは$form->{'CertCompanyEng'}に置換されます。 改行コードを挿入するにはCtrl+vと押した後にEnterを押せばよい。以下の例ではスペースを改行に置換。 %s/ /^M/g; 複数ファイルを一括で置換する場合はargsコマンドで対象となるファイルを選び、argsdoコマンドで置換する。以下カレントディレクトリ以下にあるcファイルを対象にmy_fooをMy_Fooに置換。（置換対象ファイルはargaddした後にbuffers!で確認可能） argadd **/*.c :argdo %s/\<my_foo\>/My_Foo/ge | update
vim内でディレクトリ間を移動したり、ファイルを開くには:Expと打ち込みます。(vimの標準プラグインであるnetrwの機能の一つ) ディレクトリ上にカーソルを置きEnterを押すとディレクトリに移動し、ファイル上でEnterを押すとファイルを開きます。 以下主なオプション。 o ファイル及びディレクトリを別画面で開く i ファイルサイズやタイムスタンプなどの詳細を表示 d ディレクトリを作成 x 指定したアプリケーションでファイルを開く
マクロとは一連の操作をを記録し、再度その操作を行う機能です。以下使い方。 1. qaにて記録を開始 2. 任意の操作 3. qにて記録を終了 4. @aにて記録したマクロを実行。10回繰り返す場合には10@a ※ aの文字は任意。a-zまで記録可能。（レジスタ） ※ aではなくAとした場合、既存のマクロに処理を追加する。
viでは画面を分割して表示することができます。vi起動中に:splitもしくは:spとすることで画面を上下に分割できます。またすでに開いているファイルの画面を分割するだけでなく、複数ファイルを分割して開くことも可能です。その場合には:spのあとにファイル名を続けて入力します。また画面を上下に分割するのではなく、左右に分割することもできます。画面を縦に分割するには:vsplitコマンドを使用します。 [書式] :sp 画面を上下に分割 :sp ファイル名 指定したファイルを分割した画面に表示 Ctrl-w p 画面間の移動 Ctrl-w k 上の画面に移動 Ctrl-w j 下の画面に移動 Ctrl-w l 右の画面に移動 Ctrl-w h 左の画面に移動 Ctrl-w K 現在の画面を上に移動 Ctrl-w J 現在の画面を下に移動 Ctrl-w L 現在の画面を右に移動 Ctrl-w H 現在の画面を左に移動 Ctrl-w 10+ カーソルのある画面を10行分大きくする Ctrl-w 10- カーソルのある画面を10行分小さくする Ctrl-w = 画面のサイズを同じにする
Evaluates the BLOCK or EXPR for each element of LIST (locally setting $_ to each element) and returns the list value composed of the results of each such evaluation. In scalar context, returns the total number of elements so generated. Evaluates BLOCK or EXPR in list context, so each element of LIST may produce zero, one, or more elements in the returned value. [書式] map EXPR, LIST map BLOCK LIST [例] #192.168.1.1から192.168.1.16 @host = map("192\.168\.1\.$_", 1..16); #1から10の三乗 @third_power_of_each = map $_ * $_ * $_, 1..10; # BLOCK使用例 #!/usr/bin/perl use Data::Dumper; @columns = qw/firstname lastname/; @tokens = qw/Ichirou Jirou Saburou/; my @result ; foreach my $column (@columns) { push(@result, map { { $column => { '-like' => "%$_%" } }; } @tokens); } print Dumper(@result); #BLOCK出力結果 $VAR1 = { 'firstname' => { '-like' => '%Ichirou%' } }; $VAR2 = { 'firstname' => { '-like' => '%Jirou%' } }; $VAR3 = { 'firstname' => { '-like' => '%Saburou%' } }; $VAR4 = { 'lastname' => { '-like' => '%Ichirou%' } }; $VAR5 = { 'lastname' => { '-like' => '%Jirou%' } }; $VAR6 = { 'lastname' => { '-like' => '%Saburou%' } };
smbmountはサーバとのファイル共有に使用されます。主にLinuxとWindows間のファイル共有に使用されますが、Linux同士での使用も可能です。 [書式例] smbmount //リモートサーバ名/ディレクトリ マウント先 -o username=ユーザ名, password=パスワード, codepage=cp932, iocharset=ホスト側文字コード [その他主なオプション] fmask - マウント時のファイルのパーミッション dmask - マウント時のディレクトリのパーミッション uid - マウント時のユーザID gid - マウント時のグループID password - 接続先のパスワード [使用例] smbmount //example.com/backup /mnt/smb -o username=testuser,codepage=cp932,iocharset=utf8,uid=localuser,gid=localuser #毎回マウントするのが面倒な場合、以下のようにfstabに記述しておけばよい。 //example.com/backup /mnt/smb smbfs username=testuser,codepage=cp932, iocharset=utf8,uid=localuser,gid=localuser 0 0 どうしても文字化けが発生する場合にはfs tyeにsmbfsではなくcifsを指定してみてください。smbfsの文字コード変換はカーネルが行います。一方smbclientでは文字コード変換を行うのはsambaになります。(2006/05/12 追記) CentOS 5よりsmbmountはなくなったため、cifsにてマウントすればよい。 mount -t cifs -o user=******,password=****** //example.com/backup /mnt/backup