Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Perl打印数组_Perl - Fatal编程技术网

用Perl打印数组

用Perl打印数组,perl,Perl,目前,我有我的Perl脚本来读取fstab文件,按列将它们拆分,并搜索每列中显示它的最长单词。所有的工作都很顺利(我想),我的问题是,它每行打印出的长度都是相同的,这是不正确的。示例$dev_parts prints 24和$labe_parts prints 24,依此类推 下面是我的代码 #!/usr/bin/perl use strict; print "Enter file name: \n"; my $file_name = <STDIN>; open

目前,我有我的Perl脚本来读取fstab文件,按列将它们拆分,并搜索每列中显示它的最长单词。所有的工作都很顺利(我想),我的问题是,它每行打印出的长度都是相同的,这是不正确的。示例$dev_parts prints 24和$labe_parts prints 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";
#/usr/bin/perl
严格使用;
打印“输入文件名:\n”;
我的$file_name=;
打开(在“$file_name”中);
my@parts=split(/\s+/,$file\u name);
foreach我的$usr\u文件(){
chomp($usr_文件);
@零件=拆分(/\s+/,$usr\u文件);
推送(@dev,$parts[0]);
推送(@label,$parts[1]);
推送(@tmpfs,$parts[2]);
推送(@devpts,$parts[3]);
push(@sysfs,$parts[4]);
推送(@proc,$parts[5]);
}
foreach$dev_部件(@dev){
$dev_length1=长度($parts[$dev_parts]);
如果($dev_length 1>dev_length 2){
$dev_length2=$dev_length1;
}
}
打印“第一行中最长的单词是:$dev_length2\n”;
foreach$label\u零件(@label){
$label_length1=长度($parts[$label_parts]);
如果($label\U length1>label\U length2){
$label_length2=$label_length1;
}
}
打印“第一行中最长的单词是:$label_length2\n”;

这就是你的代码应该是什么样子

  #!/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);
#/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
打印“输入文件名:\n”;
我的$file_name=;
chomp($file_name);
打开(文件“$FILE_name”)或死亡$!;
我的%colhash;
而(){
我的$col=0;
我的@parts=split/\s+/;
map{my$len=length($\ux);
$col++;
如果($colhash{$col}<$len){
$colhash{$col}=$len;#存储每列的最长字长
} 
}@零件;
}
打印转储程序(\%colhash);

您这里有一个错误:

foreach  $dev_parts (@dev) {
     $dev_length1 = length ($parts[$dev_parts]);
据我所知,您正在
@dev
中查找最长的元素。但是,可以从
@parts
数组中获取元素的长度。此数组始终设置为文件的最后一行。因此,您查看的是文件最后一行中的每个元素,而不是相应列中的每个元素

你只需要取
长度($dev\u parts)

顺便说一句,这里有一种查找数组中最长长度的简单方法:

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

my $longest_dev = max map {length} @dev;
关于代码的其他一些注释:

使用严格很好。您还应该
使用警告。这会有帮助的
你在代码中发现了愚蠢的错误

无论何时打开文件,都应检查错误:

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>) { 
您正在用空格分割文件名,但您不会将其用于任何用途。然后,您将再次使用相同的数组来保留这些行

当您浏览文件的行时,首选
while
循环而不是
foreach
。它节省内存,因为它不会先将整个文件读入内存(在其他方面完全相同)

while(我的$usr\u文件=){

您需要精简代码并创建一个。发布与问题相关的代码。这些
打印数组
语句在哪里?编辑了示例,并重新措辞了问题。对于最初的错误,我深表歉意。您继续犯错误。您既不打印
$dev\u parts
也不打印
$label\u parts
。此外,这些不是长度,t它们用作数组索引。同时,它们也用作同一数组中的数组索引
@parts
。那么为什么它们不打印相同的值呢?另外,您也不会为
$dev_length2
$label_length2
分配任何内容,这意味着如果未打开
警告
,它们会自动转换为0。这是我的建议手势:添加
use warnings
并修复出现的警告。添加变量的
use Data::Dumper
并添加
print Dumper\@parts
etc语句以查看它们包含的内容。
my @parts = split( /\s+/, $file_name);
while (my $usr_file = <IN>) {