1

私はコードを使用します:

$data_read=$port_obj->read($buffer);
print "$data_read\n";

出力は次のようになります。

T=3420499518  A=914 B=97 C=49 D=436 E=428 F=863 G=34 H=771 I=214 J=493 K=165

私はこれに入れたい:

$T,$A,$B,$C,$D,$E,$F,$G,$H,$I,$J,$K

だから私はそれをMySQLデータベースに書くことができます。どうすればいいのですか ?

私のデータベースハンドラー:

$query = "INSERT INTO myhouse (T,A,B,C,D,E,F,G,H,I,J,K)
          VALUES ($T,$A,$B,$C,$D,$E,$F,$G,$H,$I,$J,$K)";

$query_handle = $connect->prepare($query);

$query_handle->execute();
4

4 に答える 4

5

データ値をハッシュに格納し、準備されたSQLステートメントでプレースホルダーを使用して、ハッシュスライスをexecuteメソッドに渡す必要があります。

コードは次のようになります

my $data_read = 'T=3420499518  A=914 B=97 C=49 D=436 E=428 F=863 G=34 H=771 I=214 J=493 K=165';

my %data = $data_read =~/([A-Z0-9]+)/g;

my $query_handle = $connect->prepare(<<SQL);
INSERT INTO myhouse (T,A,B,C,D,E,F,G,H,I,J,K)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
SQL

$query_handle->execute(@data{ qw/ T A B C D E F G H I J K / });
于 2012-05-22T05:07:34.337 に答える
2

Jonathan Leffler の回答へのコメントを拡張すると、perldoc キーは次のことを示しています。

ハッシュのキーは明らかにランダムな順序で返されます。実際のランダムな順序は、Perl の将来のバージョンで変更される可能性がありますが、 or 関数が生成する順序と同じであることが保証されていますvalueseach(ハッシュが変更されていない場合)。

(私の強調)これは、ハッシュを使用して、コードで明示的に列挙する必要なく、すべてのフィールド名とそれに関連する値を収集できることを意味します。

#!/usr/bin/env perl

use 5.010;
use strict;
use warnings;

my $in = 'T=3420499518  A=914 B=97 C=49 D=436 E=428 F=863 G=34 H=771 I=214 J=493 K=165';

my %data = $in =~ /([A-Z])=([0-9]+)/g;

my $query = 'INSERT INTO myhouse (' . join(',', keys %data)
          . ') VALUES (' . join(',', values %data) . ')';

say $query;

(元の質問に対するコメントで TLP が言及したように、これは安全であることに注意してください入力する正規表現%dataは、キーがすべて単一の大文字であり、値が英語の数字のみで構成されることを保証するためです。悪意のある入力によって制御されていないキーまたは%dataが.

于 2012-05-22T09:48:44.357 に答える
1

それらを個別に名前が付けられた変数に入れることが最良の選択であるかどうかはわかりませんが、顧客は常に正しいです:

use strict;
use warnings;

my $data_read = "T=3420499518  A=914 B=97 C=49 D=436 E=428 F=863 G=34 H=771 I=214 J=493 K=165";

my $data = $data_read;
$data =~ s/[A-KT]=//g;

print "$data\n";

my($T,$A,$B,$C,$D,$E,$F,$G,$H,$I,$J,$K) = split /\s+/, $data;

my $query = "INSERT INTO myhouse (T,A,B,C,D,E,F,G,H,I,J,K) VALUES\n" .
            "($T,$A,$B,$C,$D,$E,$F,$G,$H,$I,$J,$K)";

print "$query\n";

print "\nAlternative:\n";
my(@list) = split /\s+/, $data;
print "@list\n";

my $query2 = "INSERT INTO myhouse (T,A,B,C,D,E,F,G,H,I,J,K)\nVALUES(" .
             join(",", @list) . ")";

print "$query2\n";

このスニペットを実行すると、次のようになります。

3420499518  914 97 49 436 428 863 34 771 214 493 165
INSERT INTO myhouse (T,A,B,C,D,E,F,G,H,I,J,K) VALUES
(3420499518,914,97,49,436,428,863,34,771,214,493,165)

Alternative:
3420499518 914 97 49 436 428 863 34 771 214 493 165
INSERT INTO myhouse (T,A,B,C,D,E,F,G,H,I,J,K)
VALUES(3420499518,914,97,49,436,428,863,34,771,214,493,165)

スクリプトの後半では、配列を使用して読み込まれた値を保持する、より単純な代替方法を示しています。

明らかに、必要に応じて、値がすべての変数に割り当てられていることや、その他のエラーチェックを確認できます。

于 2012-05-22T03:41:34.187 に答える
0

私はこのようにそれが好きです:

use strict;
use warnings;

my $data_read = "T=3420499518  A=914 B=97 C=49 D=436 E=428 F=863 G=34 H=771 I=214 J=493 K=165";
my %data = split(/\s+|=/, $data_read);

my @cols = keys %data;
my $cols = join(', ', @cols);
my $placeholders = join(', ', ('?')x scalar @cols );

my $query = "INSERT INTO table ($cols) VALUES ($placeholders)";
    # execute like this:
# $dbh->do($query, undef, @data{@cols});

print "$query\n";
于 2012-05-22T10:02:35.893 に答える