Perl:从数组中提取值对

Red*_*ick 1 perl while-loop

考虑

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

while(<DATA>) {
  my($t1,$t2,$value);
  ($t1,$t2)=qw(A P); $value = $1 if /^$t1.*$t2=(.)/;
  ($t1,$t2)=qw(B Q); $value = $1 if /^$t1.*$t2=(.)/;
  ($t1,$t2)=qw(C R); $value = $1 if /^$t1.*$t2=(.)/;
  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
Run Code Online (Sandbox Code Playgroud)

我想用一个优雅的循环代替存储在数组(或其他结构)中的$ t1,$ t2值的替换重复

my @pairs = qw (A,P   B,Q   C,R);
my @pairs = qw (A P   B Q   C R);
Run Code Online (Sandbox Code Playgroud)

我已经没有结合在一个简短的尝试很成功while,splitunshift.

我错过了什么简洁,优雅的解决方案?


PS我以前使用哈希,但发现%h = (A=>'P', B=>'Q', C=>'R')语法"嘈杂".扩展到三胞胎,四边形也很难看......

mob*_*mob 9

当hash + each不够好时(因为

  • 对列表中的第一个元素不是唯一的,或者
  • 你需要以特定的顺序迭代对,或者
  • 因为你需要抓住三个或更多元素而不是两个,或者
  • ...),

List::MoreUtils::natatime方法:

use List::MoreUtils q/natatime/;

while(<DATA>) {
  my($t1,$t2,$value);
  my @pairs = qw(A P B Q C R);
  my $it = natatime 2, @pairs;
  while (($t1,$t2) = $it->()) {
      $value = $1 if /^$t1.*$t2=(.)/;
  }
  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
Run Code Online (Sandbox Code Playgroud)

但是,通常情况下,我会splice在列表的前几个元素中执行以下任务:

while(<DATA>) {
  my($t1,$t2,$value);
  my @pairs = qw(A P B Q C R);
  # could also say  @pairs = (A => P, B => Q, C => R);
  while (@pairs) {
      ($t1,$t2) = splice @pairs, 0, 2;
      $value = $1 if /^$t1.*$t2=(.)/;
  }
  print "$value\n";
}
Run Code Online (Sandbox Code Playgroud)