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 keys告诉我们:

哈希的键以明显随机的顺序返回。实际的随机顺序在 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,那么您需要对字段名称进行硬编码并使用占位符作为值,除非您想从小Bobby Tables访问。)

于 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 回答