2016-03-04 2 views
1

Я пытаюсь выбрать ниже значение из базы данных:Получения Ошибки модификации только для чтения значения попытки

отчетности, что одна из @its многих проблем были недавние @ продлен спад продаж в женских одежды, розничный торговец из семи магазинов сказал, что начнет трехмесячную ликвидационную продажу во всех своих магазинах. ~ (A) его многие проблемы были в последнее время (B), многие его проблемы были недавно связаны с ~ (C) его многочисленные проблемы - это недавние ~ (D) их многочисленные проблемы. - это недавняя ~ (E), их многочисленными проблемами были последние:

я выборе этого значения в переменной $ Ques, а затем выбрать текст, как показано ниже:

$ques=~s/^(.*?)\@(.*?)\@(.*?)$/$2/; 

Теперь, заменяя ~ символ в строке по

$3=~s/~/\n/g; ---->line 171 

и запустив script, Я получаю одну за одну отправную запись:

Modification of a read-only value attempted at main.pl line 171 

Я хочу заменить все символы ~ \ n 'и напечатать окончательное значение. Пожалуйста, предложите, как это сделать.

* Я исследовал это в сети, но запутался, что как обрабатывать эти переменные только для чтения.

+0

Я думаю, что вы прямо не можете изменить $ 3, запишите переменную, а затем выполните замену. – Nagaraju

ответ

2

Это походит на то, что вы действительно хотите в этом случае split, а не регулярные группы захвата выражение:

my @parts = split(/@/, $ques); 
$parts[2] =~ s/~/\n/g; 

Это делает цель вашего кода понятнее так как вы, по сути, раскалываете на @ символы.

+0

Спасибо, мой подход был неправильным. Используя это, я получаю желаемый результат! – JustStarted

2

Как вы говорите, специальные переменные , $2 и т. Д. Доступны только для чтения, а это означает, что вы не можете выполнять эту замену.

Выполнение замены на $ques будет делать то, что вам нужно:

$ques =~ s/~/\n/g; 
print $ques; 

Обратите внимание, что в более раннем замещении, что вы выполняете на $ques вы избавляетесь от всех ~ символов.

+0

Привет, На самом деле я печатаю вывод, как показано ниже: 'print" $ 1 ", цветной (" $ ques ", 'underline', ' желтый '), «$ party», «\ n»; ' И он печатает полный текст в подчеркивании, если я заменил ~ на \ n перед его расщеплением. – JustStarted

3

У вас уже есть хорошее объяснение проблемы Хосе Кастро. Но есть другое решение, если вы используете обновленную версию Perl (Update:, проверив более тщательно, я считаю, что это означает 5.14+). Аргумент /r к оператору подстановки скопирует вашу строку, выполнит замену в копии и затем вернет это измененное значение.

Таким образом, вы могли бы написать:

my $new_value = $3 =~ s/~/\n/rg; 
+0

Я использую Perl 5.10. И кажется, что это дает синтаксическую ошибку при реализации. – JustStarted

+1

Да. Как я уже сказал, эта функция была добавлена ​​в Perl 5.14. Почему бы вам не использовать версию Perl, выпущенную в этом десятилетии? :-) –

+0

Я работаю над чем-то для личного использования, но в офисной системе. Поэтому я не могу обновить его до тех пор, пока не получим одобрение менеджера. : P – JustStarted