我目前有我的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";
答案 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>) {