Почему Perl заменяет мою строку “1”?

У меня есть следующий код:

#$domain = domainname.co.uk
#$root = public_html
#$webpage = domainname.co.uk/foo/bar/foobar.html
my $string = ($webpage =~ s/^$domain//g);
my $linkFromRoot = $dbh->quote($root . $string);

Usualy это хорошо работает, но по некоторым причинам вывод является "public_html 1" вместо "public_html/foo/bar/foobar.html".

Кто-либо может видеть почему?

5
задан brian d foy 6 February 2010 в 11:40
поделиться

5 ответов

Вы не получаете правильный ответ, потому что подстановка возвращает вам 1 - количество замененных элементов. См. Ответ perlfaq4 на Как я могу подсчитать количество вхождений подстроки в строке?

$domain = "domainname.co.uk";
$root = "public_html";
$webpage = "domainname.co.uk/foo/bar/foobar.html";
my $string = ($webpage =~ s/^$domain//g);
print $string."\n";

Удалите $ string и просто выполните $ webpage = ~ s / ^ $ domain // g; , а затем выполните конкатенацию строк с $ webpage .

11
ответ дан 18 December 2019 в 07:08
поделиться

Я думаю, вы предполагаете, что скобки вокруг регулярного выражения вызывают контекст списка. Что это , а не случай. Слева от оператора присваивания определяется контекст, и он является скалярным. В скалярном контексте, s/// возвращает количество успешных подстановок. Помещение скобок вокруг объявленной переменной заставляет ее делать то, что вы хотите, потому что она делает для контекста списка.

Это:

my ($string) = $webpage =~ s/^$domain//;

Возвращает часть спичек в $webpage: имя домена. Скорее всего, это не то, что вы хотите. Вам либо нужен код S.Mark:

$webpage =~ s/^$domain//;
my $linkFromRoot = $dbh->quote($root . $webpage);

, либо это

my ($string) = $webpage =~ /^$domain(.+)$//;
my $linkFromRoot = $dbh->quote($root . $string);
7
ответ дан 18 December 2019 в 07:08
поделиться

Как насчет

$webpage =~ s/^$domain//g;
my $linkFromRoot = $dbh->quote($root . $webpage);
0
ответ дан 18 December 2019 в 07:08
поделиться

Совершенно не по теме вашего исходного вопроса, но возможно ли, что вы действительно хотели:

my $webpage = URI->new("http://domainname.co.uk/foo/bar.html");
my $path = $webpage->rel("http://domainname.co.uk/");
print "public_html/$path\n";
4
ответ дан 18 December 2019 в 07:08
поделиться

Комбинатор - это функция с отсутствием свободных переменных . Это означает, среди прочего, что комбинатор не имеет зависимостей от вещей вне функции, только от параметров функции.

Использование F # это мое понимание комбинаторов:

let sum a  b = a + b;; //sum function (lambda)

В приведенном выше случае сумма является комбинатором, потому что и a , и b связаны с параметрами функции.

let sum3 a b c = sum((sum a b) c);;

Приведенная выше функция не является комбинатором, так как использует sum , который не является связанной переменной (т.е. не исходит ни из одного из параметров).

Сум3 можно сделать комбинатором, просто передав функцию суммы в качестве одного из параметров:

let sum3 a b c sumFunc = sumFunc((sumFunc a b) c);;

Этот путь sumFunc является связанной и, следовательно, вся функция является комбинатором.

Итак, это мое понимание комбинаторов. Их значение, с другой стороны, все еще ускользает от меня. Как отмечали другие, комбинаторы с фиксированной точкой позволяют выразить рекурсивную функцию без явной рекурсии. То есть вместо вызова самой себя рекурсивная функция вызывает лямбду, которая передается в качестве одного из аргументов.

Вот одна из наиболее понятных производных комбинатора, которую я нашел:

http://mvanier.livejournal.com/2897.html

-121--1032016-

Все мои приложения Rails в настоящее время работают под Rails 2,3,5 и каждое приложение имеет LOC 80% или больше. Это всегда было ключевым требованием для каждого продукта, который я создаю для себя или управляю на работе.

Обычно обновление до версии minor/bugfix занимает всего несколько минут. Изменение версии GEM, модернизации требований, запуск тестов, устранение проблем и фиксация.

Rails 3.0 является основной перезаписью, и самая большая проблема представлена совместимостью плагинов. Плагины не под моим непосредственным контролем. Это та же причина, почему мне было трудно пытаться обновить до Ruby 1,9,1 .

Однако я уже играю с Rails 3. Я хочу узнать самые важные изменения в Rails 3 как можно скорее, чтобы начать перемещение существующих приложений в нужные направления . Кроме того, как автор плагинов, мне важно начать работать с Rails 3, чтобы сделать мои плагины совместимыми.

Вчера я начал с моего самого простого приложения. Ну, по крайней мере, это то, что я использовал, чтобы думать об этом. В любом случае, это приложение с меньшим количеством внешних зависимостей (меньше, чем 3 Gems), и на обновление ушло около 1 часа и 3 часа, чтобы выяснить, почему Rails не смог загрузить мои маршруты. Оказалось, компонент Rails Metal боролся с новым стеком Rails 3.

Есть некоторые незначительные проблемы, которые я должен выяснить, но могу сказать, что я успешно перенес свое первое приложение на Rails 3.

Я планирую как можно скорее перенести все мои приложения Rails на Rails 3, как только будут доступны стабильные Rails 3. Или, по крайней мере, как только я смогу выяснить, действительно ли зависимости работают с рельсами 3. К счастью, проект был начат по адресу http ://railsplugins.org/ с целью перечисления всех совместимых/несовместимых плагинов Rails.

Удаленная среда уже совместима с Rails 3, я использую Passenger with Ruby Enterprise Edition (1.8.7). Единственная проблема блокировки - плагины.

Я думаю, что это займет, по крайней мере, месяц, прежде чем большая часть моего приложения Rails будет готова для Rails, 3 думал, что я, вероятно, не начну модернизации, пока Rails 3 stable не выйдет или мне действительно нужна новая версия для некоторой функции блокировки (например, маршрутизация на основе субдомена).

-121--3653478-

Если вам не нужна другая переменная, я думаю, что ответы выше лучше, но один из моих любимых маленьких синтаксических трюков заключается в том, чтобы воспользоваться тем фактом, что назначение является lvalue, так что с небольшой перестановкой скобки:

(my $string = $webpage) =~ s/^$domain//g;

вы можете сделать копию и изменить ее в одном утверждении.

Также, наряду с другими вещами, которые немного странно в этом коде, нет много точки к /g на образец, начиная с ^ . Он не может совпадать более одного раза.

0
ответ дан 18 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: