我将尝试使用@ARGV
数组读取输入文件,并在perl中用空格作为分隔符将所有元素写入一个数组。
示例输入参数是一个文本文件,例如:
0145 2145
4578 47896
45 78841
1249 24873
问题是:
- 我不知道如何将ARG [0]作为数组
- 我想将输入文件中的每个字符串作为单独的字符串,换句话说,第一行0145 2145不会成为一个字符串,而是通过用空格分隔成两个不同的字符串。
@resultarray
将最终保存数字列表。my $filename = $ARGV[0];
open(my $filehandle, '<', $filename) or die "Could not open $filename\n";
一旦你拥有了文件句柄,你可以使用while循环遍历文件的每一行。 chomp
函数会将每一行结尾的换行符移除。使用split
函数基于空格将每一行分割成一个数组(在我的代码中是@linearray
),其中包含该行内的数字列表。然后我使用push
函数将我的行数组添加到@resultarray
的末尾。
my @resultarray;
while(my $line = <$filehandle>){
chomp $line;
my @linearray = split(" ", $line);
push(@resultarray, @linearray);
}
记得添加
use warnings;
use strict;
在你的Perl文件顶部加入此行代码,可以帮助你在编写代码时解决问题。
为了澄清如何处理程序中不同的输入,可以使用以下命令:
perlfile.pl < inputfile.txt
将inputfile.txt中的内容传输到STDIN
文件句柄。然后,您可以使用此文件句柄访问inputfile.txt的内容。
while(my $line = <STDIN>){
# do something with this $line
}
但是,您也可以在执行命令后将要读取的文件名一起提供给程序:
perlfile.pl inputfile1.txt inputfile2.txt
@ARGV:
[0] => "inputfile1.txt"
[1] => "inputfile2.txt"
由于这些只是文件的名称,您需要在perl中打开文件,然后才能访问文件的内容。因此,对于inputfile1.txt:
my $filename1 = shift(@ARGV);
open(my $filehandle1, '<', $filename1) or die "Can't open $filename1";
while(my $line = <$filehandle1>){
# do something with this line
}
注意我这次使用了shift
来获取数组@ARGV中的下一个元素。有关shift的更多细节,请参阅perldoc。还可以在open上获取更多信息。
use warnings
编译指示的结果。它要求你在开头使用包名称定义所有变量。因此,在您的情况下,您必须写成my $value
而不是$value
。以这种方式编写Perl代码是一个非常好的主意,因为一旦你习惯了它,你将花费更少的时间调试程序。 - MattLBecktest1.pl inputfile.txt
,而不是test1.pl < inputfile.txt
。在命令行上使用<
将输入文件传递给STDIN
文件句柄。但是 Perl 也会接受执行命令后的字符串参数。这些参数将进入 @ARGV 数组中。 - MattLBeck