使用perl替换单发中的字符串

ssr*_*012 3 regex perl

我的意见:

my $tmp = "rrccllrrc";
Run Code Online (Sandbox Code Playgroud)

预期产出:

$tmp = "right right center center left left right right center"; #End should not be spaced definitely.
Run Code Online (Sandbox Code Playgroud)

我的代码:

$tmp=~s/c/center /g;
$tmp=~s/l/left /g;
$tmp=~s/r/right /g;
Run Code Online (Sandbox Code Playgroud)

有人可以帮助缩短尽可能多地替换正则表达式的方法.

zdi*_*dim 7

也可以没有正则表达式

my %repl = (c => 'center', l => 'left', r => 'right');

$tmp = join ' ', map { $repl{$_} }  split '', $tmp;
Run Code Online (Sandbox Code Playgroud)

带有模式的拆分''将字符串分解为其字符列表,而map使用散列将其替换为完整的单词.输出列表map由空格连接.


更新为评论

如果原始字符串包含其他字符,则可以先将其过滤掉

$tmp = join ' ', map { $repl{$_} } grep { /c|l|r/ } split '', $tmp;
Run Code Online (Sandbox Code Playgroud)

或者,map在散列中未定义的任何内容中使用空列表

$tmp = join ' ', map { $repl{$_} // () } split '', $tmp;
Run Code Online (Sandbox Code Playgroud)

这完全消除了除了之外的一切c|l|r.让他们保持在结果中

$tmp = join ' ', map { $repl{$_} // $_ } split '', $tmp;
Run Code Online (Sandbox Code Playgroud)

它们也被空间隔开.要将它们保持在一起,需要进一步调整它.


cho*_*oba 6

您可以在替换中使用替换哈希:

#! /usr/bin/perl
use warnings;
use strict;
use feature 'say';

my $tmp = "rrccllrrc";

my %replace = ( r => 'right',
                c => 'center',
                l => 'left' );

$tmp =~ s/(.)/$replace{$1} /g;
chop $tmp;
say "<$tmp>";
Run Code Online (Sandbox Code Playgroud)