【问题标题】:perl --> printing characters in between the multiple metacharacters present in a single lineperl --> 在一行中的多个元字符之间打印字符
【发布时间】:2020-01-24 11:46:06
【问题描述】:

我正在尝试一个脚本来找出元字符“|”之间的字符。我试图获得第一个和后续“|”的位置元字符并尝试打印这两个位置之间的字符串。下面是我试过的代码:

文件:|一个|乙|计数| D| E|

预期输出:A B 计数 D E

if($line =~ /\|/) 
{
while ($line =~ m/\|/g) 
{
my $start_pos = $-[0]; 
my $end_pos = $+[0]; 
my $hit_pos = "$start_pos - $end_pos";
my $char = substr($line, $start_pos, $end_pos);
if($char =~/\w/){
  print "$char\n";
}
}
}

【问题讨论】:

标签: perl substr


【解决方案1】:

使用split

my $line = '| A| B| Count| D| E|';

my @fields = split(/\|/, $line, -1);
shift(@fields);  # Ignore stuff before first "|"
pop(@fields);    # Ignore stuff after last "|"

say "<$_>" for @fields;

输出:

< A>
< B>
< Count>
< D>
< E>

使用正则匹配:

my $line = '| A| B| Count| D| E|';

my @fields = $line =~ / \| ([^|]*) (?=\|) /xg;

say "<$_>" for @fields;

输出:

< A>
< B>
< Count>
< D>
< E>

使用正则表达式匹配(替代):

my $line = '| A| B| Count| D| E|';

while ($line =~ / \| ([^|]*) (?=\|) /xg) {
   say "<$1>";
}

输出:

< A>
< B>
< Count>
< D>
< E>

【讨论】:

  • 我想得到“|”的位置字符,然后根据位置将字符分开并存储在数组中。 @store[$pos] 之类的东西。你能告诉我一种方法吗?
  • 这就是第一个sn-p所做的$fields[0]包含␠A$fields[1]包含␠B
  • 我已经更新了答案以包含一个填充数组的基于匹配的解决方案。
  • 也许@fields = grep /w/, split /\|/, $line 是我们想要的?不清楚。
【解决方案2】:

最简单的做法可能就是删除管道。

$line =~ s/\Q|\E//g;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2021-01-01
    • 1970-01-01
    • 2021-07-12
    • 2018-08-11
    • 2016-07-13
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多