在Perl中打印数组

时间:2013-03-27 05:10:37

标签: perl

我目前有我的Perl脚本来读取fstab文件,按列拆分它们并搜索每列中最长的单词来显示它。所有这些都有效(我认为),我遇到的问题是它为每一行打印出相同的长度而不是真的。示例$ dev_parts打印24,$ labe_parts打印24,依此类推......

下面是我的代码。

  #!/usr/bin/perl
  use strict;

  print "Enter file name: \n";
  my $file_name = <STDIN>;
  open(IN, "$file_name");

  my @parts = split( /\s+/, $file_name);
  foreach my $usr_file (<IN>) {
      chomp($usr_file);
      @parts = split( /\s+/, $usr_file);
      push(@dev, $parts[0]);
      push(@label, $parts[1]);
      push(@tmpfs, $parts[2]);
      push(@devpts, $parts[3]);
      push(@sysfs, $parts[4]);
      push(@proc, $parts[5]);
  }

  foreach  $dev_parts (@dev) {
      $dev_length1 = length ($parts[$dev_parts]);
      if ( $dev_length1 > $dev_length2) {
              $dev_length2 = $dev_length1;
      }
  }
  print "The longest word in the first line is: $dev_length2 \n";

  foreach  $label_parts (@label) {
      $label_length1 = length($parts[$label_parts]);
      if ($label_length1 > $label_length2) {
              $label_length2 = $label_length1;
      }
  }
  print "The longest word in the first line is: $label_length2 \n";

2 个答案:

答案 0 :(得分:1)

这是您的代码应该是

的方式
  #!/usr/bin/perl
  use strict;
  use warnings;
  use Data::Dumper;

  print "Enter file name: \n";
  my $file_name = <STDIN>;
  chomp($file_name);
  open(FILE, "$file_name") or die $!;

  my %colhash;
  while (<FILE>) {
      my $col=0;
      my @parts = split /\s+/;

      map { my $len = length($_);
        $col++;
        if($colhash{$col} < $len ){ 
            $colhash{$col} = $len;    # store the longest word length for each column
        } 
    } @parts;      
  }

print Dumper(\%colhash);

答案 1 :(得分:0)

你在这里犯了错误:

foreach  $dev_parts (@dev) {
     $dev_length1 = length ($parts[$dev_parts]);

据我了解,您正在寻找@dev中最长的元素。但是,您从@parts数组中获取元素的长度。此数组始终设置为文件的最后一行。因此,您要查看文件最后一行中的每个元素,而不是相应列的每个元素。

您只需要改为length($dev_parts)

顺便提一下,这是一种更简单的方法来查找数组中最长的长度:

use List::Util qw/max/; #Core module, always available.

my $longest_dev = max map {length} @dev;

关于您的代码的其他一些评论:

use strict;很好。你还应该use warnings;。我会帮你的    你在代码中发现了愚蠢的错误。

每次打开文件时都应该检查错误:

open(IN, $file_name) or die "Failed to open $file_name: $!";

更好的是,使用首选的开放语法和词法文件句柄:

open(my $in_file, '<', $file_name) or die "Failed to open $file_name: $!";
...
while (<$in_file>) { 

我不确定你在这里要做什么:

my @parts = split( /\s+/, $file_name);

您正在按空格分割文件名,但不要将其用于任何内容。然后你重新使用相同的数组来保存这些行。

当您浏览文件行时,while循环优先于foreach。它节省了内存,因为它不会首先将整个文件读入内存(而且它完全相同)。

while (my $usr_file = <IN>) {