Внедряване в perl

  1. Замяна на множество интервали и нетекстови знаци с единични интервали:

$text = "Ето текста." $текст =

tr[\000-\040\177\377][\040]s; печат $текст; Ето текста.

Намалете двойно, утроено и т.н. букви:

$text = "Тук е texxxxxxt."; $текст =

tr/a-zA-Z/s; печат $текст; Ето текста.

Преизчислете броя на неазбучните знаци:

Нулете осмия бит от знаци, премахнете нетекстовите знаци:

Заменете нетекстовите и 8-битовите знаци с един интервал:

Търсене на отделни думи

За да маркирате дума, можете да използвате метасимвола \S, за да съпоставите знаци, които не са интервали:

$text = "Сега е моментът."; $текст =- /(\S+)/; печат; Сега

Метасимволът \S обаче съвпада и със знаци, които обикновено не се използват за идентификатори. За да изберете думи, съставени от латински букви, цифри и долна черта, трябва да използвате метазнака \w:

$text = "Сега е моментът."; $текст =

Ако искате да включите само латински букви в търсенето, трябва да използвате символния клас:

$text = "Сега е моментът."; $текст =

По-безопасен метод е да включите въображаеми гранични знаци на думата в шаблона:

$text = "Как е часът."; $текст=

Прикрепете към началото на линията

Началото на низа съответства на метасимвола (въображаем знак) ^. За да шаблонирате началото на низ, трябва да посочите този знак в началото на регулярния израз. Ето как например можете да проверите дали текстът не започва с точка:

m/^\./) print "Не трябва да започва изречение с точка!\n"; > Не трябва да започва изречение с точка!

Така че точката, посочена в шаблона, не есе интерпретира като метасимвол и трябва да бъде предшестван от обратна наклонена черта.

Закрепване към края на линия

За закрепване на шаблон към края на низ се използва метасимволът (въображаем знак) $. В нашия пример използваме закотвяне на шаблон в началото и края на низа, за да гарантираме, че потребителят е въвел само думата "изход":

Можете да използвате метасимволите \d и \D, за да проверите дали потребителят наистина е въвел число. Метасимволът \D съответства на всеки знак, различен от числа. Например, следният код проверява дали въведеният текст наистина е цяло число без знак и пропуски:

$test = "Здравей!"; if($text =

/\D/) print "Това не е число.\n"; > Това не е число.

Същото може да се направи с помощта на метасимвола \d:

/^\d+$/) print "Това е число.\n"; > Това е число.

Можете да изисквате номерът да отговаря на познатия формат. Тоест едно число може да съдържа десетична запетая, предшествана от поне една цифра и евентуално няколко цифри след нея:

$text="3.1415926"; if($text =

/^(\d+\.\d*\d+)$/) print "Това е число.\n"; > Това е число.

Освен това, когато проверявате, можете да вземете предвид факта, че числото може да бъде предшествано както от плюс, така и от минус (или празно място):

$text = "-2.7182"; ако ($текст =

Тъй като плюс е метасимвол, той трябва да бъде защитен с обратна наклонена черта. Въпреки това, вътре в квадратни скоби, т.е. клас символи, той не може да бъде количествено определен. Знакът минус вътре в символен клас обикновено играе ролята на оператор за диапазон и следователно трябва да бъде защитен с обратна наклонена черта. Въпреки това, в началото или края на модела, той не може да посочи диапазон по никакъв начин и следователнообратната наклонена черта не е задължителна. И накрая, по-строга проверка изисква знакът, ако има такъв, да е само един:

$text = "+0.142857142857142857"; ако ($текст =

/^(+-)\d+(\.\d*\)$/) print "Това е число.\n"; > Това е число.

Алтернативните модели, ако има такива, се проверяват отляво надясно. Изброяването на опциите приключва веднага щом се открие съвпадение между текста и шаблона. Следователно, например, редът на алтернативите в шаблона (\.\d*) може да стане критичен, ако не беше закрепването към края на реда. И накрая, ето как можете да проверите дали текстът е шестнадесетично число без знак и други атрибути:

$text = "1AO"; освен ако (ftext =

m/^[a-fA-F\d]+$/) print "Това не е шестнадесетично число, \n"; >

удостоверяване на лична карта

С помощта на метасимвола \w можете да проверите дали текстът се състои само от букви, цифри и долна черта (това са знаците, които perl нарича знаци на думата):

/^\w+$/) print "Намерени са само символи с думи. \n"; > Намерени са само знаци от думи.

Ако обаче искате да сте сигурни, че текстът съдържа латински букви и не съдържа цифри или долни черти, ще трябва да използвате различен модел:

