あたらしものずきっ!

試してみたものとか、遊んでみたものを色々記してみます。

Catalyst::View::Emailのよみとき

Tracの設定を読むモジュールの後にやっていたこと。

前略のNet::Trac::Configは最終的にTrac::Configという名前で作成。アップするには微妙過ぎると思ってやってない。

Trac::Configを用いて作ったフォームからの送信にて、Emailにての自動返信がほしかった。でも、ArkにはCatalystのView::Emailにあたる存在がない。となるとEmail::SenderとEmail::MIMEを組み合わせて書く必要がある。けど、どうせならArk::View::Emailがあったほうがいいなぁ、と。

Catalyst::View::Emailのリーディング

そこでCatalyst::View::Emailのソースを読んでた。一通りどういうことをやっているかはわかったのだけど、processで腑に落ちない処理があった。

stash_keyにて、$c->stashへと指定した各種情報を$headerに収めていくのだけれど、

my $email  = $c->stash->{$self->{stash_key}};
.
.
my $header  = $email->{header} || [];
push @$header, ('To' => delete $email->{to}) if $email->{to};

pushしてる部分がのみこめない。deleteした時点でundefが$headerに収まるんじゃないのか、と。そこで簡単なサンプルかいて試してみた。

use strict;
use warnings;
use Data::Dumper;

my $sata = [];
printf "\$sata = []\n";
printf "\$sata is []\n";
my $foo->{baz} = "test";
printf "\$foo->{baz} = \"test\"\n";
printf "\$foo->{baz} is %s\n", $foo->{baz};
push @$sata , ('To' => delete $foo->{baz}) if $foo->{baz};
printf "push @\$sata , ('To' => delete \$foo->{baz}) if \$foo->{baz}\n";
printf "\$sata is %s", Dumper $sata;
unless ($foo->{baz}){
    $foo->{baz} = "undefined";
}
printf "\$foo->{baz} is %s\n", $foo->{baz};

結果。

$sata =
$sata is

$foo->{baz} = "test"
$foo->{baz} is test
push @$sata , ('To' => delete $foo->{baz}) if $foo->{baz}
$sata is $VAR1 = [
'To',
'test'
];
$foo->{baz} is undefined

$foo->{baz}が入った後にdeleteが動作してる。いちいちdeleteのためにコード数が増えないようにするための処理ということか。