Perl删除引号和空格

时间:2020-05-11 18:06:13

标签: arrays regex perl

我正在尝试将信息从文件推送到数组。 我有一个看起来像这样的文件:

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个小时,所以认为是时候寻求帮助了。

2 个答案:

答案 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'
          ]
        ];
相关问题