1

使用:Perl v5.10.1、MySQL 5.5.15、DBI。

データベースからのエンドユーザー出力を電子メールで配信する必要があります。彼らはこれをアタッチメントとしてではなく、体の中に望んでいます。

アスキーテーブルでデータを配信したいのですが、DBIにこれを行うための関数が組み込まれているかどうかを判断するのに問題があります(コマンドラインからのMySQLのクエリと同様の出力)。

または、行の最長文字長を判別できる場合は、それを使用してテーブルを作成できます。配列内のアイテムの最大長を取得する方法はありますが、クエリ結果で頭を悩ませることはできません。

my $spacer_length = (reverse sort { $a <=> $b } map { length($_) } @array)[0];
4

2 に答える 2

5

一般的なDBIループを想定すると、次のようなことができます。

use List::Util qw(max);

...
my @output;
my $max;
while (my @foo = $dbi->fetchrow_array) {
    $max = max($max // (), map length, @foo);
    push @output, \@foo;           # save data for email attachment
}

「defined-or」演算子を使用して、負の値の場合の警告および汚染の可能性//を回避します。undef

于 2012-10-01T19:35:19.797 に答える
0

何を求めているのか正確にはわかりませんが、クエリ結果の特定の列の「最大行文字長」を探している場合は、SQLを使用してそれを行うことができます。

SELECT MAX(CHAR_LENGTH(col1)) FROM t1

または、すべての行をcol1の値の長さでソートする場合。

SELECT col1,col2 from t1 ORDER BY CHAR_LENGTH(col1) DESC

次のようにDBIを使用してこれらのクエリを実行できます。

# $mysql is your DBI connection info
my $query = $mysql->prepare("SELECT col1,col2 from t1 ORDER BY CHAR_LENGTH(col1) DESC");
$query->execute();

次に、結果の行を繰り返し処理します。

while ( my @result = $query->fetchrow_array ) {

    my ($col1,$col2) = @result;
    # do stuff with the values

}

また、コマンドラインmysqlクライアントからの出力など、必要に応じて値を出力できます。

于 2012-10-01T21:16:27.987 に答える