0

我目前有我的 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";
4

2 回答 2

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);
于 2013-03-27T09:06:54.763 回答
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>) {
于 2013-03-27T10:24:18.833 回答