2009-12-15 13 views
6

Böyle bir şey yapmak istiyorum:Perl: Değişkenlerdeki geri dönüşleri (değerleri değil) kaydedebilir miyim?

my $text = "The owls are not what they seem."; 
my $pattern = '(\s+)'; 
my $replacement = '-$1-'; 
$text =~ s/$pattern/$replacement/g; 

$ metin daha sonra olmalıdır: the- -owls- -are- -not- -what- -they- -seem.

Ama elbette daha çok: 1 $ baykuşlar - 1 $-1 $ değil- $ 1-ne- 1 dolar 1 dolar.

Her türlü geri bildirimi ($ 1, \ 1, \ g {1}, \ g1) denedim ve hepsi çalışmadı./E değiştirici de işe yaramadı. Bu hiç mümkün mü? $ object-> değiştirin ('() oo.', '$ 1AR')

Diğer fikirler bu nasıl olabilir:

amacı böyle bir çizgi ile bir nesne içindeki bazı metni değiştirmek için bitti mi?

Çok teşekkür ederim.

+0

qr/(\ s +)/ –

cevap

12

Sen eval ve sonra /ee kullanarak dizeleri genişletmek olabilir:

my $text = "The owls are not what they seem."; 
my $pattern = '(\s+)'; 
my $replacement = q{"-$1-"}; 
$text =~ s/$pattern/$replacement/eeg; 

perldoc perlop Gönderen:

e

bir ifadesi olarak sağ tarafını değerlendirin.

ee

Ben

my $replacement = sub { "-$1-" }; 
$text =~ s/$pattern/$replacement->()/eg; 

ile daha güvende hissederiz, bir dize olarak sağ tarafı daha sonra Ancak sonuç

eval değerlendirin Ama hepsi böyle yapıyorsun hangi bağlamda bağlıdır.

+0

ee = Eval sonra değişkenleri genişletin. –

+2

Altını düşünebilirdim. Şimdi çok açık. Ve mükemmel uyuyor. Teşekkür ederim! – wuwuwu

-3

$ text = ~ s/$ pattern/- $ 1-/g;

+0

Hayır, sağlayamaz '(\ s +)' daha iyidir - gibi doğrudan '$ 1-' parçasını bu. Değişkenin içinde: $ yerine = '- $ 1-'; $ text = ~ s/$ pattern/$ replacement/g; – wuwuwu

3

Sinan Ünür'ün çözümü işe yarayacak, ancak yine de bir dizide programın içinde bir değişmez dizilimin yerini almasını gerektiriyor. Bu da eval önler ve düzenleyiciler kullanılmasına izin vermesi

$text =~ s/$pattern/dyn_replace($replacement)/eg; 

Not gibi

sub dyn_replace { 
    my ($replace) = @_; 
    my @groups; 
    { 
    no strict 'refs'; 
    $groups[$_] = $$_ for 1 .. $#-;  # the size of @- tells us the number of capturing groups 
    } 
    $replace =~ s/\$(\d+)/$groups[$1]/g; 
    return $replace; 
} 

ve sonra kullanın: o yedek dizesi verileri geliyorsa, senin bir işi biraz daha süslü yapmak gerekecek gibi/g. Kod this Perl Monks node alınan ama ok :) yüzden ben bu düğümü yazdım

+0

Anladığım kadarı, bunun bir şekilde Sinan Ünür'ün alt çözümüyle aynı olduğunu, bunun çok daha karmaşık olması dışında. – wuwuwu

+2

Sinan'ın çözümü, alt alanın içinde gerçek bir dize olması için $ yerine koyulmasını gerektirir. Mine, herhangi bir rasgele dize değeri olmasını sağlar. – Dan

İlgili konular