免费注册 查看新帖 |

Chinaunix

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

请大家指点一下:怎样将文件写入有文件头代表的列数组? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-03 18:24 |只看该作者 |倒序浏览
seconds      Primitive        Delta    Count - Type
167265        SATA_SOF        252      Host -> Dev
167290         SATA_SOF        286      Host -> Dev
167294         SATA_SOF        115      Host -> Dev
167409         SATA_SOF        131      Host -> Dev
167542         SATA_SOF        194      Host -> Dev
167737        SATA_SOF        183      Host -> Dev
167921         SATA_SOF        134      Host -> Dev
怎样将上述文件写入数组@seconds      @Primitive        @Delta    @Count - Type中?
即用列来表示。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
2 [报告]
发表于 2008-12-03 19:14 |只看该作者

  1. #!/usr/bin/perl
  2. #
  3. open FH, "data" or die "open 'data': $!";

  4. while (<FH>) {
  5.     chomp;

  6.     if ($. == 1) {
  7.         @col = (split)[0 .. 3, 5];
  8.         next;
  9.     }

  10.     $i = $. - 2;
  11.     ($col[0]->[$i], $col[1]->[$i], $col[2]->[$i], $col[3]->[$i], $col[4]->[$i]) = (split)[0 .. 3, 5];
  12. }

  13. print join("\t", @col), "\n";
  14. for (0 .. $i) {
  15.     printf ("%s\t%s\t%s\t%s\t%s\t\n",
  16.                $seconds[$_],
  17.                $Primitive[$_],
  18.                $Delta[$_],
  19.                $Count[$_],
  20.                $Type[$_],
  21.            );
  22. }

  23. print "-" x 60, "\n";
  24. for $n (0 .. $i) {
  25.     printf ("%s\t%s\t%s\t%s\t%s\t\n",
  26.                $col[0]->[$n],
  27.                $col[1]->[$n],
  28.                $col[2]->[$n],
  29.                $col[3]->[$n],
  30.                $col[4]->[$n],
  31.            );
  32. }

  33. close FH;

  34. __END__
  35. print "-" x 60, "\n";
  36. seek FH, 0, 0;
  37. while (<FH>) {
  38.     print && next if $. == 1;
  39.     chomp;

  40.     $i = $. - 2;
  41.     ($seconds[$i], $Primitive[$i], $Delta[$i], $Count[$i], $Type[$i]) = (split)[0 .. 3, 5];
  42. }
  43. for (0 .. $i) {
  44.     printf ("%s\t%s\t%s\t%s\t%s\t\n",
  45.                $seconds[$_],
  46.                $Primitive[$_],
  47.                $Delta[$_],
  48.                $Count[$_],
  49.                $Type[$_],
  50.            );
  51. }
  52. close FH;
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-12-03 22:47 |只看该作者

回复 #2 ynchnluiti 的帖子

楼上辛苦了!不过还想问一下
$i = $. - 2;
    ($col[0]->[$i], $col[1]->[$i], $col[2]->[$i], $col[3]->[$i], $col[4]->[$i]) = (split)[0 .. 3, 5];
)是什么意思?为什么是[0 .. 3, 5];而不是0..4.?其中Count - Type是一个单元,我想一起放在$col[3]->[$i]中, 但是去掉$col[4]->[$i]也不行,该怎样改程序?


[ 本帖最后由 qinyu2008 于 2008-12-3 22:57 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
4 [报告]
发表于 2008-12-03 23:42 |只看该作者
原帖由 qinyu2008 于 2008-12-3 22:47 发表
楼上辛苦了!不过还想问一下
$i = $. - 2;
    ($col[0]->[$i], $col[1]->[$i], $col[2]->[$i], $col[3]->[$i], $col[4]->[$i]) = (split)[0 .. 3, 5];
)是什么意思?为什么是[0 .. 3, 5];而不是0..4.?其中 ...

我看你贴的内容Count - Type中-前后各有一个空格,split默认使用/\s+/切分字段。所以(split)[4]的内容是->,代码中忽略了。

如果Count - Type 中-前后有空格吧?

  1. #!/usr/bin/perl
  2. #
  3. open FH, "data" or die "open 'data': $!";

  4. while (<FH>) {
  5.     chomp;

  6.     @fields = split;
  7.     if ($. == 1) {
  8.         @col = (@fields[0 .. 2], "$fields[3]$fields[5]");
  9.         next;
  10.     }

  11.     $i = $. - 2;
  12.     ($col[0]->[$i], $col[1]->[$i], $col[2]->[$i], $col[3]->[$i]) = (@fields[0..2], "@fields[3..5]");
  13. }

  14. print join("\t", @col), "\n";
  15. for $n (0 .. $i) {
  16.     printf ("%s\t%s\t%s\t%s\t\n",
  17.             $col[0]->[$n],
  18.             $col[1]->[$n],
  19.             $col[2]->[$n],
  20.             $col[3]->[$n],
  21.            );
  22. }
  23. #print "-" x 60, "\n";
  24. #for (0 .. $i) {
  25. #    printf ("%s\t%s\t%s\t%s\t%s\t\n",
  26. #            $seconds[$_],
  27. #            $Primitive[$_],
  28. #            $Delta[$_],
  29. #            $CountType[$_],
  30. #           );
  31. #}
  32. #
  33. close FH;
复制代码

论坛徽章:
0
5 [报告]
发表于 2008-12-04 09:29 |只看该作者
其中 $col[0]->[$i]  写成 ${col[0]}[$i]  可以吗

论坛徽章:
0
6 [报告]
发表于 2008-12-04 10:33 |只看该作者

回复 #2 ynchnluiti 的帖子

请教

#!/usr/bin/perl -w
use warnings;

my @array1;
my @seconds;
open (han1,"list") or die ("Can't open the file.");

while(<han1>){
push @array1,[ split ];
}
print "-------------------------\n";
foreach (@array1){
print "@$_\n";
}
print "-------------------------\n";
for(my $i=0;$i<6;$i++){
@seconds=$array1[$i][0];       为什么不能通过这样给一个数据
}
#print "$array1[2][0]\n";
print "$seconds[0]\n";
print "$seconds[1]\n";

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
7 [报告]
发表于 2008-12-04 12:56 |只看该作者
原帖由 bitterness 于 2008-12-4 10:33 发表
请教

#!/usr/bin/perl -w
use warnings;

my @array1;
my @seconds;
open (han1,"list") or die ("Can't open the file.");

while(){
push @array1,[ split ];
}
print "----------------------- ...

不能这么给数组赋值。
@seconds=$array1[$i][0];   相当于 @seconds= ( $array1[$i][0] );#只有一个元素的列表

数组赋值:
$array[@array] = value;
@array = ( list );
push @array, list,
引用等方式

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
8 [报告]
发表于 2008-12-04 13:00 |只看该作者
原帖由 machine 于 2008-12-4 09:29 发表
其中 $col[0]->[$i]  写成 ${col[0]}[$i]  可以吗

可以啊。

论坛徽章:
0
9 [报告]
发表于 2008-12-05 19:09 |只看该作者

回复 #1 qinyu2008 的帖子

代码写的太漂亮了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP