P学習帳

書いておぼえるブログ

任意のディレクトリをパスに通す

useしたモジュールが見つからないとき次のエラーが出ます。

Can't locate App/Module.pm in @INC (...

エラーを解消するには、モジュールをパスに通してやればOKです。

パスに通す方法は複数あるようですが、今回はuse libを使いました。

ディレクトリ構成

.
├── App
│   ├── Tengsample
│   │   ├── Model
│   │   │   └── Schema.pm
│   │   └── Model.pm
│   └── teng_sample.pl

teng_sample.pl

こう書きます。

use lib '/Users/taro/App';

すると、teng_sample.plで次のようにモジュールをuseできます。

use Tengsample::Model; ## ./App/Tengsample/Model.pm

Test::Simpleを使ってみる

Test::Simpleを使ってテストを書きました。 自作モジュールがちゃんと動くかを確認します。

テスト対象は、映画のレビュー情報を管理するMovieモジュールです。

package Movie;

sub new {
    my ($class, %args) = @_;
    bless ({%args} => $class);
}

sub title {
    my $self = shift;

    return $self->{title};
}

1;

titleを返すメソッドのみがあります。

このメソッドが期待通りに使えることを確かめたいです。

テストを書きます。

    use Test::Simple tests => 1; #テストの数を書く
    use Movie;

    my $title = "Independence day";
    my $expected = $title;

    my $movie = Moview->new(
        title => $title,
    );

    # 引数1:式 引数2:テストの名前
    ok( $movie->title eq $expected, "title() get ---> $expected");

    # テストの終わりに書く
    done_testing();

はい、モジュールとテストが準備できました。

早速テストを実行してみます。

% perl movie_test.pl
# 1..1
# ok 1 - title() get --> Independence day

おめでとうございます。 オーケーです。

Perl - 2次元配列の生成とアクセス

プログラミングPerl Vol.1の同名セクションにあるサンプルコードを写経する。

#配列リファレンスのリストを配列に代入する
 @AoA = (
     [ "fred", "barney" ],
     [ "george", "jane", "elroy" ],
     [ "homer", "marge", "bart" ],
 );

 print $AoA[2][1]; # marge

 #配列リファレンスの配列へのリファレンスを作成する
 $ref_to_AoA = [
     [ "fred", "barney", "pebbles", "bamm bamm", "dino", ],
     [ "fred", "barney" ],
     [ "george", "jane", "elroy", "judy", ],
 ];

 print $ref_to_AoA->[2][3]; #elroy   

ううむ、配列をハードコーディングするのは大変だ。。

ファイル名グロブ演算子

カレントディレクトリにあるファイルを条件を指定して取得できるファイル名グロブ演算子の使い方メモ。

my @scripts = glob('*.pl');
for ( @scripts ) {
    print "$_\n";
}

@scriptに.plファイルが入る。
取得したファイルを実行したり、または何か処理を加えたりもできる。

while ( glob "*.pl" ) {
   perl $_;
}

(プログラミングPerl Vol.1 第3版 p98)

'yyyy-mm-dd'形式の日付を比較するーPerlの文字列比較演算子

日付の前後を比較したいとき、Time::Pieceとかでepoch秒とかを計算してやるしかないのかーとおもっていたら、実は文字列比較演算子を使えばできると先輩がおしえてくれた。

文字列でありながら、量の比較ができるのだ。これには4種類がある。

小なり (less than) lt   
大なり(greater than)   gt   
以下 (less than or equal to) le   
以上 (greater than or equal to) ge   

たとえば、'2017-11-01'と'2017-11-30'という2つの文字列があるとして、どちらが進んだ日付なのかをしらべたいとする。

my $d1 = '2017-11-01';
my $d2 = '2017-11-30';

if ( $d1 le $d2 ) {
    print "$d1 is older date than $d2.\n";
}

これで日付を判定できる。

比較の仕組みは、左から1文字ずつ比較していって、文字列のソート順を参照して文字の大小を判定しているらしい。

Processing.js できれいな模様を描きたい

Prodessing.jsできれいな画面を作ってみたくなったので、

http://2g.atsukitaira.com/htmlcss/html5/850/ブラウザでお絵描きプログラミング! Processing.js 登場! - IT戦記

やってみた。
全画面表示させたかったけど、はてなブログだとできない?

canvasを全画面に表示する | 2GRAVITY

自前でサーバー立てる必要があるかな。

Bash kakasiで漢字のよみがなを出力する

ヨミガナを登録するために、漢字交じりのテキストをカタカナに変換する必要があった。Excelでヨミガナを振れるかためしてみたが、ダメだった。情報が登録されていないと、できないのだ。

それなら、ということでkakasiを使ってみたらうまくいったので、コマンドをメモる。

こちらのページに載っていたコマンドをそのままお借りした。

kokukuma.blogspot.jp Hunting Field: 漢字→かな(ローマ字)変換プログラム KAKASIのインストールと使い方

コマンド

カタカナに変換

$cat text | nkf -e | kakasi -JH | kakasi -Hk |nkf -w

ひらがなに変換

$cat text | nkf -e | kakasi -JH | nkf -w

これだけでお手軽に変換してくれる。