И накрая, за да проверите дали текстът е идентификатор, т.е. започва с буква и съдържа букви, цифри и долна черта, можете да използвате командата:

$text = "X125c"; ако($текст=

/^[A-Za-z]\w+$/) print "Това е идентификатор.\n"; > Това е идентификатор.

Как да намерите множество съвпадения

Можете да използвате модификатора g, за да търсите множество срещания на шаблон. Следващият пример, който видяхме по-рано, използва командата m/. / с g модификатор за намиране на всичкисрещания на буквата x в текста:

$text="Тук е texxxxxt"; while($text=

m/x/g) отпечатайте "Намерен друг x.\n"; > Намерих друго x. Намерих друго x. Намерих друго x. Намерих друго x. Намерих друго x.

Модификаторът g прави търсенето глобално. В даден (скаларен) контекст perl запомня къде е спрял в реда при предишното търсене. Следващото търсене продължава от забавената точка. Без модификатора g, командата m/. / ще продължи да намира първото срещане на буквата x и цикълът ще продължи безкрайно.

За разлика от m/. /команда s/. /. / с модификатора g извършва глобалната замяна наведнъж, като действа така, сякаш вече има вграден цикъл за търсене като този по-горе. Следният пример замества всички срещания на x с z наведнъж:

$text = "Тук е texxxxxt."; $текст =

s/x/z/g; печат $текст; Ето tezzzzt.

Без модификатора g, командата s/. /. / ще замени само първата буква x. s/ команда. /. / връща като стойност броя на направените замествания, които могат да бъдат полезни:

