Как я могу извлечь значения после = в моей строке с Perl? - PullRequest
3 голосов
/ 10 июля 2009

У меня есть такая строка

field1=1 field2=2 field3=abc

Я хочу вывести это как

2,1,abc

Есть идеи, как мне это сделать? Я могу написать небольшую C или Java программу для этого, пытаясь найти простой способ сделать это в Perl.

Ответы [ 11 ]

6 голосов
/ 10 июля 2009
use strict;
use warnings;

my $string = 'field1=1 field2=2 field3=abc';
my @values = ($string =~ m/=(\S+)/g);
print join(',', @values), "\n";
5 голосов
/ 10 июля 2009
#!/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 голосов
/ 10 июля 2009
 $_='field1=1 field2=2 field3=abc';
 $,=',';
 say /=(\S+)/g

Давайте играть в гольф Perl: D

2 голосов
/ 10 июля 2009

Использовать 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
1 голос
/ 10 июля 2009
my $str = 'field1=1 field2=2 field3=abc';
print(join(',', map { (split('=', $_))[1] } split(' ', $str)));
1 голос
/ 10 июля 2009

Есть несколько способов сделать это:

  • Регулярное совпадение
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 голосов
/ 22 июля 2009

Если вам действительно нужны и ключи, и значения. Я бы положил их в хеш. Вы можете просто захватить обе стороны "=" и поместить непосредственно в хеш.

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
---
field1: 1
field2: 2
field3: abc

Для получения дополнительной информации, пожалуйста, прочитайте perldoc perlre.

Если вы только начинающий, вы можете прочитать perldoc perlretut.

0 голосов
/ 11 июля 2009
$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 голосов
/ 10 июля 2009
my $a = "field1=1 field2=2 field3=abc";
my @f = split /\s*\w+=/, $a;
shift(@f);
print join(",", @f), "\n";
0 голосов
/ 10 июля 2009

Perl определенно подходит для этого.


#! /usr/bin/perl

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