Tag: perl



2011 3月8日

メール送信に便利な Mail::Sendmail
大変便利なモジュールだけど、RFCに違反しているメールアドレスでは内部のエラーチェックに引っかかり送信出来ない。

例えばこんなメールアドレスには送信出来ない。
例)read_rfc822.@docomo.ne.jp

元ソースの正規表現部分

# regex for e-mail addresses where full=$1, user=$2, domain=$3
# see pod documentation about this regex

my $word_rx = '[\x21\x23-\x27\x2A-\x2B\x2D\x2F\w\x3D\x3F]+';
my $user_rx = $word_rx         # valid chars
             .'(?:\.' . $word_rx . ')*' # possibly more words preceded by a dot
             ;
my $dom_rx = '\w[-\w]*(?:\.\w[-\w]*)*'; # less valid chars in domain names
my $ip_rx = '\[\d{1,3}(?:\.\d{1,3}){3}\]';

$address_rx = '((' . $user_rx . ')\@(' . $dom_rx . '|' . $ip_rx . '))';
; # v. 0.61

@EXPORT_OK に $address_rx が設定されているので、$Mail::Sendmail::address_rx の正規表現を変更すればエラーチェックに引っかからないようになる。

my $word_rx = '[\x21\x23-\x27\x2A-\x2B\x2D\x2F\w\x3D\x3F\.]+'; # \.を追記する
my $user_rx = $word_rx . '(?:\.' . $word_rx . ')*' ;
my $dom_rx = '\w[-\w]*(?:\.\w[-\w]*)*'; # less valid chars in domain names
my $ip_rx = '\[\d{1,3}(?:\.\d{1,3}){3}\]';
my $address_rx = '((' . $user_rx . ')\@(' . $dom_rx . '|' . $ip_rx . '))';
$Mail::Sendmail::address_rx= $address_rx;

正規表現を無効にした場合、当然の事ながらその前にメールアドレスの正当性をチェックしておく必要があると思う。(携帯メールアドレスを有効にするなら Email::Valid::Loose 等)

  • 関連記事:perl でメールアドレスの有効性をチェックするモジュール
  • モダンなperlモジュール

    メール送信系のモジュールは山ほどあるので何がいいか悩むところ。Mail::Sendmail のエントリーだけど、 Email::Sender がモダンなモジュールとして紹介されているのでリンクを載せておく。

  • モダンPerlの世界へようこそ:第20回 Email::Sender:メールを送信する|gihyo.jp … 技術評論社
  • [Email::Sender]Perlでメールを送信するときはEmail::Senderを使いましょうというお話 – punitanのメモ
  • 気になる点は Moose に依存しているという事。

  • Perl5 によるメール送信 – 実践的な Email::Sender の利用方法






  • 2011 2月18日

    JavaScriptとかで書いてて便利な無名関数。
    perlでも出来たら何か便利かなぁ。

    my $sub = sub {print @_, "\n";};
    &$sub('Hello,world!');
    
    #実行結果
    Hello,world!

    関数型言語って何がすごいんですか – Gemmaの日記
    にあるJavaScriptの例をperlで書いてみる。 …つづきを読む







    2011 2月16日

    ヒアドキュメントの中でPerlの式を書く

    print <<EOM;
    あいうえお
    かきくけこ
    EOM
    

    こんなのをヒアドキュメントという(らしい)
    この中にperlの式を埋め込むテクニック。

    リンク先より引用

    print <<EOM;
    TIME: @{[ time() ]}
    EOM
    
    実行結果
    TIME: 1229258525

    面白い。







    2011 2月7日

    Apache2.2でSpeedyCGIのperlモジュールを使うのならyumなりで一発インストールできるけど、mod_SpeedyCGIをインストールしようとするとmakeでコケる。

    どうやらパッチを当ててからmakeする必要があるようだ。
    参考:Apache2.2にmod_SpeedyCGIを組み込む方法(パッチファイルのあて方) / レンタルサーバー BIG-server.com

    パッチファイルのダウンロード

    パッチファイル:CGI::SpeedyCGI with apr-1.0

    ※パッチファイルはwgetで入手できないのでダウンロードしておいてFTP等でアップロードする必要がある。 …つづきを読む







    2011 1月21日

    Date::Calc – search.cpan.org

    基本

    use Date::Calc qw(:all);
    
    # 今日
    my ($yyyy,$mm,$dd) = Today();
    print "$yyyy/$mm/$dd"; 
    
    # 実行結果
    2011/1/21

    昨日の日付(日付計算)

    use Date::Calc;
    
    my ($yyyy,$mm,$dd) = Date::Calc::Today();
    @y = Date::Calc::Add_Delta_Days($yyyy, $mm, $dd, -1);
    my $yesterday= join('/',@y);
    
    print "昨日=$yesterday\n";
    
    # 実行結果
    昨日=2011/1/20

    Date::Calc::Add_Delta_Days($yyyy, $mm, $dd, -1);の-1を-7にすれば7日前、5にすれば5日後となる。

    前月1日と月末を算出

    use Date::Calc;
    
    @y = Date::Calc::Add_Delta_YMD($yyyy, $mm, 1, 0 ,-1, 0); #前月1日
    $start = join('/',@y);
    @y = Date::Calc::Add_Delta_YMD($yyyy, $mm, 1, 0, 0, -1); #前月末日
    $end = join('/',@y);
    
    print "前月1日=$start\n";
    print "前月末日=$end\n";
    
    # 実行結果
    前月1日=2010/12/1
    前月末日=2010/12/31

    Date::Calc – 日付の計算にもサンプルが。
    日付の不正を確認、指定した月の日数を取得、タイムスタンプを取得など。