Craftworks Tech Blog - Branch このページをアンテナに追加 RSSフィード Twitter

2010-11-10

ハッシュのキーとバリューを入れ替える方法

| 01:56 | ハッシュのキーとバリューを入れ替える方法を含むブックマーク ハッシュのキーとバリューを入れ替える方法のブックマークコメント

[追記] reverse() を使う方法の方が速くて簡潔でお勧めです! id:tomi-ru++

あまり必要になるケースは無いと思いますが Tips です。

use strict;
use warnings;
use Test::More;

my %a = (
    foo => 1,
    bar => 2,
    baz => 3,
);

my %b;
@b{ values %a } = keys %a; # スライスで入れ替え

is_deeply(\%b, {
    1 => 'foo',
    2 => 'bar',
    3 => 'baz',
});

done_testing;

Test::mysql で起動したインスタンスに mysql クライアントで接続するとテストがさらに快適に

| 23:20 | Test::mysql で起動したインスタンスに mysql クライアントで接続するとテストがさらに快適にを含むブックマーク Test::mysql で起動したインスタンスに mysql クライアントで接続するとテストがさらに快適にのブックマークコメント

昨日書いたエントリ、Test::mysqld を別ウィンドウで立ち上げたら開発時の prove が快適過ぎる件ですが、prove とか make test がコケたりしたときに、実際に DB の中身がどうなってるか見れた方がデバッグが捗りますよね。

加えて、どうせなら使い慣れた mysql クライアントでテストの結果、テーブルがどうなっているか見たいですね。

ということで、テスト用に立ち上げた mysqld に手軽に接続できるスクリプトを書いてみました。

#!/usr/bin/env perl
use strict;
use warnings;
use File::Spec;
use JSON;

my $tempfile = File::Spec->catfile(File::Spec->tmpdir, 'test_mysqld.json');

open my $fh, '<', $tempfile or die $!;
my $json = decode_json(join '', <$fh>);
close $fh;

my @command = qw(mysql --user root --socket);
push @command, $json->{'my_cnf'}{'socket'}, 'test';

exec @command;

こんな感じのスクリプトを、t/script/test_mysql.pl とか適当な名前で保存してパーミッション与えて下さい。

t/script/mysqld_runner.pl が立ち上げた mysqld はプロセス再起動するだけで、まっさらな状態に戻せるので、デバッグ用途だけでなく、サンドボックス的に色々実験する用途にも向いているので、色々と遊べて良いと思います。

これで、Test::Fixture::DBI によるテストがより快適になりました。