IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

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

Perl条件文の可読性

プログラミング一般論として可読性の高いコーディングが求められますが、可読性の良い悪いを判断するのが難しいケースがままあります。最近、可読性の良さについて意見が別れたことがありました。実際はもう少し複雑だったのですが、ポイントを纏めると以下…

perl vs Haskell

問題各辺が10以下の整数で、辺の合計が24の直角三角形の、各辺の長さを求める。 http://learnyouahaskell.com/starting-out#im-a-list-comprehensionperlの負けっぽい。 1 use strict; 2 use Data::Dumper; 3 4 my @data; 5 6 for my $i (1..10) { 7 for my …

switchやcaseらしきもの

使う場面があるかなぁ。まぁ一応知識として。 1 #!/usr/bin/perl 2 use strict; 3 4 for (qw/first fourth fifth third/) { 5 6 /first/ && do {print "1st\n";}; 7 8 /second/ && do {print "2nd\n";}; 9 10 (/third/ || /fifth/) && do {print "3rd or 5th…

FizzBuzz

今更ながら、PerlでFizzBuzzを考えてみた。 http://ja.wikipedia.org/wiki/Fizz_Buzz FizzBuzzの判定の定義を外出しにしてみた。 use strict; use Data::Dumper; use List::Util; my $upper_num = 30; my $criteria = +{ 3 => 'fizz', 5 => 'buzz', 15 => 'f…

List::Util::reduceの使い所

検索してもあまり例がみつけられなかったので備忘で残す。 use List::Util; use Data::Dumper; $foo = + [ +{k=>'a', v=>10}, +{k=>'b', v=>30}, +{k=>'c', v=>40}, +{k=>'d', v=>30},]; $max_foo_v = List::Util::reduce { $a->{k} >= $b->{k} ? $a : $b } …

ハッシュの特定のキーでまとめる処理

