2016-11-16 1 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

は、その文字のリストに文字列を分割し、そしてmapはその完全な単語で各を置き換えるためにハッシュを使用しています''パターンと同様

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

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

split正規表現せずに行うことができます。 mapの出力リストはスペースで結合されています。元の文字列が、まだ他の文字が含まれている場合は、最初の

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

か、にISN何のためにmapで空のリストを使用し、それらを除外することができますコメント

に更新


ハッシュで定義されていません。

$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