|   | 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|  Menu  Distributions (131)  bootable [55]  commercial [7]  no-commercial [42]  unclassified [20]  [7]  Software  (10844) | 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Metaznak | Ekvivalent | 
| + | {1,} | 
| * | {0,} | 
| ? | {0,1} | 
Ukažme si nyní program, který ověřuje bezpečnost hesla. Heslo budeme považovat za bezpečné, bude-li splňovat tyto 4 podmínky:
Pro každou podmínku napíšeme regulární výraz a pokud vyhoví heslo všem těmto vzorům, máme jistotu, že je heslo bezpečné.
  print "Zadejte heslo: ";
  chomp($_ = <STDIN>);
  if (/[0-9]/  and  /[a-zA-Z]/ and /\W/ and /.{6,}/){
      print "Heslo je bezpečné\n";
  }else{
      print "Heslo není bezpečné\n";
  }
Poznámka - pokud byste chtěli, aby při zadávání hesla nezobrazovaly jeho pravé znaky, ale pouze hvězdičky (případně vůbec nic), použijte modul Term::ReadKey.
Metaznaky {}, *, + a ? jsou takzvaně hladové (,,greedy"). To znamená, že spolknou co možná nejdelší část řetězce. Dokazuje to tento kód:
  $_ = "123456789";
  /(\d*)/;
  print  $1; #tiskne hodnotu, která vyhověla vzoru - více v příštím díle
Je vytisknuto 123456789 - tedy celý řetězec. To i přesto, že by vyhověl třeba také prázdný řetězec, vyhodnocování regulárního výrazu by se mohlo úspěšně ukončit a program by běžel dál. Kvantifikátory jsou hladové, a tak pohlcují nejdelší vyhovující podřetězec. To samé by platilo i v případě, kdybychom jako kvantifikátor místo hvězdičky zvolili například {3,5}. Potom by předchozí kód vytiskl prvních 5 číslic a ne 3, ačkoliv by to také stačilo.
Tato vlastnost může občas činit problémy. Tak například, pokud chceme v HTML kódu vyhledat 1 obrázek a vypsat kód celé značky IMG:
  $html = 'abc....<IMG SRC="obrazek" ALT="obrázek">....xyz';
  $html =~ /(<((IMG)|(img))\ (.*)>)/;
  print  $1;
Hvězdička vlivem hladovosti spolkne znaky do konce řetězce. Ale tam v našem případě znak > není. Proto se začne z místa, po které hvězdička spolkla text (v našem případě konec řetězce) hledat. Najde ho, ukončí další vyhodnocování, protože je na konci regulárního výrazu a program vytiskne přesně to, co jsme chtěli. Takže v pořádku. Problém nastane, pokud se znak > vyskytuje ještě někde mezi místem, po které byl spolknut text a tím "správným" znakem >. To si můžeme jednoduše ilustrovat:
  $html = '<TABLE><TR><TD><IMG SRC="obrazek" ALT="obrázek"></TD><TD>...</TD></TR></TABLE>';
  $html =~ /(<((IMG)|(img))\ (.*)>)/;
  print  $1;
Začátek je stejný jako v minulém příkladu. Hledá se řetězec "<IMG ", poté hvězdička pohltí vše do konce a odtud se opačným směrem hledá znak >. Ale takový se vyskytne už v značce </TABLE>! To znamená, že získáme řetězec <IMG SRC="obrazek" ALT="obrázek"></TD></TR><TD>...</TD></TABLE>. To jsme opravdu nechtěli. A může za to právě hladovost.
Možnost, jak vzniklý problém řešit, může být přes funkce. To je zbytečně složité.
  $html = '<TABLE><TR><TD><IMG SRC="obrazek" ALT="obrázek"></TD><TD>...</TD></TR></TABLE>';
  $html =~ /(<((IMG)|(img))\ (.*)>)/;
  print substr($1, 0, (index $1, ">")+1);
Jiné, o dost lepší řešení, lze aplikovat pomocí negované množiny znaků. Místo libovolného znaku (v našem regulárním výrazu reprezentován tečkou), specifikujeme vše mimo znaku >.
  $html = '<TABLE><TR><TD><IMG SRC="obrazek" ALT="obrázek"></TD><TD>...</TD></TR></TABLE>';
  $html =~ /(<((IMG)|(img))\ ([^>]*)>)/;
  print  $1;
Dalším řešení nabízí sytost. Existují další 4 kvantifikátory, které fungují úplně stejně jako ty nám dosud známé, až na to, že nejsou hladové. Jsou to {}?, *?, +? a ??. Zapisují se stejné jako {}, *, + a ?, jen se za ně připisuje otazník. Pohltí minimální možný počet znaků, který vyhoví vzoru. Tento vzor tedy nepohltí 5 znaků, jak by to udělal hladový kvantifikátor, ale pouze 3:
  $_ = "123456789";
  /(\d{3,5}?)/;
  print  $1;
Nakonec si ještě ukážeme řešení pro problém s vyhledáním obrázku v HTML kódu pomocí sytosti:
  $html = '<TABLE><TR><TD><IMG SRC="obrazek" ALT="obrázek"></TD><TD>...</TD></TR></TABLE>';
  $html =~ /(<((IMG)|(img))\ (.*?)>)/;
  print  $1;
Příště se podíváme na funkci kulatých závorek v regulárních výrazech.
|  | ||
| KOMENTARZE Nie ma komentarzy dla tej pozycji. | ||
| 
   
    Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
   
  | ||
 Szukanie oprogramowania
	Szukanie oprogramowania
					| 1. | Pacman linux Download: 5539x | 
| 2. | FreeBSD Download: 9756x | 
| 3. | PCLinuxOS-2010 Download: 9247x | 
| 4. | alcolix Download: 11722x | 
| 5. | Onebase Linux Download: 10410x | 
| 6. | Novell Linux Desktop Download: 0x | 
| 7. | KateOS Download: 6911x | 
| 1. | xinetd Download: 3040x | 
| 2. | RDGS Download: 937x | 
| 3. | spkg Download: 5945x | 
| 4. | LinPacker Download: 11142x | 
| 5. | VFU File Manager Download: 3754x | 
| 6. | LeftHand Mała Księgowość Download: 7990x | 
| 7. | MISU pyFotoResize Download: 3466x | 
| 8. | Lefthand CRM Download: 4252x | 
| 9. | MetadataExtractor Download: 0x | 
| 10. | RCP100 Download: 3764x | 
| 11. | Predaj softveru Download: 0x | 
| 12. | MSH Free Autoresponder Download: 0x | 
 linuxsoft.cz | Design: 
					www.megadesign.cz
linuxsoft.cz | Design: 
					www.megadesign.cz