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ぜんぜん分からない……。使わないから以前に、原理が理解できなくて使える気がしない。