IT練習ノート

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

Perl

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…

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 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"; 可読性が悪いか。。

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

$ 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"…

ソート後に順番をつける

こんな感じでよかろうか? $ 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" …