$text="Тук е texxxxxt."; печат (текст=

Намиране на съвпадения без значение за малки и големи букви

Можете да използвате модификатора i, за да направите търсенето нечувствително към разликата между главни и малки букви. В следния пример програмата повтаря текста, въведен от потребителя на екрана, докато бъде въведено Q или q (съкратено от QUIT или quit), в който момент програмата прекратява:

извличане на подниз

За да получите намерения подниз от текст, можете да използвате скоби в тялото на шаблона. Ако е по-удобно, можете да използвате и вградената функция substr. В следващия пример изрязваме типа, от който се нуждаем, от текстов низпродукти:

$record = "Номер на продукта:12345 Тип на продукта: принтер Цена на продукта: 5"; if($record=

/Тип на продукта:\s*([a-z]+)/i) print "Типът на продукта е^.\n"; > Типът на продукта е принтер.

Извикване на функции и оценяване на изрази при заместване на текст

Използване на s/ за командата. /. / модификатор e, вие посочвате, че десният операнд (т.е. заместеният текст) е perl изразът, който трябва да бъде оценен. Например, като използвате вградената функция uc (главни букви) на perl, можете да промените всички малки букви на думите в низа на главни:

$text = "Сега е моментът."; $текст=

s/(\w+)/uc()/ge; печат $текст; СЕГА Е МОМЕНТЪТ.

Вместо функцията uc($l), можете да поставите произволен код, включително програмни извиквания.

Намиране на n-то съвпадение

Модификаторът g итерира всички повторения на дадения шаблон. Но какво ще стане, ако имате нужда от добре дефинирана точка на съвпадение с шаблона, например втората или третата? Операторът за цикъл while, комбиниран със скоби за подчертаване на желания модел, ще ви помогне:

$text = "Име: Ан Нание: Буркарт Име: Глер Име: Дан"; докато ($текст =

/Име: \s*(\w+)/g) ++$match; print "Номер на съвпадение $match е .\n"; >

Съвпадение номер 1 е Anne Съвпадение номер 2 е Burkart Съвпадение номер 3 е Claire Съвпадение номер 4 е Dan

Този пример може да бъде пренаписан с помощта на for цикъл:

$text = "Име:Ан Име:Бъркарт Име:Ciaire Име:Дан"; за ($match = 0; $text =

/Име:\s*(\w+)/g; печат "Съвпадението на $ е .\n") <> Съвпадение номер 1 е Anne Съвпадение номер 2 е Burkart Съвпадение номер 3 е Claire Съвпадение номер 4 е Dan

Ако трябва да определите желаното съвпадение не по брой, а по съдържание(например по първата буква от потребителското име), тогава вместо брояча на $match можете да анализирате съдържанието на променливата, актуализирана с всяко намерено съвпадение. Когато искате да замените, вместо да намерите, второто или третото появяване на текст, можете да използвате същия модел, като използвате като тяло на цикъла perl израз, извикан за оценка на заместващия низ:

$text = "Име:Ан Име:Бъркарт Име:Клеър Име:Дан"; $съвпадение=0; $текст =

s/(Име:\s*(\w+))/ # perl кодът започва if (++$match == 2) < # увеличаване на брояча "Име:Джон ()" # връщане на нова стойност > иначе < ># запази старата стойност /gex; печат $текст; Име: Ан Име: Джон (Бъркарт) Име: Клеър Име: Дан

Как да ограничим "алчността" на кванторите

По подразбиране кванторите се държат като "алчни" обекти. Започвайки от текущата позиция за търсене, те улавят най-дългия низ, на който регулярният израз, предшестващ квантора, може да съответства. Алгоритъмът за обратно проследяване на Perl е в състояние да ограничи апетита за квантори чрез обратно проследяване и намаляване на дължината на уловения низ, ако не може да се намери съвпадение между текст и модел. Този механизъм обаче не винаги работи както желаете. Помислете за следния пример. Искаме да заменим текста „Това е“ с текста „Това е“. Въпреки това, поради алчността на квантора, регулярният израз " .*is " съвпада с част от текста от началото на реда до последното намерено "is":

$text = "Това е някакъв текст, нали?"; $текст =

s/.*is/Това е/; печат $текстове; Не е ли това?

За да направите кванторите не толкова алчни, а именно да ги накарате да улавят минималния низ, на който съответства регулярният израз, след квантора, от който се нуждаетепостави въпросителен знак. Така кванторите приемат следната форма:

  • *? - нула или повече съвпадения,
  • +? - едно или повече съвпадения,
  • ?? - нула съвпадения или едно съвпадение,
  • ? - точно n съвпадения,
  • ? - поне n съвпадения,
  • ? - съвпада най-малко с n, но не повече от m.

Обърнете внимание, че значението на квантора не се променя; променя се само поведението на алгоритъма за търсене. Ако прототипът е недвусмислено определен по време на съпоставянето на шаблон към текст, тогава алгоритъмът за обратно проследяване ще увеличи "алчността" на такъв квантор по същия начин, по който ограничава апетита на колегата. Ако обаче изборът е двусмислен, резултатът от търсенето ще бъде различен:

$text = "Това е някакъв текст, нали?"; $текст =

s/.*?is/Това е/; печат $текстове; Това е някакъв текст, нали?

Как да премахнете началните и крайните интервали

За да отстраните водещите "бели интервали" от низ, можете да използвате следната команда:

$text = "Сега е моментът."; $текст =

s/^\s+//; печат $текстове; Сега е моментът.

За да отрежете интервалите "опашка", командата е добра:

$text = "Сега е моментът."; $текст =

s/\s+$//; печат $текстове; Сега е моментът.

За да отрежете както началните, така и завършващите интервали, е по-добре да изпълните тези две команди последователно, отколкото да използвате шаблон, който изрязва ненужните интервали наведнъж. Тъй като процедурата за съпоставяне на шаблон към текст е доста сложна, тази проста операция може да отнеме много повече време, отколкото бихме искали.

Например в текста трябва да намерите текста между отварящия и затварящия тагове:

намира всички думи между таговете и .

В редовенизразите имат своя собствена семантика: скорост, бързина и връщане. Ако кванторът * съвпада в много случаи, тогава най-дългият резултат ще бъде показан като резултат. Това е алчност. Бързо: търсенето се опитва да намери възможно най-бързо. "текст"=

/m*/ , което означава, че няма m знака, но стойността 0 ще бъде върната като резултат. Тези. формално 0 или повече знака.

$test="aaooee ooaao"; $тест=

s/o*/e/; печат $тест; еаооооооооооо

тъй като 1 елемент от низа е 0 или повече символа.

Ако добавим квантора g, резултатът ще бъде:

тъй като низът съдържа 13 места, където може да се появи o, включително празни.

при извикване на use locale се вземат предвид локалните настройки. Модификаторът /g може да запълни масив от стойности @nums = m/(\d+)/g; но ще работи за съвпадения без припокриване. За да хванете съвпадения, трябва да използвате оператора ?=. Ако ширина = 0, тогава търсачката остава на същото място. Намерените данни остават в скобите. Ако има модификатор /g, текущата позиция остава същата, но се премества с един знак напред.

Модификаторите m и s са необходими за търсене на последователности от знаци, съдържащи нов ред. За s точката съвпада с \n и игнорира $*. m прави съвпадението на ^ и $ преди и след \n. e дясната страна се изпълнява като код: perl -i -n -p -e 's/(.)/lc()/g' *.html преобразува всички символи във всички *.html файлове в текущата директория в малки букви.