スポンサードリンク
カテゴリー:"Perl"

CPANシェルを起動する覚え書き

久しぶりにCPANシェルを使おうとしてたらコマンドをすっかり忘れていたので(^_^;)。

> perl -MCPAN -e shell

そうそう。これですよコレ! でも最近のCPANシェルって、こんな長いコマンドを打たなくても、単純に

> cpan

と入力するだけで起動してくるんだそうです。知りませんでした。つか、便利になったものです。

しかしながら、現実の話をすると、CPANシェルを使う機会って、めっきり減ってるんですよね。

Windows で ActivePerl を使っているなら PPM があるし、Linux系でも yum とかのパッケージ管理システムが使えれば、そちらを使ったほうが実際確実だったりしますから。

しかもピュアPerlなモジュールなら手動で解凍して配置して・・・。で良い場合もあったりなかったり。

もしくはダウンロードしたパッケージを解凍して

perl ./Makefile.PL
make
make test
make install

でもインストールできますしね。

とはいえ、いざという時には頼りになるのも間違いないわけでして、うん、コレで忘れないぞ!

Perlで日時に時間(秒)を加算する関数を書いてみた

決まった時間間隔を計算する必要があったので、Perlの関数にしてみました。

ソースコードは以下の通り。Time::Localモジュールを必要としていますが、標準モジュールなので特に何も追加しなくても動くハズです。

引数は見ての通り、年,月,日,時,分,秒,加算したい秒 となっております。加算したい秒にマイナス値を指定すれば減算もできます。

使い方としては、

とか、

みたいな感じで。

Enjoy!

Perlのリファレンスとデリファレンスを扱う覚え書き

久しぶりにPerlでプログラムを書こうとしたら、すっかり忘れてしまっていたので。

リファレンスを取得しよう

まずは通常の変数からリファレンスを取得する場合は変数名の前に\(環境によっては¥だったり\だったり)を付けてやればOK

無名の配列や連想配列(ハッシュ)からいきなりリファレンスを取得するには、配列の場合はブランケット([])を、ハッシュの場合はブレース({})使って、普通に配列や連想配列を作る感じで出来ちゃいます。

これでOK

デリファレンスしよう

普通にリファレンスを元の変数の形に戻すには、その変数を表すファニー文字をリファレンスを格納した変数の前に付けてやればOKです。

こんな面倒なことをしなくても、アロー演算子(->)を使って直接値にアクセスすることも可能です。

もしくは暗黙のデリファレンスを利用する方法もあります。

このリファレンスを格納した変数を囲っているプレース(上の例では →{$aRef}← )は省略可能($$aRef[0] と書いてもOK)なのですが、複雑な(ネストした)構造になっているものを扱う時なんか、Perlの処理系が混乱する(エラーになる)場合があるので、書くようにしておいた方が後々ハマらなくていい気がします。

もっとも、そんな複雑なデータを扱う場合は暗黙のデリファレンスは使わずに、アロー演算子を使うようにした方が、よっぽど幸せな気がしますが(^_^;)。

【関連エントリー】
 ・Perlで無名(変数|配列|ハッシュ|関数)を扱う際の覚え書き

Perlで空の配列の要素数を数えてみた

ふと気になって、空の配列の要素数を数えたらどうなるのか試してみました。

まずはスカラーで評価してみます。

#!/usr/bin/perl

use strict;
use warnings;

my @array=();

my $arrayLen = @array;

print $arrayLen,"\n";      # 0と表示されます

print scalar(@array),"\n"; # 0と表示されます
 

どちらも 0 という評価でした。

次に配列の最後の要素番号を返す $# で評価してみます。

#!/usr/bin/perl

use strict;
use warnings;

my @array=();

my $arrayLast = $#array;

print $arrayLast,"\n";  # -1と表示されます。
 

結果は-1でした。

なるほど。そうなるのか!

【関連エントリー】
 ・Perlで配列の要素の数を取得する覚え書き

Perlで連想配列の要素の数を取得する覚え書き

使う機会があるかすらわからないけど、Perlで連想配列の要素数を取得する方法を考えてみました。

と言っても、keys でキーの配列を作ってスカラーに代入するだけなんですけどね(^_^;)。

#!/usr/bin/perl

use strict;
use warnings;

my %hash=("a"=>1, "b"=>1, "c"=>1);

my $hashLen = keys %hash;

print $hashLen,"\n"; # 3が表示されます。
 

もしくはscalar関数で評価しちゃうとか・・・。

#!/usr/bin/perl

use strict;
use warnings;

