У меня есть следующий код:
#$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".
Кто-либо может видеть почему?
Вы не получаете правильный ответ, потому что подстановка возвращает вам 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
.
Я думаю, вы предполагаете, что скобки вокруг регулярного выражения вызывают контекст списка. Что это , а не случай. Слева от оператора присваивания определяется контекст, и он является скалярным. В скалярном контексте, 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);
Как насчет
$webpage =~ s/^$domain//g;
my $linkFromRoot = $dbh->quote($root . $webpage);
Совершенно не по теме вашего исходного вопроса, но возможно ли, что вы действительно хотели:
my $webpage = URI->new("http://domainname.co.uk/foo/bar.html");
my $path = $webpage->rel("http://domainname.co.uk/");
print "public_html/$path\n";
Комбинатор - это функция с отсутствием свободных переменных . Это означает, среди прочего, что комбинатор не имеет зависимостей от вещей вне функции, только от параметров функции.
Использование 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
на образец, начиная с ^
. Он не может совпадать более одного раза.