【问题标题】:Perl strip off quotes and spacesPerl 去掉引号和空格
【发布时间】:2020-08-27 09:12:33
【问题描述】:

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

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);

但我得到的只是:

$VAR1 = '';
$VAR2 = '"Something"';
$VAR3 = '';
$VAR4 = '"One more time"';

所以数字不见了,引号仍然存在.....试图解决这个谜题大约 3 小时,所以认为是时候寻求帮助了。

【问题讨论】:

  • stipstrip 是两个不同的名称。

标签: arrays regex perl


【解决方案1】:

grep 仅返回表达式为其返回 true 的列表元素。 s/// 如果没有可替换的内容,则返回 false,因此不会从 grep 返回数字。

不要使用grep 来更改列表的元素。这就是map 的用途:

@stripArray = map s/\s+$//r, @resultarray;

您还可以在分隔符中包含空格,这样您以后就不必删除空格:

my @linearray = split /\s*=>\s*/, $line;

【讨论】:

  • 所以它有助于空格和数字,但引号仍然存在。 my @stripArray = map s/^'([^']*)'$/$1/, @resultarray;我尝试像这样删除它,但整个字符串消失了。
  • @semikus:您缺少返回替换结果而不是修改字符串的/r 部分。
【解决方案2】:

输入数据很容易用正则表达式处理,提取感兴趣的信息放入数组中

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'
          ]
        ];

【讨论】:

  • 更好地匹配示例并检查错误:my @data = /^(\S+)\s+=&gt;\s+"(.*?)"\s*$/ or warn "unexpected input: $_";
  • @ysth -- 如果第一个数字前面是一个或多个空格字符怎么办?
  • 然后也添加。但仅仅去掉锚就可以让它匹配各种它可能不应该的东西
  • @ysth -- 那么带有数据的文件应该有规范应该在其中的内容。 OP 没有提供这样的规范,并且假设不会出现其他数据变化形式。
猜你喜欢
  • 2019-08-19
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2014-04-07
相关资源
最近更新 更多