2012-02-16 2 views
0

Я новичок. Сожалею. Я пытаюсь удалить запятые. Perl cgi.pm
Мне нужно знать, как написать этот параметр ('item_price' => ~ s/\, // g);
Я могу сделать это $ item_price = ~ s/\, // g; но скорее устранит преобразование в переменную.
Что еще лучше, если я могу включить удаление $. Это можно сделать? СпасибоPerl простой поиск и замена

ответ

5

Нет. Вы можете применить замену RegEx только к l-значению (выражению, которое вы можете присвоить значению TO), поскольку ему необходимо записать измененную строку.

От perldoc perlop для s/// оператора:

Если не используется параметр/г, то строка должно быть указано скалярную переменную, элемент массива, хэш-элемент, или задание к одному из тех,; то есть какой-то скалярный lvalue. (В примечании: модификатор /r кажется новой функцией в Perl 5.14).

Подпрограмма/вызов метода НЕ является значением l.

Есть 3 обходные возможно:

  • Присвоить результаты вызова подпрограммы на переменную, и запустить регулярные выражения на переменную.

    Это может быть немного более длинный код, но он чист, читабельен и не подвержен ошибкам. Лучшее решение.

    (my $param_cleaned = param('item_price')) =~ s/,//; 
    
  • Обновление до Perl 5.14 и использовать /r модификатор RegEx.

  • [BAD IDEA !!!] Если значение параметра хранится внутри CGI.pm, перейдите в внутреннее хранилище объекта CGI и примените регулярное выражение к значению, хранящемуся в объекте. Вы почти никогда не должны этого делать!

+0

Как примечание: Я в курсе [L-значение подпрограмм] (http://perldoc.perl.org/perlsub.html#Lvalue-subroutines). Они новы, экспериментальны и не имеют отношения к этому вопросу. Таким образом, комментарий, а не часть ответа. – DVK

+0

Спасибо. Это очень полезно. –

+0

@ta - добро пожаловать. По способу работы StackOverflow вы можете легко выразить свою признательность, приняв самый полезный ответ, щелкнув по метке «проверка» рядом с этим ответом (и вы получите 2 повторных пункта для этого). – DVK

2

Вы могли бы, но я не уверен, что это будет более эффективно. Нечто подобное должно работать:

join("", split(/,/, param('item_price'))); 
+1

Это аккуратный взлом, но IMHO не подвержен простой читаемости. – DVK

3

Вы можете сделать что-то подобное в Perl 5.14, с return flag:

my $result = param('item_price') =~ s/,//gr; 
1

Вопрос неясна (из-за предоставление недействительных Perl как описание того, что вы хотеть).

Похоже, вы хотите получить значение и преобразовать его внутри выражения.

do { 
    my $item_price = param('item_price'); 
    $item_price =~ s/,//g; 
    $item_price 
} 

или

use List::MoreUtils qw(apply); 
apply { s/,//g } param('item_price') 

или

# Requires 5.14 
param('item_price') =~ s/,//gr 

Где можно использовать те? В любом месте можно использовать выражение.

# Print out the transformed value 
print(param('item_price') =~ s/,//gr); 

# Change the param itself 
param('item_price', param('item_price') =~ s/,//gr); 

etc 
Смежные вопросы