我正在尝试将信息从文件推送到数组。 我有一个看起来像这样的文件:
php_ini()
因此分隔符为1.2.3.4 => '"Something"'
5.6.7.8 => '"One more time"'
。因此,我尝试像这样将信息从文件推送到数组:
"=>"
然后我尝试删除空格和引号:
my $filename = '/root/file';
open(my $filehandle, '<', $filename) or die "Could not open $filename\n";
my @resultarray;
while(my $line = <$filehandle>){
chomp $line;
my @linearray = split("=>", $line);
push(@resultarray, @linearray);
}
但是我得到的是:
my @stripArray = grep(s/\s*$//g, @resultarray);
my @stripArray = grep(s/([^"]*)//, @stripArray);
print Dumper(@stripArray);
因此缺少数字,而引号仍然存在.....试图解决这个难题大约3个小时,所以认为是时候寻求帮助了。
答案 0 :(得分:2)
grep仅返回表达式为其返回true的列表中的元素。如果没有可替代的内容,s///
将返回false,因此不会从grep
返回数字。
请勿使用grep
更改列表的元素。这就是map
的用途:
@stripArray = map s/\s+$//r, @resultarray;
您还可以在分隔符中包含空格,这样您以后就不必删除空格了:
my @linearray = split /\s*=>\s*/, $line;
答案 1 :(得分:0)
使用正则表达式非常容易处理输入数据,提取感兴趣的信息并将其放入数组
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my @array;
while(<DATA>) {
my @data = /(\S+)\s+=>\s+"(.*?)"/;
push @array, \@data;
}
say Dumper(\@array);
__DATA__
1.2.3.4 => "Something"
5.6.7.8 => "One more time"
或相同代码的缩写版本
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my @array;
/(\S+)\s+=>\s+"(.*?)"/ && push @array, [$1,$2] while <DATA>;
say Dumper(\@array);
__DATA__
1.2.3.4 => "Something"
5.6.7.8 => "One more time"
输出
$VAR1 = [
[
'1.2.3.4',
'Something'
],
[
'5.6.7.8',
'One more time'
]
];