my %hash=("a"=>1, "b"=>1, "c"=>1);

print scalar keys %hash,"\n"; # 3が表示されます。
 

Enjoy!

Perlで配列の要素の数を取得する覚え書き

よく忘れてしまうので、自分用にPerlで配列の要素数を取得するための覚え書きです。

一番簡単なのがスカラーに代入することです。

#!/usr/bin/perl

use strict;
use warnings;

my @array=(1, 1, 1);

my $arrayLen = @array;
print $arrayLen,"\n"; # 3が表示されます。
 

scalar関数で評価すると、代入しなくていいので手間が省けます。

#!/usr/bin/perl

use strict;
use warnings;

my @array=(1, 1, 1);

print scalar(@array),"\n"; # 3が表示されます。
 

他にも$#を使う方法があるのですが、こちらは要素数ではなく最後の要素番号を返します。

#!/usr/bin/perl

use strict;
use warnings;

my @array=(1, 1, 1);

print $#array,"\n";   # 2が表示されます(最初の要素番号が0のため)。
print $#array+1,"\n"; # 1を足せば要素数の3になります。
 

滅多に使わないけど、配列の各要素に対して処理をかける時とかに便利。

#!/usr/bin/perl

use strict;
use warnings;

my @array=(1, 1, 1);

# パターン1
for(my $i=0; $i<=$#array; $i++){
  $array[$i] = $array[$i]*3;
}

# パターン2
for(my $i=0; $i<$#array+1; $i++){
  $array[$i] = $array[$i]*3;
}
 

とかとか・・・。

Enjoy!

【関連エントリー】
 ・Perlで空の配列の要素数を数えてみた

Perlで文字列を/で分割(split)しよう

久しぶりにファイルパスの文字列を分解しようとしたのですが、書き方をスコーン! と忘れてしまっていたので自分用にメモメモです φ(..)。

単純に区切り文字になる / を \ でエスケープしてやれば良いだけの話なんですが、何で抜けてたかなぁ?(^_^;)

#!/usr/bin/perl

use strict;
use warnings;

my $pathStr = '/home/mukairiku/hoge/sample.txt';
my @pathArray  = split(/\//, $pathStr);

print shift(@pathArray)."\n"; # 結果は ""(空の文字列)
print pop(@pathArray)."\n";   # 結果は "sample.txt"
 

うん、これでOK!

Perlでハッシュ(連想配列)に格納されている値からキーを逆引きする関数を書いてみた

以前に Python では辞書オブジェクトを逆引きできると聞きまして、Perl でもハッシュ(連想配列)を、格納されている値からキーを逆引きできたら便利かも? と思い関数にしてみました。

12行目からの HashValue2Keys というサブルーチンがそうで、11行目までは検証用のソースになります。

使い方は第1引数に検索したい値を、第2引数に対象のハッシュを与えます。戻り値は該当したキーのリストです。該当するキーが無かった場合は空のリストを返します。

Enjoy!

Perlで改行のない巨大な固定長のテキストファイルを処理しよう

固定長のテキストファイルになっているバカでっかいデータを処理しなくちゃいけなくなったのですが、データセットの区切りに改行が入ってなかったんですよ。

というわけで、read 関数を使って処理することにしました。

ファイルのサイズが小さければ、一気に変数に読み込んで substr を回して処理できて楽だったんですけどねぇ。

PerlのDBI/DBD::ODBCで 「String data, right truncated (SQL-01004)」 エラー

PerlでDBI(DBD::ODBC)経由でデータベースにアクセスしたところ、検索結果をフェッチするところで

DBD::ODBC::st fetchrow_array failed: [MySQL][ODBC 3.51 Driver][mysqld-3.23.49]String data, right truncated (SQL-01004)(DBD: st_fetch/SQLFetch (long truncated DBI attribute LongTruncOk not set and/or LongReadLen too small) err=-1) at C:\test\test.pl line 24.

というエラーが出て止まってしまいました。

メッセージによると、LongTruncOk が設定されていないか LongReadLen が小さすぎたかのどちらか(もしくは両方)とのことなので、対処法を調べてみました。

続きを読む »

スポンサードリンク

プロフィール


  • 書いてる人:夢界 陸

    名古屋在住のおっさん。
    プログラミングやガジェットの話など、 日々の興味を徒然と綴っています。



    Twitterやってます @mukairiku



    運営サイト
    www.mukairiku.net

アクセスランキング


ブログ内検索

Licenses

  • Creative Commons License

OTHER


  • このブログのはてなブックマーク数

    ブログパーツ
Blog powered by TypePad

スポンサードリンク