0

現在、fstab ファイルを読み取り、それらを列ごとに分割し、各列のどの単語が最も長いかを検索して表示する Perl スクリプトがあります。それはすべて桃色に機能します(私が思うに)、私が抱えている問題は、すべての行で同じ長さを出力し続けることです。これは真実ではありません。例 $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 構文を使用することです。

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 に答える