2016-11-16 22 views
4
替換單杆串

我輸入:用perl

my $tmp = "rrccllrrc"; 

預期輸出:

$tmp = "right right center center left left right right center"; #End should not be spaced definitely. 

我的代碼:

$tmp=~s/c/center /g; 
$tmp=~s/l/left /g; 
$tmp=~s/r/right /g; 

有人可以幫助縮短的方式來代替正則表達式儘可能多。

+0

你的代碼後補充一點:'$ TMP =〜S/\ s * $ //克;' – AbhiNickz

+0

@AbhiNickz:會做。 – ssr1012

回答

8

可以不用正則表達式以及

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

$tmp = join ' ', map { $repl{$_} } split '', $tmp; 

split''斷線到它的字符的列表,並使用map哈希通過其完整的字來代替每個圖案。輸出列表map由空格連接。


更新後評論

如果原始字符串包含另一些字符,可以過濾出來第一

$tmp = join ' ', map { $repl{$_} } grep { /c|l|r/ } split '', $tmp; 

,或者在map使用空列表任何ISN沒有在散列中定義

$tmp = join ' ', map { $repl{$_} //() } split '', $tmp; 

這可以完全除去c|l|r以外的所有內容。將它們保留在結果中

$tmp = join ' ', map { $repl{$_} // $_ } split '', $tmp; 

它們以空格分隔。保持它們在一起需要進一步調整。

+0

我建議使用'=>'編寫的散列可以更清楚地顯示這裏發生的事情。 – Sobrique

+0

@zdim:'在連接中使用未初始化的值或在a.pl行使用字符串'我得到這個錯誤。 – ssr1012

+0

@ ssr1012你對此有何意義?無論字符串中有哪些字符,它們都必須放在哈希中。如果字符串可能還有其他的字符串,那麼可以很容易地調整,例如在split中添加'grep {/ c | l | r /}'(這將完全刪除其他字符)。讓我知道。 – zdim

7

您可以替代使用替代品的哈希:

#! /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>"; 
+0

它也工作正常。大。 – ssr1012