如何读取一行并将多个参数保存到由...分隔的变量中?

时间:2016-09-02 08:36:18

标签: perl file variables

假设我有一个file.txt,这个文件语法是这样的:

"1;22;333;'4444';55555",

我现在希望我的代码执行以下操作:

  1. 打开文件=已完成
  2. 读取行并将;分隔的每个参数保存到变量中($ one = 1,$ two = 22,$ 3 = 333,$ 4 =' 4444',$ 5 = 55555;)
  3. 这一步将把变量写入数据库,但已经完成了
  4. 循环,直到文件的所有行都完成
  5. 所以我实际上需要第2步的帮助,我想我能够做Loop和DB代码。你们有什么想法或提示我怎么做到这一点?初学友好会很好,所以我可以从中学到东西。

           foreach $file (@file){               
               $currentfile = "$currentdir\\$file";
               open(my $reader, "<", $currentfile) or die "Failed to open file: $!\n";
               ?????
               close $reader;
           }
    

2 个答案:

答案 0 :(得分:2)

如果您正在编号&#39;编号字段&#39;然后你应该思考&#39;阵列&#39;:

use Data::Dumper;
while ( <$reader> ) {  
    chomp;
    my @row = split /;/; 
    print Dumper \@row;
}

这将为您提供一个可以访问的数组 - 例如$row[0]表示第一个元素。

$VAR1 = [
          '1',
          '22',
          '333',
          '\'4444\'',
          '55555'
        ];

如果您知道标题是什么&#39;命名&#39;并且更喜欢处理名称,你可以用哈希做类似的事情:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @cols = qw ( id value fish name sprout ); 

while ( <DATA> ) {
    my %row;
    chomp;
    @row{@cols} = split /;/;
    print Dumper \%row;
}

__DATA__
1;22;333;'4444';55555

相反:

$VAR1 = {
          'fish' => '333',
          'name' => '\'4444\'',
          'id' => '1',
          'value' => '22',
          'sprout' => '55555'
        };

注意 - 哈希是无序的,但他们的全部意义在于你不需要关心“秩序”。 - 只是print $row{name},"\n";

答案 1 :(得分:1)

您需要逐行读取文件句柄$reader。请参阅教程perlopentut和完整参考open。 然后你通过分隔符; split每一行返回一个你分配给数组的列表。

open my $reader, "<", $currentfile or die "Failed to open file: $!\n";
while (my $line = <$reader>) {
    chomp($line);
    my @params = split ';', $line;
    # do something with @params, it will be overwritten on next iteration
}
close $reader;

菱形运算符 <>从文件句柄<$fh>读取,一次返回一行。了解它in perlop。当没有更多行时,它返回undef并且循环停止。您可以将它返回的字符串分配给您声明的变量(my $line),该变量仅存在于while循环的主体内。如果您不这样做,而是执行while (<$fh>),则会将该行分配给special variable $_,这是Perl中许多内容的默认设置。

chomp从行尾删除换行符(新行)。

请注意,您示例中的'4444' 是一个数字,不能这样使用。

或者,您可以在每行上使用参数对数组进行引用,并将其放在另一个数组中,这样最终将包含所有行。

my @all_params;
while (my $line = <$reader>) {
   my @params = split ';', $line;
   push @all_params, \@params;
}

现在@all_params包含引用的元素,每个元素都包含一行参数。有关如何使用引用的信息,请参阅教程perlreftut和有关复杂数据结构的Cookbook,perldsc

以下内容比较复杂,但我要提一下,因为它有点像成语。您可以在一个声明中执行上述操作

my @all_params = map { [ split ';', $_ ] } <$reader>;

这使用map,它将{ ... }中的代码应用于提交给它的列表的每个元素,并返回一个列表。因此它需要一个列表并返回已处理的列表。内部[...]创建一个匿名数组,相当于我们之前对数组所做的引用。文件句柄<$reader>列表上下文中调用时返回一个列表中文件的所有行,在这种情况下由map强加(因为它必须接收列表)

重要的一个:始终使用

启动您的程序
use warnings 'all';
use strict;

这些顺序并不重要。大多数情况下,您首先会看到use strict;

然后你的文件名循环必须是foreach my $file (@file) { ... },你必须声明所有变量,所以my $currentfile = ...