Forum Webscript.Ru

Программирование => Perl => Тема начата: Yaroslav от 15 Августа 2005, 15:01:21

Название: как бы организовать?
Отправлено: Yaroslav от 15 Августа 2005, 15:01:21
есть основной файл index.cgi
в нем сказано напечатать стандартную шапку и:
if ($req eq "smi") { require "./smi.cgi"; }
делее все ложится на плечи этого самого smi.cgi. но в нем так же есть:
elsif($smi eq \'otdmark\') { &otdmark; }
elsif($smi eq \'menmen\') { &menmen; }
else { &start; }
и т.д.
все работает, вопрос в следующем.
все эти СМИ меняются часто, кое кто удаляется/добавляется, это все запоминается поисковиками и при следующем индексировании по убитому пути, к примеру index.cgi?req=smi&smi=nosmi
выводится страничка и поисковик думает что все ок, адрес существует и работает дальше. но посколько страниц таких стало много, то трафика за месяц сжираеца тоже прилично.
естественно если в smi.cgi изменить на
else { print qq[Location: $script\\n\\n]; }
то никуда он не пойдет, т.к. уже с index.cgi выведена шапка.
есть ли какой нибудь простой выход?
Название: как бы организовать?
Отправлено: Yaroslav от 17 Августа 2005, 10:32:57
ну раз никто не знает, буду делать как придумал я.
в основной скрипт внесем проверку существующих СМИ.

if ($smi eq "" or $smi eq ("otdmark"||"menmen"||"made"||"zrekl"||"markua"||"prmeneger"||"btl"||"marrek"||"novmark"||"marisua"||"marketolog"))
{ &htmlup; require "./smi.cgi"; }
else { print qq[Location: $script\\n\\n]; }

и даже по этому коду есть вопросы:
1. на локалке работает нормально, на сервере не хочет :(
2. вписать в одну строчку почему то не получается

if ($smi eq (""||"otdmark"||"menmen"||"made"||"zrekl"||"markua"||"prmeneger"||"btl"||"marrek"||"novmark"||"marisua"||"marketolog"))
Название: как бы организовать?
Отправлено: 2NetFly от 17 Августа 2005, 13:08:29
Я бы вбил все СМИ в массив и написал бы функцию проверки наличия заданной СМИ в этом массиве.

$smi eq ("otdmark"||"menmen"||"made"||"zrekl"||"markua"||"prmeneger"||"btl"||"marrek"||"novmark"||"marisua"||"marketolog") - это ужасно =)
Название: как бы организовать?
Отправлено: NeoNox от 17 Августа 2005, 13:44:07
Лучше хеш использовать.
Название: как бы организовать?
Отправлено: Yaroslav от 21 Августа 2005, 20:25:21
2NetFly
чем ужасно?

NeoNox
чем лучше?

ALL
но где же у меня ошибка? почему не работает? запутался в 1-й строчке ...
Название: как бы организовать?
Отправлено: NeoNox от 21 Августа 2005, 22:32:08
Yaroslav правильнее, оптимальнее для проверки и красивее.

Цитировать
Yaroslav:
но где же у меня ошибка? почему не работает? запутался в 1-й строчке ...

В корне неправильно использован оператор сравнения.
Название: как бы организовать?
Отправлено: Yaroslav от 22 Августа 2005, 11:54:53
Цитировать
NeoNox:
правильнее, оптимальнее для проверки и красивее.

почему то я считал что чем меньше простых действий - тем и правильней и оптимальней. зачем создавать хеш или масив и хранить его в памяти если можно сделать проще? ну тут вам наверное виднее, хотите не обьясняйте :) но вот еще вопрос по поводу хеша, к чему его то можно прикрутить? к ключу или значению а дальне? а смысл? очень прошу обьяснить вашу логику.
Цитировать
NeoNox:
В корне неправильно использован оператор сравнения.

ну и для общего просвящения...
Название: как бы организовать?
Отправлено: Ivan Kolesnikov от 22 Августа 2005, 12:29:11
Твое выражение

("otdmark"||"menmen"||"made"||"zrekl"||"markua"||"prmeneger"||"btl"||"marrek"||"novmark"||"marisua"||"marketolog")

Полностью эквивалентно "otdmark", а если написать:

(""||"otdmark"||"menmen"||"made"||"zrekl"||"markua"||"prmeneger"||"btl"||"marrek"||"novmark"||"marisua"||"marketolog")

То как не странно получим тотже результат "otdmark".
Оператор || работает следующим образом: если левое выражение true (не пустая строка, и не нуль), то правое не вычисляется. В качестве результата будет последнее вычисленное выражение, то есть в первом случае "otdmark" - true, результат otdmark, во втором "" - false, "otdmark" - true => "otdmark".

Необходимо было написать:

$smi eq "" or $smi eq "otdmark" or $smi eq "menmen" ...

Намного элегантнее будет решение с хешем, создаем скажем вот такой хеш:

%hash = (
"" => 1,
otdmark => 1,
menmen => 1,
...
);

А проверка тогда будет очень простой:

if ($hash{$smi})
{ &htmlup; require "./smi.cgi"; }
else { print qq[Location: $script\\n\\n]; }
Название: как бы организовать?
Отправлено: Yaroslav от 22 Августа 2005, 14:23:18
Ivan Kolesnikov
огромное спасибо за разьяснения о ||
хотя почему его обозвали как или что единтично как or

и немного поковырявши проверку еще и масивом, понял, что использования хеша действительно лучше :)
Название: как бы организовать?
Отправлено: Ivan Kolesnikov от 22 Августа 2005, 14:36:25
На самом деле || и так идентично or, за одним исключением: у or очень низкий приоритет.
Название: как бы организовать?
Отправлено: NeoNox от 22 Августа 2005, 14:47:23
Цитировать
Yaroslav:
и немного поковырявши проверку еще и масивом, понял, что использования хеша действительно лучше

Ну вот видишь, сам теперь разобрался. Это всяко лучше чем получать готовое решение.