bnghtz

perl_regexp_pos_magyar.pl

Feb 18th, 2016
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.43 KB | None | 0 0
  1. #! /usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. my $a = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut cursus ante non lorem euismod suscipit. Aenean luctus commodo neque, a rutrum arcu vestibulum in. Duis dictum dignissim justo, eget aliquam risus scelerisque posuere. Nulla nec nisi a turpis accumsan hendrerit et vel orci. Quisque hendrerit sed diam tincidunt luctus. Proin euismod enim commodo interdum dictum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean vitae neque quam. Aenean nec augue vitae augue suscipit auctor malesuada vitae felis. Aenean mollis hendrerit ornare. Vestibulum a pharetra nulla. Duis id tincidunt leo, eu ornare ligula. Donec leo mauris, semper eget eros ut, venenatis eleifend elit. Aliquam purus nisl, mattis tempus odio vel###, tempor volutpat mauris. Mauris luctus in purus ac sagittis.";
  6.  
  7. my $b = $a;
  8. my $i = 0;
  9. my $j = 0;
  10. my $k = 0;
  11. my $pos = 'NULL';
  12.  
  13. #============================================================================#
  14. #============================================================================#
  15. =magyarazat
  16. OUTER: m/it/, ekkor pos nem kap értéket, mindig igaz lesz ez a feltétel, hiszen lorem ipsum-ra illeszkedni fog /it/
  17. OUTER: m/it/g, ekkor ő reseteli a pos-t miközben a szövegen annyiszor végig megy, ahányszor csak megtalálja it-t
  18. OUTER: m/it/g, ekkor nem reseteli a pos-t miközben a szövegen annyiszor végig megy, ahányszor csak megtalálja it-t
  19.  
  20. INNER: m/an/g, ekkor végtelen ciklus lesz, az OUTER-től függetlenül, hiszen ő reseteli a pos-t az adott bemenetre, így a másik feldolgozásban ismét előről fogja kezdeni az illesztést.
  21. INNER: m/an/gc nem reseteli a pos-t és végig megy majd az illesztéseken
  22.  
  23. Érdekességként beleraktam egy újabb global matchinget a ciklusba, ha érdekel, a kimenete, a $flag-et állítsd 1-re.
  24. A pos értéke változik, pedig egy helyen van csak a ###, azaz nem ez az illesztés fogja befolyásolni a pos-t.
  25. Ha belerakjuk a /g-t.s lesz a helyzet. De miért nem reseteli a pos-t elsőre? Azért, mert nem ért a string végére, csak egyszer futott le a global matching és ilyenkor a post nem kell resetelni. Másodszorra lefut az if-en belüli illesztés, akkor nem fogja megtalálni ###-t, hanem elér a string végére és ekkor reseteli a pos-t.
  26. Ha /###/cg esetén (gc, cg mindegy a sorrend), a pos nem fog resetelődni ennél az illesztésnél, csak a következőnél, azaz az OUTER-nél, ha ott éppen /g van és nem /gc.
  27. Amikor $i 3 lesz, harmadszorra már nem megy bele az if-be ágába a program.
  28.  
  29. =cut
  30. #============================================================================#
  31. #============================================================================#
  32. my $flag = 0;
  33.  
  34. OUTER: while ($b =~ m/it/g) {
  35.     $i++;
  36.     $pos = pos($b);
  37.     $pos ||= 'reseted';
  38.     print "'it' found $i at $pos\n";
  39.    
  40.     INNER: while ($b =~ m/an/gc) {
  41.         $j++;
  42.         $pos = pos($b);
  43.         $pos ||= 'reseted';
  44.         print "'an' found $j at $pos\n";    
  45.     }
  46.    
  47.     if (($flag == 1) && ($i < 3)) {
  48.         $k++;
  49.         print "\nHere comes Johnny $k!\n";
  50.         if ($b =~ m/###/) {
  51.             $pos = pos($b);
  52.             $pos ||= 'reseted';
  53.             print "'###' found at $pos\n";
  54.         }
  55.     }
  56.    
  57.     $pos = pos($b);
  58.     $pos ||= 'reseted';
  59.     print "END of OUTER, pos = $pos\n";
  60. }
  61.  
  62. $pos = pos($b);
  63. $pos ||= 'reseted';
  64. print "final pos = $pos\n";
Advertisement
Add Comment
Please, Sign In to add comment