LINUX.ORG.RU

История изменений

Исправление gh0stwizard, (текущая версия) :

Я не услышал внятного ответа почему perl лучше, чем скажем java. Вот вы пишете:

На python, java, php и других языках некоторые конструкции реализуются очень бестолково, а некоторые вовсе нельзя реализовать напрямую (только обходными путями). Программируя на этих недоязыках я чувствую себя мудаком когда пытаюсь реализовать определенные схемы но начинаю городить обходную хрень потому что язык ущербный. И ничего подобного я не встречал с perl и си (и как следствие, на с++ тоже можно обходиться без обходных путей).

Какие конструкции?

Видите ли, если вас заботит только как выглядит код, то для вас плохие новости. Я не стану цитировать Торвальдса о хороших программистах, гуглите сами.

Теперь о дыре в print undef. Вообще-то, я имел ввиду использование $1 вместо "$1" там, где это неверно. Теперь вашими же словами: если вы и программист, то очень слабый, т.к. сильный программист знает об этой «фишке» perl, знает что выдаст print в этом случае, знает, что произойдет в его личном коде. Поскольку личного кода тут нет, а команда print сделана практически идеально, то вот вам пример в вашей стилистике:

#!/usr/bin/perl -wl

($test = "tt") =~ /^\w(\w+)?\w+/ && print ($1) && print "'$test' authorized";
http://ideone.com/8MMftA

В рекспе есть ошибка, чтобы специально показать, когда $1 может быть undef. Поскольку пример очень простой, то сразу видно, где именно. В более сложных регепсах это обычно бывает трудно заметить сразу, трудно определить при каком входном значении получим undef. Как итог, злоумышленник может провести атаку, которая в худшем (ключевое слово) приведет к дыре. В лучшем случае, к неверной работе программы.

И сразу скажу, что пример не показывает, где уязвимость и как ее использовать. Могу сказать, что если в коде начать использовать $1 таким образом $users{ $1 }, то будет уже интереснее, но опять же пример взят с потолка.

Теперь вернемся к вашему примеру:

($test = "test") =~ /^(.*?)t/ && print $1;
Как видно, он не работает. От слова вообще: http://ideone.com/Vr7PCM

Исходная версия gh0stwizard, :

Я не услышал внятного ответа почему perl лучше, чем скажем java. Вот вы пишете:

На python, java, php и других языках некоторые конструкции реализуются очень бестолково, а некоторые вовсе нельзя реализовать напрямую (только обходными путями). Программируя на этих недоязыках я чувствую себя мудаком когда пытаюсь реализовать определенные схемы но начинаю городить обходную хрень потому что язык ущербный. И ничего подобного я не встречал с perl и си (и как следствие, на с++ тоже можно обходиться без обходных путей).

Какие конструкции?

Видите ли, если вас заботит только как выглядит код, то для вас плохие новости. Я не стану цитировать Торвальдса о хороших программистах, гуглите сами.

Теперь о дыре в print undef. Вообще-то, я имел ввиду использование $1 вместо "$1" там, где это неверно. Теперь вашими же словами: если вы и программист, то очень слабый, т.к. сильный программист знает об этой «фишке» perl, знает что выдаст print в этом случае, знает, что произойдет в его личном коде. Поскольку личного кода тут нет, а команда print сделана практически идеально, то вот вам пример в вашей стилистике:

#!/usr/bin/perl -wl

($test = "tt") =~ /^\w(\w+)?\w+/ && print ($1) && print "'$test' authorized";
http://ideone.com/8MMftA

В рекспе есть ошибка, чтобы специально показать, когда $1 может быть undef. Поскольку пример очень простой, то сразу видно, где именно. В более сложных регепсах это обычно бывает трудно заметить сразу, трудно определить при каком входном значении получим undef. Как итог, злоумышленник может провести атаку, которая в худшем (ключевое слово) приведет к дыре. В лучшем случае, к неверной работе программы.

И сразу скажу, что пример не показывает, где уязвимость и как ее использовать. Могу сказать, что если в коде начать использовать $1 таким образом $users{ $1 }, то будет уже интереснее, но опять же пример взят с потолка.

Теперь вернемся к вашему примеру:

($test = "test") =~ /^(.*?)t/ && print $1;
Как видно он не работает. От слова вообще. http://ideone.com/Vr7PCM