Forum Webscript.Ru
Программирование => Perl => Тема начата: 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 выведена шапка.
есть ли какой нибудь простой выход?
-
ну раз никто не знает, буду делать как придумал я.
в основной скрипт внесем проверку существующих СМИ.
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"))
-
Я бы вбил все СМИ в массив и написал бы функцию проверки наличия заданной СМИ в этом массиве.
$smi eq ("otdmark"||"menmen"||"made"||"zrekl"||"markua"||"prmeneger"||"btl"||"marrek"||"novmark"||"marisua"||"marketolog") - это ужасно =)
-
Лучше хеш использовать.
-
2NetFly
чем ужасно?
NeoNox
чем лучше?
ALL
но где же у меня ошибка? почему не работает? запутался в 1-й строчке ...
-
Yaroslav правильнее, оптимальнее для проверки и красивее.
Yaroslav:
но где же у меня ошибка? почему не работает? запутался в 1-й строчке ...
В корне неправильно использован оператор сравнения.
-
NeoNox:
правильнее, оптимальнее для проверки и красивее.
почему то я считал что чем меньше простых действий - тем и правильней и оптимальней. зачем создавать хеш или масив и хранить его в памяти если можно сделать проще? ну тут вам наверное виднее, хотите не обьясняйте :) но вот еще вопрос по поводу хеша, к чему его то можно прикрутить? к ключу или значению а дальне? а смысл? очень прошу обьяснить вашу логику.
NeoNox:
В корне неправильно использован оператор сравнения.
ну и для общего просвящения...
-
Твое выражение
("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]; }
-
Ivan Kolesnikov
огромное спасибо за разьяснения о ||
хотя почему его обозвали как или что единтично как or
и немного поковырявши проверку еще и масивом, понял, что использования хеша действительно лучше :)
-
На самом деле || и так идентично or, за одним исключением: у or очень низкий приоритет.
-
Yaroslav:
и немного поковырявши проверку еще и масивом, понял, что использования хеша действительно лучше
Ну вот видишь, сам теперь разобрался. Это всяко лучше чем получать готовое решение.