このサイトはblogban.net(2016年3月にドメイン有効期限切れで閉鎖)のログを保管しているサイトです。
各投稿の権利は当時の投稿者に帰属します。
なお、本サイトでは発信者情報は一切保存しておりませんのでご了承下さい。
過去ログ倉庫ですので書き込みはできません。


なお当時のblogbanの規約に基づき本サイトのログはアフィリエイトブログへの転載を全面的に禁止します。


専ブラ対応済みです。このURLをそのまま外部板登録すると閲覧できます。


お問い合わせはこちらまで



■掲示板に戻る■ 全部 1- 101- 最新50 [PR]ぜろちゃんねるプラス[PR]  

Perlについて

1 :名無しさん名前募集中。。。:2013/07/07(日) 15:07:34.53 ID:j0iarVna0
TMTOWTDI = There's more than one way to do it.
やり方はひとつじゃない。

じゃあ、Perlについて語ろうか。

Perl Download
http://www.perl.org/get.html

101 :名無しさん名前募集中。。。:2013/08/01(木) 19:09:14.43 ID:VNqrjkmS0
16.7 forkを使って低レベル処理を行なう

fork
http://perldoc.jp/func/fork
> fork
> 同じプログラムの同じ地点から開始する新しいプロセスを作成するために
> システムコール fork(2) を行ないます。 親プロセスには、チャイルドプロセスの
> pid を、 チャイルドプロセスに 0 を返しますが、 fork に失敗したときには、
> undefを返します。 ファイル記述子(および記述子に関連するロック)は共有され、
> その他の全てはコピーされます。

perlfork - Perl の fork エミュレーション
http://perldoc.jp/docs/perl/5.16.1/perlfork.pod
> Windows といった fork() システムコールを持っていないいくつかの
> プラットフォームでは、インタプリタレベルで fork() のエミュレーションを
> 構築します。

use 5.016;
use warnings;

my $pid = fork;
defined $pid or die "cannot fork: $!";
if (!$pid){
exec 'perl', '-e', 'print qq{Hello, World!\n}';
die "cannot exec: $!";
}

waitpid($pid, 0);

結果
Hello, World!

102 :名無しさん名前募集中。。。:2013/08/01(木) 19:09:33.10 ID:VNqrjkmS0
16.8 シグナルを送受信する

perlipc - Perl のプロセス間通信 (シグナル, fifo, パイプ, 安全な副プロセス, ソケット, セマフォ)
シグナル
http://perldoc.jp/docs/perl/5.16.1/perlipc.pod#Signals

kill
http://perldoc.jp/func/kill
> kill SIGNAL, LIST
> kill SIGNAL
> プロセスのリストにシグナルを送ります。 シグナル送信に成功したプロセスの数を
> 返します (実際に kill に成功したプロセスと同じとは限りません)。

> SIGNAL がゼロの場合、プロセスにシグナルは送られませんが、 kill は、
> シグナルを送ることが 可能 かどうかを調べます (これは、簡単に言うと、
> プロセスが同じユーザーに所有されているか、 自分がスーパーユーザーであることを
> 意味します)。 これは子プロセスが(ゾンビとしてだけでも)まだ生きていて、
> UID が 変わっていないことを調べる時に有用です。

> PROCESS 番号が 0 あるいは負数の場合の kill の振る舞いは オペレーティング
> システムに依存します。

use 5.016;
use warnings;

sub report {
say $_[0], ': process ', (kill(0 => $_[0]) ? 'live?' : 'dead');
}

my $pid = fork;
defined $pid or die "cannot fork: $!";
if (not $pid){
say "$$: child process";
say "$$: exit";
exit;
}

say "$$: parent process";
sleep 1;

print grep{ /$pid/ } `ps ax`;
report($pid);

say "$$: child($pid) wait...";
waitpid($pid, 0);
report($pid);

結果(例:Debian)
28823: parent process
28824: child process
28824: exit
28824 pts/3 Z+ 0:00 [perl] <defunct>
28824: process live?
28823: child(28824) wait...
28824: process dead

プロセスはexitしてから、waitで回収されるまでゾンビプロセスになります。
適切にwaitしてください。
絶対にゾンビにしたくない場合は、二重fork(double-fork)がお勧めです。

perlfaq8 - システムとの相互作用 バックグラウンドでプロセスを起動するには?
http://perldoc.jp/docs/perl/5.14.1/perlfaq8.pod#How32do32I32start32a32process32in32the32background63

103 :名無しさん名前募集中。。。:2013/08/02(金) 21:34:18.29 ID:iYBp7RAY0
17.1 スライス

perldata - Perl のデータ型 スライス
http://perldoc.jp/docs/perl/5.16.1/perldata.pod#Slices
> スライスは、添え字のリストを使ってリスト、配列、ハッシュの複数の要素に
> 同時にアクセスします。 これはそれぞれの要素を個々のスカラ値のリストとして
> 扱うより便利です。

> ($him, $her) = @folks[0,-1]; # array slice
> @them = @folks[0 .. 3]; # array slice
> ($who, $home) = @ENV{"USER", "HOME"}; # hash slice
> ($uid, $dir) = (getpwnam("daemon"))[2,7]; # list slice

