Perl で改行やカンマを含むデータをCSVファイルに書き出す方法

コードの解説 – 関数部分

改行やカンマが出てきた時のフィールドの変換を行っているのが以下の関数です。

sub escape4txt{
    my $str = shift;
    defined $str or return '';
    return $str unless ($str =~ /[,"\r\n\t]/);
    $str =~ s/"/""/g;
    $str =~ s/\r\n/\n/g;
    return "\"$str\"";
}

順に解説します。

まず値を受けます。

    my $str = shift;

変換の必要が無ければそのまま引数を返します。
(文字列が定義されていない場合と、特殊文字が無い場合。)

    defined $str or return '';
    return $str unless ($str =~ /[,"\r\n\t]/);

クオートがあればクオートはエスケープします。

    $str =~ s/"/""/g;

値中の CR+LF は LF に変更します。フォーム送信の際の標準の「改行コード」は CR+LF なので、CGI で送信された値を受ける場合、この変換が必要です。

    $str =~ s/\r\n/\n/g;

変換済の値をクオートで括って返します。

    return "\"$str\"";