|
В статията, озаглавена “Управление на фирмения сайт”, разбрахме как да ползваме файлове шаблони и да връщаме различни отговори към браузъра в зависимост от подадената заявка към скрипта. С няколко конструкции if(){}elsif(){}else{} обработихме различните заявки. Този подход е приемлив, ако случаите, в които ще го прилагаме, се броят на пръстите на едната ръка. Ако имаме само няколко страници в сайта, бихме се справили и без Perl. Просто щяхме да създадем отделна страница за всеки език. Ако обаче имаме голям сайт и искаме да го управляваме с един или само няколко скрипта на Perl, трябва да намерим по-добро решение. Би трябвало да се водим от максимата “Пиши веднъж, ползвай многократно”.
Perl поддържа три основни типа данни: скалари ($scalar), масиви (@array) и хешове (%hash). Съществуват и т.нар. глоб (*glob или *typeglob) данни, както и файловите манипулатори, но сега ще ползваме най-вече първите три типа. Какво представляват всички те, можете да разберете от секцията perldata в документацията на Perl. Бихме ли могли да представим нашите страници като скалари в масив? Или по-функционално ще е да ги представим като стойности в хеш двойки, а те да се извикват чрез съответните им ключове? Така, използвайки един или няколко шаблона за всички страници в сайта, ще можем да генерираме съответната страница при съответната заявка. А и хешовете са по-бързи от масивите. След двайсетия елемент обаче отново ни налягат черни мисли и се чудим как ли съществуват онези сайтове с хилядите различни страници в тях. Е, чували сме за бази от данни, но все още сме далеч от тази материя, а и договорът ни за хостинг може би не включва тази опция. Проблемът е в това, че ние така или иначе трябва да създадем съдържанието на всяка страница поотделно, особено ако тези страници не са еднотипни. Да така е. Но такива са само представителните страници от сайта и тези, които служат като вход към конкретни раздели. Ако имаме каталог с артикулите, предлагани от нашата фирма, ще трябва да измислим начин, по който да съхраняваме данните за всяка отделна страница от каталога извън скрипта. При всяка заявка скриптът ще прочита тези данни, ще взима от тях това, което му е необходимо, и ще генерира съответната страница. Нека разгледаме логическата структура на един въображаем сайт. ВХОДНА_СТРАНИЦА-------- |--ЗА_НАС | | |--ИСТОРИЯ | | |--ПРОДУКТИ|--група1 | | | |--група2 |--ЦЕНИ | |--група3 Всяка група артикули би могла да бъде представена като масив от скаларни стойности. my @group1=($product_0, $product_1, $product_2, $product_n); Все пак е някакво начало. За съжаление, от една страна, всеки от продуктите се описва с различен набор от данни. Така например в зависимост от сферата на дейност на фирмата и продуктите, които тя предлага, тези продукти могат да имат най-различни характеристики: размер, тегло, цена, срок на годност и пр. От друга, скаларите могат да съдържат само атомарни, неделими данни. Наистина с функцията split и символа, използван за разделител на данни, всеки скалар би могъл да се раздели на отделни части (отделните характеристики на съответния продукт), но на нас обаче ни трябва нещо по-добро. Не е достатъчно да представим описанието на всеки продукт като масив от данни и просто го сложим в масива @group1, защото масивът, поставен в друг масив, не остава отделен по някакъв начин от останалите елементи. Неговите елементи стават част от масива, в който е поставен, т.е. “масивите се сплескват”. С хешовете положението е още по-трагично. При тях дори не знаем в какъв ред са отделните двойки ключ – стойност. Когато се сблъсках за първи път с този проблем, нещата ми се видяха безнадеждни. Естествено, решение има и то се нарича референция. Референцията е начин за достигане до определена част от данните, начин за посочване на определено място в паметта на компютъра. Например (съвсем абстрактно погледнато) в сайта www.somesite.com, в раздел продукти, група 1, продукт 235. По този начин бихме могли да представим целия сайт. Кликването върху дадена връзка в сайта ще извиква референцията към определена част от данните, от които нашият скрипт ще генерира съответната страница. Референциите винаги са скалари. Независимо от това те могат да сочат към масиви, масиви от масиви (матрици), хешове и цели дървета от данни (хешове от хешове и масиви). За разлика от указателите в С и С++, референциите не ни дават възможност сами да интерпретираме това, към което те сочат. Частта от данните винаги е дефинирана предварително (скалар, хеш или масив). Разбира се, дадена съвкупност от данни може да се разглежда по най-различни начини. Ако интерпретирате масив като хеш, ще знаете, че всеки нечетен елемент е ключ, а всеки четен – стойност (това е валидно само за масивите с четен брой елементи). Чрез референциите получаваме така желаната многомерност на данните. Не само това. Чрез тях можем да създаваме анонимни данни, т.е можем да имаме масив от масиви, който няма име на променлива, просто си се намира някъде в паметта на компютъра. Съществува си ей така безименен в оперативната памет или върху твърдия диск. Всяка структура от данни може да бъде записана във файл на диска, ние ще създаваме само посоката (референцията) към нея.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||








