免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6396 | 回复: 19
打印 上一主题 下一主题

如何从数据库取出内容,动态生成二维数组,并打印出这个数组中的元素 [复制链接]

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-10 10:44 |只看该作者 |倒序浏览
我已经可以读取mysql数据库了,程序如下:
[root@mailserver tmp]# cat conn_mysql.pl
#!/usr/bin/perl -w

use strict;
use DBI;
use IO::Socket;

my $dsn = "DBI:mysql:database=test;host=localhost";
my $user = 'root';
my $password = '';
my ($dbh,$sth,@ary);

$dbh = DBI->connect($dsn,$user,$password);       #连接数据库
$sth = $dbh->prepare("select id,name,ip,port,status,stamp from t_node");   #准备
$sth->execute();                                 #执行
while(@ary = $sth->fetchrow_array()){
  print join("\t",@ary),"\n";
  # print $ary[0],"\t",$ary[1],"\t",$ary[2],"\t",$ary[3],"\t",$ary[4],"\t",$ary[5],"\n";
}                                                #打印抽取结果
$sth->finish;                                    #结束句柄
$dbh->disconnect;                                #断开

SQL语句如下:
select id,name,ip,port,status,stamp from t_node

查询的字段,有数值型,也有字符型。我想把这个SQL查询结果,保存到一个二维数组中,在后面再遍历这个二维数组。

请问该如何动态地生成这个二维数组,动态地加入每一行的数据,最后打印出这个二维数组中的每个元素呢。

本人初学Perl,对Perl很不在行,别见笑。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-09-10 11:15 |只看该作者
回复 1# 草中宝


    例如

my @rows;

while (@arr = $sth->fetchrow_array) {
    push @rows, [@arr];
}

然后 @rows 就是你要的二维数组了。

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
3 [报告]
发表于 2015-09-10 11:50 |只看该作者
MMMIX 发表于 2015-09-10 11:15
回复 1# 草中宝


可以了,MMMIX您太牛逼了。

附我通过调试的程序:
#!/usr/bin/perl -w

use strict;
use DBI;
use IO::Socket;

my $dsn = "DBI:mysql:database=test;host=localhost";
my $user = 'root';
my $password = '';
my ($dbh,$sth,@ary);
my @rows;

$dbh = DBI->connect($dsn,$user,$password);       #连接数据库
$sth = $dbh->prepare("select id,name,ip,port,status,stamp from t_node");   #准备
$sth->execute();                                 #执行
while(@ary = $sth->fetchrow_array()){
  print join("\t",@ary),"\n";
  # print $ary[0],"\t",$ary[1],"\t",$ary[2],"\t",$ary[3],"\t",$ary[4],"\t",$ary[5],"\n";

  push @rows,[@ary];
}                                                #打印抽取结果
$sth->finish;                                    #结束句柄
$dbh->disconnect;                                #断开

print "\n";

for(my $i=0;$i<scalar(@rows);$i++)
{
  for(my $j=0;$j<scalar(@{$rows[$i]});$j++)
  {
      print "$rows[$i][$j] \t";
  }
  print "\n";
}

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
4 [报告]
发表于 2015-09-10 15:31 |只看该作者
MMMIX 发表于 2015-09-10 11:15
回复 1# 草中宝



不好意思,再请教下。要是二维数组是8列的,而从数据库查询出来只有6列,那咋办呢?怎么定义变量,怎么存变量进二维数组?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2015-09-10 15:39 |只看该作者
回复 4# 草中宝


    完全不明白你在说啥。

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
6 [报告]
发表于 2015-09-10 15:57 |只看该作者
本帖最后由 草中宝 于 2015-09-10 15:58 编辑
MMMIX 发表于 2015-09-10 15:39
回复 4# 草中宝


比如说现在定义的二维数据类似下面的
my @array1=([1,2,4,5,6,7,8],[9,10,11,12,13,14,15,16],[17,18,19,20,21,22,23,24],[25,26,27,28,29,30,31,32]);

行数据是8列,但数据库从查询出来的确是6列,所以不能简单的执行下面的
push @rows, [@arr];
操作吧?

是不是应该先定义一个临时变量,把从数据库里查询出来的6个变量分别赋值,
my @rows;

my $var1 = $ary[0];
my $var2 = $ary[1];
my $var3 = $ary[2];
my $var4 = $ary[3];
my $var5 = $ary[4];
my $var6 = $ary[5];
my $var7;     #空值
my $var8;     #空值
my @var=($var1,$var2,$var3,$var4,$var5,$var6,$var7,$var8)
push @rows, @var;


论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2015-09-10 16:00 |只看该作者
草中宝 发表于 2015-09-10 15:57

但数据库从查询出来的确是6列,所以不能简单的执行下面的
push @rows, [@arr];
操作吧?


你这么做的实际结果是啥?什么地方不满足你的需求?

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
8 [报告]
发表于 2015-09-10 17:25 |只看该作者
本帖最后由 草中宝 于 2015-09-10 17:27 编辑
MMMIX 发表于 2015-09-10 16:00
你这么做的实际结果是啥?什么地方不满足你的需求?


我有两部分的数据,其中的一部分的数据(ip地址)是从数据库来的,另外一部分的数据,是根据数据库查询出来的每一行数据(ip地址),进行网络测试(通还是不通),再把这个测试结果(通还是不通)和相应的ip地址,组织在一起放到一个二维数组中。

现在只有从数据库中查询出来的ip地址,但每个ip的网络测试结果(通还是不通)数据库中是没有的,需要额外的增加。

这么说,您明白了吧?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2015-09-10 17:35 |只看该作者
回复 8# 草中宝


    不明白,不过大致能猜到你的问题是什么,估计你是以为 Perl 的 array 是定长的。但实际上Perl 的 array 长度是可变的,并不是定长的。

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
10 [报告]
发表于 2015-09-10 18:08 |只看该作者
MMMIX 发表于 2015-09-10 17:35
回复 8# 草中宝


差不多是这个意思,就是不知道怎么动态的给这个二维数组增加宽度(网络测试结果),而不仅仅是增加长度(每个IP和相应的网络测试结果)。
还请指导下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP