【问题标题】:Question on Split usage in Perl关于 Perl 中拆分用法的问题
【发布时间】:2011-05-30 07:39:54
【问题描述】:

我写了一个小脚本来使用split()

use strict;
use warnings;
use Data::Dumper;

my $fh = \*DATA; 


while(my $line = <$fh>) 
{ 
    my @values = split(':', $line);

    foreach my $val (@values) {

      print "$val\n";
    }
} 

__DATA__   
1 : Hello World String10 : NO : A1B2,B3
11 : Hello World String11 : YES : A11B2,B3,B14,B25

A1B2,B3A11B2,B3 是只有一个字母A 和一个或两个数字231425 等的字符形式,然后与只有一个字母B 连接和一两个数字,例如231425。等等

现在这样输出

1
 Hello World String10
 NO
 A1B2,B3

11
 Hello World String11
 YES
 A11B2,B3,B14,B25

如何保存@values 的最后一个数组成员并进行连接并输出为这样。

1
 Hello World String1
 NO
 A1B2,A1B3

11
 Hello World String11
 YES
 A11B2,A11B3,A11B14,A11B25

感谢您的 cmets 和回复。

[更新]

我的输出需要遵循规则。

A 和一个或两个数字并由B 连接,一个或两个数字由, 分隔

【问题讨论】:

  • 您给出的输出与第二种情况下的输入完全不相关。你真正追求的是什么?

标签: regex arrays perl split concatenation


【解决方案1】:

你可以这样做:

my @values = split(':', $line);
my $a = $values[-1];
$a =~ s/.*(A\d+).*/$1/s;
$values[-1] =~ s/(?<=,)/$a/g;

See it

【讨论】:

  • 哇,这完全超出了我的认知!
  • 你好。您能否就答案提供更多帮助。假设A1B2,B3的输入段改为A1B2,B3 ; A2B2,B3,B4。我仍然希望输出形式如下A1B2,A1B3,A2B2,A2B3,A2B4。有两个(或两个以上的A成员)A1A2,区间符号为;。如何覆盖它?非常感谢。
【解决方案2】:

尚不完全清楚您的要求将如何适用于稍微不同的情况,但这是我的尝试。在打印@values 之前,请执行

$values[-1] =~ s/(?<=,)/ substr($values[-1],0,3) /ge;

【讨论】:

  • 我测试过。它输出为A1B2, A1 A1 A1 A1B3A11B2, A1 A1 A1 A1B3, A1 A1 A1 A1B14, A1 A1 A1 A1B25。实际上,我想要输出A1B2, A1B3A11B2, A1B3, A1B14, A1B25。根据您的输入,我怎样才能废弃这些没有意义的A1?谢谢。
  • 我看不出我写的东西怎么能像你在那里展示的那样,但我的代码不适用于你更新的例子,所以使用 codaddicts。
猜你喜欢
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
相关资源
最近更新 更多