2010-08-27 6 views
0
$value = $list[1] ~ s/\D//g; 

ошибка синтаксиса в try1.pl линии 53, возле "] ~"Что не так с этим кодом Perl?

Выполнение try1.pl прервана из-за ошибки компиляции.

Я пытаюсь извлечь цифры из второго элемента @list, и хранить его в $value.

ответ

7

Вы имеете в виду = ~, а не ~. ~ является унитарным поразрядным оператором отрицания.

Несколько способов сделать это:

($value) = $list[1] =~ /(\d+)/; 

Оба набора скобок имеют важное значение; только если есть скобки в скобках, операция совпадения возвращает фактическое содержимое, а не только показатель успеха, а затем только в контексте списка (предоставляется оператором присвоения списка ()=).

Или общий идиом копии, а затем изменить:

($value = $list[1]) =~ s/\D//; 
+0

благодаря @ysth. это так непохоже на C! – Lazer

+5

Собственно, это очень похоже на C. Оператор, которого вы использовали, не делает в C то, что вы пытались сделать. :) –

1

Возможно, вам нужен оператор =~?

P.S. обратите внимание, что $value не получит назначенной результирующей строки (сама строка будет изменена на месте). $value получит присвоение числа замен, которые были сделаны

+0

Тогда как же он получает назначение в данном случае [] (http://stackoverflow.com/questions/3577087/how-to-read-from-a-file-and -do-а-Grep-в-Perl/3577114 # 3577114)? – Lazer

+0

@values ​​= ($ list [1] = ~/\ d/g); – hlynur

0

И хотел \d igits не является \D igits. И есть лишний оператор s/ ubstitute, где совпадение имеет больше смысла.

if ($list[1] =~ /(\d+)/) { 
    $value = $1; 
} 
+0

Я пытался удалить все цифры. – Lazer

+0

TIMTOWTDI. Perl philosohpy. –

+0

Ваш матч работает только в том случае, если цифры смежны. поиск и замена будут работать на чем-то вроде $ 100 000, например – plusplus

1

Вы сказали, что в комментариях, которые пытаются избавиться от не-цифр. Похоже, вы пытаетесь сохранить старое значение и получить измененное значение в новой переменной. Идиома Perl для этого есть:

(my $new = $old) =~ s/\D//g;