【问题标题】:Reading Input File and Putting It Into An Array with Space Delimiter in Perl在 Perl 中读取输入文件并将其放入带有空格分隔符的数组中
【发布时间】:2012-03-11 13:14:04
【问题描述】:

我正在尝试使用 @ARGV 数组获取输入文件,并将其所有元素写入 perl 中带有分隔符空间的数组。

示例输入参数是一个txt文件例如:

0145 2145
4578 47896
45 78841
1249 24873

(有多行但这里没有显示) 问题是:

  1. 我不知道如何将例如 ARG[0] 转换为数组
  2. 我想将该输入文件的每个字符串都作为单个字符串,换句话说,第 1 行 0145 2145 将不是一个字符串,而是两个用空格分隔的不同字符串。

【问题讨论】:

    标签: perl input delimiter argv


    【解决方案1】:

    我想这就是你想要的。此代码中的@resultarray 最终将包含一个数字列表。

    如果您要为程序提供一个文件名以用作命令行输入,请将其从 ARGV 数组中取出并作为文件句柄打开:

    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 数组中,因此该数组将如下所示:

    @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 中的下一个元素。有关班次的更多详细信息,请参阅perldoc。还有更多关于open的信息。

    【讨论】:

    • 非常感谢,但我想查看数组的元素,所以当我写 foreach $value (@resultarray) { print($value); } 然后它会给出错误,比如全局符号“$value”需要在 c:\users 处显示包名......我如何打印元素
    • 还有你的代码,错误是imageshack.us/photo/my-images/341/asdasdfasfagfq.png
    • 打印时出现的错误是use warnings pragma 的结果。它要求您在开始时使用包名称定义所有变量。所以在你的情况下,你必须写my $value而不是$value。以这种方式编写 perl 代码是一个非常好的主意,因为一旦你习惯了它,你将花费更少的时间来调试你的程序。
    • 另一个错误是因为你需要使用命令行形式test1.pl inputfile.txt而不是test1.pl &lt; inputfile.txt。在命令行上使用&lt; 将输入文件传递给STDIN 文件句柄。但是 perl 也会在执行命令之后接受字符串参数。这些是 @ARGV 数组中的内容。
    • 现在可以了。非常感谢,这正是我想要的
    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2011-11-30
    • 2015-07-05
    相关资源
    最近更新 更多