如何使用 Perl 提取字符串中 = 之后的值?

问题描述 投票:0回答:12

我有一个这样的字符串

field1=1 field2=2 field3=abc

我想将其输出为

2,1,abc

我有什么想法可以解决这个问题吗?我可以编写一个小型 C 或 Java 程序来执行此操作,尝试找到一种在 Perl 中执行此操作的简单方法。

perl string extract
12个回答
6
投票
use strict;
use warnings;

my $string = 'field1=1 field2=2 field3=abc';
my @values = ($string =~ m/=(\S+)/g);
print join(',', @values), "\n";

5
投票
#!/usr/bin/perl

use strict;
use warnings;

# Input string
my $string = "field1=1 field2=2 field3=abc";
# Split string into a list of "key=value" strings
my @pairs = split(/\s+/,$string);
# Convert pair strings into hash
my %hash = map { split(/=/, $_, 2) } @pairs;
# Output hash
printf "%s,%s,%s\n", $hash{field2}, $hash{field1}, $hash{field3};   # => 2,1,abc
# Output hash, alternate method
print join(",", @hash{qw(field2 field1 field3)}), "\n";

2
投票

在列表上下文中使用

m//g

#!/usr/bin/perl

use strict;
use warnings;

my $x = "field1=1 field2=2 field3=abc";

if ( my @matches = $x =~ /(?:field[1-3]=(\S+))/g ) {
    print join(',', @matches), "\n";
}

__END__

输出:

C:\Temp> klm
1,2,abc

2
投票
 $_='field1=1 field2=2 field3=abc';
 $,=',';
 say /=(\S+)/g

我们来打 Perl 高尔夫吧 :D


1
投票
my $str = 'field1=1 field2=2 field3=abc';
print(join(',', map { (split('=', $_))[1] } split(' ', $str)));

1
投票

有多种方法可以做到这一点:

  • 正则表达式匹配
my $s = "field1=1 field2=2 field3=abc";
$s =~ /field1=(\w*) field2=(\w*) field3=(\w*)$/; //pick out each field
print $1,$2,$3;'
12abc
  • 根据匹配拆分字符串
my $s = "field1=1 field2=2 field3=abc"; 
my @arr = split / /, $s; print @arr,"\n"; //make an array of name=value pairs
my @vals = map { @pairs = split /=/, $_; $pairs[1] } @arr;  //get the values only from each pair
print @vals'
field1=1field2=2field3=abc
12abc
  • 拆分并放入哈希(我认为这是最有用的)
my $s = "field1=1 field2=2 field3=abc"; 
my @arr = split / /, $s;  
my %pairs = map { split=/, $_; } @arr; 
print $pairs{field1}, $pairs{field2}, $pairs{field3}
12abc

0
投票

假设您的订单有误:


#!/usr/bin/perl
use strict; use warnings;

my $str='a=1 b=2 c=abc';
my @v;
while ($str =~ /=(\S+)/g) {
    push @v, $1;
}
print join (',', @v);

0
投票

Perl 绝对是最合适的工具。


#! /usr/bin/perl

$str = "field1=1 field2=2 field3=abc";
$str =~ /field1=(\S+)\ field2=(\S+)\ field3=(\S+)/;
print "$1,$2,$3", "\n";

0
投票
my $a = "field1=1 field2=2 field3=abc";
my @f = split /\s*\w+=/, $a;
shift(@f);
print join(",", @f), "\n";

0
投票
$string="field1=1 field2=2 field3=abc";
@s=split /\s+/,$string;
$temp=$s[1];$s[1]=$s[0];$s[0]=$temp;
foreach (@s){s/.*=//; push(@a,$_ );}
print join(",",@a);

0
投票

如果您确实需要键和值。我会把它们放入哈希中。您可以捕获“

=
”的两侧,然后直接放入哈希中。

use strict;
use warnings;

my $str = 'field1=1 field2=2 field3=abc';

my %fields = $str =~ / (\S+) \s* = \s* (\S+) /xg;

use YAML;
print Dump \%fields
---
字段1:1
字段2:2
字段3:abc

欲了解更多信息,请阅读

perldoc perlre

如果您只是初学者,您可能想阅读

perldoc perlretut


0
投票

您可以使用

\K
重置比赛开始,然后反转前2个结果:

use strict;
use warnings;

my $str = 'field1=1 field2=2 field3=abc';
my @values = $str =~ m/=\K\S+/g;

if (@values > 1) {
    @values[0, 1] = reverse @values[0, 1];
}
print join(',', @values), "\n";

输出

2,1,abc

如果等号之前必须至少有一个除

=
之外的非空白字符,并且等号之后的匹配中没有
=
,则可以使用否定字符类来排除它:

[^\s=]=\K[^\s=]+
© www.soinside.com 2019 - 2024. All rights reserved.