> 変数のリストに代入できるので、配列やハッシュのスライスにも代入できます。

> @days[3..5] = qw/Wed Thu Fri/;
> @colors{'red','blue','green'}
> = (0xff0000, 0x0000ff, 0x00ff00);
> @folks[0, -1] = @folks[-1, 0];

104 :名無しさん名前募集中。。。:2013/08/02(金) 21:34:42.80 ID:iYBp7RAY0
17.2 エラーをトラップする

17.1 evalを利用する

eval
http://perldoc.jp/func/eval
> 実行するコードが変わらないのであれば、毎回多量の再コンパイルすることなしに、
> 実行時エラーのトラップを行なうために、 eval-BLOCK 形式を使うことができます。
> エラーがあれば、やはり $@ に返されます。 例:

> # make divide-by-zero nonfatal
> eval { $answer = $a / $b; }; warn $@ if $@;

17.2.2 高度なエラー処理

エラー処理の1つに、例外(exception)という概念があり、
Perlではモジュールでカバーします。

Try::Tiny - minimal try/catch with proper preservation of $@
http://search.cpan.org/~doy/Try-Tiny-0.16/lib/Try/Tiny.pm

autodie - レキシカルスコープ内の関数を、成功しなければ die するものに置き換える
http://perldoc.jp/docs/modules/autodie-2.06_01/autodie.pod

use 5.016;
use warnings;
use Try::Tiny;

try {
use autodie qw(:io);
open my $fh, '<', 'foobar';
while(<$fh>){
print uc;
}
$fh->close;
}
catch {
if ($_->isa('autodie::exception')){
print "I/O error:\n", $_;
}
else {
die $_;
}
};

結果(例)
I/O error:
Can't open 'foobar' for reading: 'No such file or directory' at ... line 7

Try::Tinyとautodieを正直に使うと、少々冗長かも知れません。
例外を扱うモジュールは他にもあるので、色々試してみると良いと思います。

105 :名無しさん名前募集中。。。:2013/08/02(金) 21:35:03.86 ID:iYBp7RAY0
17.3 grepを使ってリストから要素を選び出す

grep
http://perldoc.jp/func/grep
> grep BLOCK LIST
> grep EXPR,LIST
> これは grep(1) とその親類と同じようなものですが、同じではありません。
> 特に、正規表現の使用に制限されません。
> LIST の個々の要素に対して、BLOCK か EXPR を評価し ($_ は、ローカルに
> 個々の要素が設定されます) 、 その要素のうち、評価した式が真となった
> ものからなるリスト値が返されます。 スカラコンテキストでは、
> 式が真となった回数を返します。

use 5.016;
use warnings;

my @array = grep{ chr =~ /\d/ } (1..63);
say "@array";

結果
48 49 50 51 52 53 54 55 56 57


17.4 mapを使ってリストの要素を変換する

map
http://perldoc.jp/func/map
> map BLOCK LIST
> map EXPR,LIST
> LIST の個々の要素に対して、BLOCK か EXPR を評価し ($_ は、ローカルに
> 個々の要素が設定されます) 、 それぞれの評価結果からなるリスト値が
> 返されます。 スカラコンテキストでは、生成された要素の数を返します。

use 5.016;
use warnings;

my @array = map{ sprintf "%04b", $_ } (1..15);
print "@array";

結果
0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

106 :名無しさん名前募集中。。。:2013/08/02(金) 21:35:21.21 ID:iYBp7RAY0
17.5 便利なリストユーティリティ

List::Util - A selection of general-utility list subroutines
http://perldoc.perl.org/List/Util.html

List::MoreUtils - Provide the stuff missing in List::Util
http://search.cpan.org/~rurban/List-MoreUtils/lib/List/MoreUtils.pm

use 5.016;
use warnings;
use List::Util qw(shuffle);

foreach(1..3){
say "@{[shuffle 1..5]}";
}

結果(例)
2 4 5 3 1
5 1 4 2 3
4 1 3 2 5

107 :名無しさん名前募集中。。。:2013/08/02(金) 21:35:39.63 ID:iYBp7RAY0
おわり。

108 :名無しさん名前募集中。。。:2013/08/06(火) 11:07:49.60 ID:YfFbl2q.0
>>107
おつかれ。

109 :名無しさん名前募集中。。。:2013/08/11(日) 17:34:41.32 ID:dHHUvC5x0
>>108
どもです。

暇なので書評。

Perl徹底攻略
http://gihyo.jp/book/2013/978-4-7741-5864-8

いまどきのPerlの紹介から始まり、Webプログラミング、インフラのHowTo系の
8ページ前後の記事が何本か入った本です。

ぬっちゃけ、「続きはWebで」前提の本だと思いますが、
webでは、知らないことを検索することはできないので、
取っ掛かりとなる、このような本が書店に並ぶのは、いいですね。

いずれも質の良い情報なので、入門を終えて、Perlで何ができるかを
知りたい方にもお勧めです。

128KB
新着レスの表示

名前: E-mail(省略可)
READ.CGI - 0ch+ BBS 0.7.4 20131106
ぜろちゃんねるプラス