2017-02-22 25 views
4

Как я могу использовать $ _ для хранения моей строки, а затем использовать другую скалярную переменную для хранения замещенной строки, чтобы у меня были оба экземпляра. У нас есть модификатор для копирования аргумента по умолчанию в другую переменную?Заменить и сохранить в другом скаляре

#! /usr/bin/perl/ 
use warnings; 
use strict; 

$_ = "X is a good boy. X works daily and goes to school. X studies for 12 hours daily \n"; 

s/X/Sam/g; 
print $_, "\n"; 

В конце концов, я хочу, чтобы исходный $ _ и замещенная строка.

Edit: я использовал

my $new = s/X/Sam/gr 

Но я получаю ошибку, связанную строить, и оно не решает проблему. Я использую версию 5.10.1

perl --version 

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi 
+2

'(my $ new = $ _) = ~ s/X/Sam/g;' – ssr1012

ответ

8

Один из способов, конечно, состоит в том, чтобы сначала скопировать оригинал и сделать замену на копии.

(my $new = $_) =~ s/X/Sam/g; 

Другой способ заключается в использовании /r модификатор (введен в v5.14). Она возвращает новую строку, оставляя исходный неизменным

my $new = $_ =~ s/X/Sam/gr; 

Найти in perlop, под пули "s/PATTERN/ЗАМЕНА/msixpodualngcer".

Обратите внимание на интересные применения в примерах. С /r вы также можете сделать

my $new = s/X/Sam/gr; 

С /r модификатором доступен на v5.14 или более поздней версии вы можете иметь use 5.014;, не позволяя запускать код на всех на старых Перлз и документирование требуемой версии , С другой стороны, без этого на более старом Perl вы получите , чтобы получить конкретную ошибку, с местом, где недоступны функции.

+2

aka, add: 'use 5.016;' :) – jm666

+1

@ jm666 Спасибо - добавлено. – zdim

+0

Я не получаю желаемый результат после вашего решения. Наверное, какая-то ошибка на моей стороне. Я получаю следующее сообщение об ошибке: найдено место, где оператор ожидал в строке reg_expressions.pl 7, рядом с синтаксической ошибкой «s/X/Sam/gr» на строке reg_expressions.pl 7, рядом с «s/X/Sam/gr» Выполнение reg_expressions.pl отменено из-за ошибок компиляции. –

1

Я стараюсь как можно больше не использовать $ _ для чего-либо другого, кроме того, чтобы отличить его от другой переменной. У меня были проблемы, что в сложном цикле $ _ теряется. Его четыре строки кода и поэтому, возможно, не особенно красноречив, но ...

$orig = $_; 
$changed = $_; 
$changed = s/X/Sam/g; 
print "CHANGED: ".$changed."\bORIGINAL: ".$orig\n"; 
1

Вы можете использовать следующие, если вам нужна совместимость с версиями Perl старше 5.14:

#! /usr/bin/perl/ 
use warnings; 
use strict; 

$_ = "X is a good boy. X works daily and goes to school. X studies for 12 hours daily \n"; 
my $m; 
($m = $_)=~s/X/Sam/g; 
print $m, "\n"; 

Здесь $m сохраняет измененные данные, а $_ остается неизменным.