用Perl打印数组
目前,我有我的Perl脚本来读取fstab文件,按列将它们拆分,并搜索每列中显示它的最长单词。所有的工作都很顺利(我想),我的问题是,它每行打印出的长度都是相同的,这是不正确的。示例$dev_parts prints 24和$labe_parts prints 24,依此类推 下面是我的代码用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
#!/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>) {