除非您可以保证第一个坐标始终是唯一的,否则一对的想法可以更好地表示为包含两个元素的单独数组。您也可以更容易地将相同的想法扩展到更高维的元组。
#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper;
my @tuples = ([qw(A P)], [qw(B Q)], [qw(C R)]);
my $re_tmpl = '^%s.*%s=(.)';
my @re = map qr/$_/, map sprintf($re_tmpl, @$_), @tuples;
while (my $line = <DATA>) {
last unless $line =~ /\S/;
my ($value) = map { $line =~ $_ } @re;
print $value, "\n";
}
__DATA__
A P=1 Q=2 R=3
B P=8 Q=2 R=7
C Q=2 P=1 R=3
但是,用你的方法和上面的方法,你正在执行比必要的更多的匹配操作(每行三个而不是一个)。这使得@eugene's answer更有效率。
一个更普遍的解决方案是使用:
#!/usr/bin/perl
use strict; use warnings;
my @tuples = ([qw(A P)], [qw(B Q)], [qw(C R)]);
my $re_tmpl = '^%s.*%s=(.)';
my %re;
@re{ map $_->[0], @tuples } = map qr/$_/,
map sprintf($re_tmpl, @$_),
@tuples;
while (my $line = <DATA>) {
last unless $line =~ /\S/;
my ($value) = $line =~ $re{substr $line, 0, 1};
print $value, "\n";
}
__DATA__
A P=1 Q=2 R=3
B P=8 Q=2 R=7
C Q=2 P=1 R=3
约这样做的好处是,你能适应它的尺寸的元组大于2。
此外,现在你是基于该行的第一个字符,图案选择所述模式本身变得更简单:
#!/usr/bin/perl
use strict; use warnings;
my @tuples = ([qw(A P)], [qw(B Q)], [qw(C R)]);
my $re_tmpl = '%s=(.)';
my %re;
@re{ map $_->[0], @tuples } = map qr/$_/,
map sprintf($re_tmpl, $_->[1]),
@tuples;
while (my $line = <DATA>) {
last unless $line =~ /\S/;
my ($value) = $line =~ $re{substr $line, 0, 1};
print $value, "\n";
}
__DATA__
A P=1 Q=2 R=3
B P=8 Q=2 R=7
C Q=2 P=1 R=3
甲简单的替代方法(这需要捕获所有x=y
)为:
#!/usr/bin/perl
use strict; use warnings;
my %pairs = qw(A P B Q C R);
my $re = qr/([A-Z])=([0-9])/;
while (my $line = <DATA>) {
last unless $line =~ /\S/;
my $type = substr $line, 0, 1;
my $value = { $line =~ /$re/g }->{ $pairs{$type} };
print "$value\n";
}
__DATA__
A P=1 Q=2 R=3
B P=8 Q=2 R=7
C Q=2 P=1 R=3
这最后一个还可以很容易地从线拉出多个值:
#!/usr/bin/perl
use strict; use warnings;
my %tuples = (A => [qw(P Q)], B => [qw(Q R)], C => [qw(P R)]);
my $re = qr/([A-Z])=([0-9])/;
while (my $line = <DATA>) {
last unless $line =~ /\S/;
my $type = substr $line, 0, 1;
my @values = @{ { $line =~ /$re/g } }{ @{ $tuples{$type} } };
print "@values\n";
}
__DATA__
A P=1 Q=2 R=3
B P=8 Q=2 R=7
C Q=2 P=1 R=3
你不需要散列语法来做散列。 '%h = qw/A P B Q C R /;'只要有偶数项目就会工作。 – Sorpigal 2010-12-17 12:18:21
+1感谢您指出。 – RedGrittyBrick 2010-12-17 12:24:47