假设我有一个file.txt,这个文件语法是这样的:
"1;22;333;'4444';55555",
我现在希望我的代码执行以下操作:
;
分隔的每个参数保存到变量中($ one = 1,$ two = 22,$ 3 = 333,$ 4 =' 4444',$ 5 = 55555;)所以我实际上需要第2步的帮助,我想我能够做Loop和DB代码。你们有什么想法或提示我怎么做到这一点?初学友好会很好,所以我可以从中学到东西。
foreach $file (@file){
$currentfile = "$currentdir\\$file";
open(my $reader, "<", $currentfile) or die "Failed to open file: $!\n";
?????
close $reader;
}
答案 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 = ...
。