仙台の山奥で自転車に乗ったり転んだり

愛車の GIOS でサイクリングしたりポタリングしたり、それをブログに記録してみたり。ロードバイクや自転車や坂のことを書いてみたり。ときたまプログラムのことを忘れないようにメモってみたり。

joinでuninitialized valueが

DBメンテのバッチ処理Perlで実装して、null(undef?)をjoinしてエラー(Use of uninitialized value in join or string at...)発生。ちょっとはまったので記録。
やりたかったことはカラムの値をjoinしたハッシュ値をキャッシュデータとして……、というようなもの。

#!/usr/bin/perl

use strict;
use warnings;
use DBI;
use Digest::SHA1 qw(sha1_hex);

my $dbh = DBI->connect($dsn, $user, $password, {
    PrintError => 0, 
    RaiseError => 1, 
    AutoCommit => 0
});

my $sth= $dbh->prepare(q{
    SELECT 
    ...
});
$sth->execute($foo, $bar);
while (my @row = $sth->fetchrow_array) {
    my $hash = sha1_hex(join('', @row));
    ...
}
$dbh->commit;

$sth->finish;

$dbh->disconnect;

値がnullの場合もあるからjoinでエラーが発生していた。とりあえず空文字列に差し替えて対応したけど、これって?かなりいけていない気が……。

grep { $_ = '' unless defined($_) } @row;
my $hash = sha1_hex(join('', @row));

perlぜんぜん分からない……。使わないから以前に、原理が理解できなくて使える気がしない。