use Data::Dumper; $a=+[ +{k=>1, v=>'a'}, +{k=>1, v=>'b'}, +{k=>2, v=>'c'}, +{k=>2, v=>'d'},]; print Dumper($a); $b=+{}; push (@{$b->{$_->{k}}} ,$_->{v}) for (@$a); print Dumper($b); $VAR1 = [ { 'k' => 1, 'v' => 'a' }, { 'k' => 1, 'v' => 'b…

carp, cluck, croak, confessの違い

package B; use Carp qw(carp cluck croak confess); sub test { carp 'this is carp'; # cluck 'this is cluck'; # croak 'this is croak'; # confess 'this is confess'; # warn 'this is warn'; # die 'this is die'; } package main; B::test(); # Fatal…

ソートの練習

use List::Util qw(shuffle); @foo = (9,8,7,6,5); sub mysort { my @a = @_; if (scalar(@a)<2) { return @a; } else { return ( mysort(grep { $_ < $a[0] } @a), $a[0], mysort(grep { $a[0] < $_ } @a) ); } } for (1..10){ @foo = shuffle(@foo); print…

範囲オペレータ

#2回ループする $ perl -e 'for(0..1) {print $_ . "\n";};' 0 1 #ゼロからゼロまでと読んでしまうとループしないように思えてしまう。 #そうではなく、ゼロからゼロを処理した後に終了と読む。 $ perl -e 'for(0..0) {print $_ . "\n";};' 0 #このケースで…

条件演算子の活用?

たまに条件によってどちらかしか変数を使わない時がある。 my $foo; $foo ? my $bar = 111 : my $coo = 222; print '$bar :' . $bar . "\n"; print '$coo :' . $coo . "\n"; 可読性が悪いか。。

h,j,k,lの次に覚えること

vim

h,j,k,lでカーソル移動ができますが、いつもこれらのキーだけでカーソル移動をしていると、編集のスピーがあがりません。さまざまな移動系コマンドを覚えないことには、スピードが上がりません。w,bで単語単位で移動ができますが、他にもさまざまあります。…

配列レファレンスでのインデックスの最大値

$ perl -MData::Dumper -e '$foo = +[1,2,3,4];print $#$foo;'

Data::DumperかData::Dumpか?

Data::Dumpというモジュールがあり、Data::Dumperとどう違うのだろうと思ったところ、どうもData::Dumperの使いにくい部分があったため、Data::Dumpを作ったようです。使いどころとしては、 簡素な出力をしたいとき DeepCopyをしたいとき のようです。 #ロー…

行列転置

これより短い方法はあるのだろうか? $ perl -MData::Dumper -MList::Util -e ' $foo = +[+[11,12],+[21,22,23],+[31],+[41,42]]; print Dumper($foo); $bar=+[]; for $i (0..List::Util::max(map{$#$_}@$foo)){ push @$bar , +[ map {$_->[$i]} @$foo ] }; …

splitはスラッシュ指定

~>echo $PATH | perl -nl -MData::Dumper -e '@a = split(':', $_);print Dumper(\@a);' syntax error at -e line 1, near "split(:" Execution of -e aborted due to compilation errors. #おっと。。 ~>echo $PATH | perl -nl -MData::Dumper -e '@a = spl…

perlはどこにある?

~>type -all perl perl is /usr/bin/perl perl is /cygdrive/e/Dwimperl/perl/bin/perl

perlマッチングはイタレータ

~/perl $ perl -MData::Dumper -e '$a="a123 n456";@b = ($a=~ m/\d+/g);print Dumper(\@b);' $VAR1 = [ '123', '456' ]; #マッチの結果は配列で受け取れる。 ~/perl $ perl -MData::Dumper -e '$a="a123 n456";while($a=~ m/(\d+)/g ){print Dumper($_)}' $…

ハッシュのキーと値の入れ替え

ハッシュも配列だと思えばよいのか。 $ perl -MData::Dumper::Concise -e ' my $foo = {1=>'banana', 2=>'orange', 3=>'poteto'}; print Dumper($foo); my $bar = +{ reverse %$foo }; print Dumper($bar); ' { 1 => "banana", 2 => "orange", 3 => "poteto"…

N件ごとに取り出すイタレータ

もっと防御てきにしたほうがいいはず。 ~/perl $ perl -MData::Dumper -MTupleIterator -e ' $a=+[qw/a b c d e f g h/]; $b=TupleIterator::get_tuple_iterator($a,3); while($b->("more")){print Dumper($b->("next"))}; print Dumper($b->("remain")) ' $…

Data::Dumper::Concise

確かに簡素になりますね。 $ cpan Data::Dumper::Concise CPAN: Storable loaded ok (v2.27) Going to read '/home/naogawa/.cpan/Metadata' Database was generated on Wed, 05 Jun 2013 16:07:52 GMT CPAN: LWP::UserAgent loaded ok (v6.04) CPAN: Time::…

ソート後に順番をつける

こんな感じでよかろうか? $ perl -MData::Dumper::Concise -e ' @foo = qw/ g f e d c b a/; $idx=0; @bar = map {[++$idx, $_]} sort {$a cmp $b } @foo; print Dumper(\@bar);' [ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ], [ 4, "d" ], [ 5, "e" ], [ 6, "f" …

PerlでURLのパラメータを取り出す簡単な方法

もっと簡単な方法はないだろうか? >/perl $ perl -MData::Dumper -e '%a = split("[&=]","foo=1&bar=2"); print Dumper(\%a);' $VAR1 = { 'bar' => '2', 'foo' => '1' }; #おっ。いい感じ。 >/perl $ perl -MData::Dumper -e '%a = split("[&=]","foo=1&bar…

Perlで危険なHTTPサーバ

オペミスを防ぐためにチェック処理をいれないと。。 というかこんなことしないか。 use HTTP::Daemon; my $d = HTTP::Daemon->new(LocalAddr=>'localhost', LocalPort=>8080) || die; while (my $c = $d->accept) { my %param = split("[&=]",substr($c->get…

Perlでインクリメンタルテスト(2)

こんなことするより、 http://naotoogawa.hatenablog.jp/entry/2013/04/29/220956 psh(perl testing shell http://www.perlmonks.org/?node_id=548787 )を使うのが簡単そう。 このpshの中にあらかじめ必要となる重たいモジュールをuseしておく。 テストコー…

Perlでインクリメンタルテスト

この前Perlでテストプログラムを書いていたのですが、テスト対象プログラムにて読み込んでいる設定ファイルがたくさんあり、その読み込みに1秒から2秒ほど時間がかかり、テストがサクサクできませんでした。1,2秒我慢できないのかと言われてしまいますが、心…