Tekstowe

Perl FAQ | RecentChanges | Preferences

1. Czy da się użyć zmiennej o zmiennej nazwie?
2. Jak porównać dwa ciągi znaków?
3. Jak wyłączyć znaki specjalne?
4. Jak wyciąć spacje z przodu i końca?
5. Jak wyrzucić powtarzające się znaki?
6. Jak sprawdzić czy tekst ma dane litery?
7. Jak utworzyć wyrażenie regularne z podanych wyrazów?
8. Jak wyciągnąć tekst z pliku HTML?
9. Jak wyciągnąć linki z HTMLa?
10. Jak zamienić encje HTML?
11. Czym innym parsować HTML?
12. Jak wyłuskać tekst pomiędzy stringami?
13. Jak znaleźć i podmienić N-ty znak?
14. Jak sformatować tekst do N-tego znaku?
15. Czy w danym ciągu występują tylko określone znaki?
16. Jak przeformatować tekst (np. dla maila)?
17. Jak zakodować string dla WWW (urlencoding)?
18. Jak zakodować/odkodować stdin przez ROT-13 i wyświetlić?

1. Czy da się użyć zmiennej o zmiennej nazwie?

Tak, jest to możliwe, choć poleca się stosowanie tablic. Np.: Zamiast ${"zmienna$nr"} czy $$nazwa_zmiennej lepiej użyć $zmienna[$nr] http://perl.plover.com/varvarname.html

2. Jak porównać dwa ciągi znaków?

Służą do tego operatory =~, eq, ne, gt, lt, itp.

Do porównywania rozmytego - moduł String::Approx.

3. Jak wyłączyć znaki specjalne?

W wyrażeniu regularnym stosuje się \Q i \E:

 \Q$test\E

Można też użyć funkcji quotemeta, poprzedzającej każdy znak znakiem backslash (\).

4. Jak wyciąć spacje z przodu i końca?

 s/^\s*(.*?)\s*$/$1/; lub s/^\s*|\s*$//g;

lub szybciej:

 $string =~ s/^\s+//;
 $string =~ s/\s+$//;

5. Jak wyrzucić powtarzające się znaki?

 $tekst =~ tr///cs; 

lub

 $tekst =~s/(.)\1+/$1/g;

6. Jak sprawdzić czy tekst ma dane litery?

Jeśli chcemy sprawdzić czy dany tekst zawiera inny:

 $skalar  =~ /$skalar2/

jeśli nie zależy nam na kolejności (tworzymy anagram):

 $skalar =~ /[$skalar2]/

7. Jak utworzyć wyrażenie regularne z podanych wyrazów?

Ogólnie się nie da, ale można próbować konstrukcji:

 $pattern = join "|", map {"^\Q$_\E$"} @words;

8. Jak wyciągnąć tekst z pliku HTML?

Chodzi o pozbycie się tagów HTML. Należy użyć modułu HTML::Parser, lub mu pokrewnych (np. HTML::Entities).

 use HTML::Parser;
 $p = HTML::Parser->new( text_h => [ 
   sub { 
     print $_[0]
   }, "dtext" 
 ]);
 $p->parse_file("plik.html");

Alternatywą w prostszych przypadkach może być jedno z wyrażeń.

 $zmienna =~ s/<.*?>//g;
 $zmienna =~ s/<(?:[^>'"]*|(['"]).*?\1)*>//gs;

9. Jak wyciągnąć linki z HTMLa?

 use HTML::LinkExtor;
 my $p=HTML::LinkExtor->new();
 $p->parse_file($plik);
 foreach($p->links()) {
  print $_->[2];
 }

10. Jak zamienić encje HTML?

Przykład

 perl -MHTML::Entities -e 'print encode_entities("&"), "\n"'

11. Czym innym parsować HTML?

Moduł HTML::TreeBuilder (HTML::Tree) ma ciekawy interfejs podobny do XML::TreeBuilder. Alternatywa to HTML::TokeParser.

12. Jak wyłuskać tekst pomiędzy stringami?

Służyć może do tego (wyciąganie wielu linii) konstrukcja z operatorem zakresu (..):

 /start/../koniec/

Do wyciągania z pliku wszystkiego pomiedzy literą b a f:

 perl -ne 'print if /b/../f/' plik

Kolejne teksty w cudzysłowach:

 while ( m/"([^"]*)"/g ) {
   print $1; ## tutaj w $1 beda kolejne teksty w ciapkach
 }

Bardziej ogólnie:

 /START(.*?)END/s; print $1;

13. Jak znaleźć i podmienić N-ty znak?

 substr($string,0,n)="b"; 

14. Jak sformatować tekst do N-tego znaku?

Jeśli N jest np. 80, a chcemy miec znaki tylko do N-tej kolumny, nie naruszając wyrazów (linie mogą konczyć się wcześniej), to wtedy:

 s/(.{0,80})\s+/$1\n/g

15. Czy w danym ciągu występują tylko określone znaki?

 $ciag =~ tr/ABCDEFG//c   

Zwraca ilość wystąpień innych niż podane znaki. Czyli jeżeli >0, to są inne.

 $ciag =~ /^[ABCDEFG]+$/

16. Jak przeformatować tekst (np. dla maila)?

Służy do tego moduł Text::Wrap, a także Text::WrapProp i Text::Format;

17. Jak zakodować string dla WWW (urlencoding)?

 s/([^\w\!*-])/sprintf("%%%02X",ord($1))/ge;

lub z modułem CGI:

 use CGI;
 $q=new CGI;
 $q->param(-name=>'nazwa',-value=>'wa //rte');
 print $q->query_string;

lub z modułem URI::Escape funkcja uri_escape()

18. Jak zakodować/odkodować stdin przez ROT-13 i wyświetlić?

 perl -pe 'tr/a-zA-Z/n-za-mN-ZA-M/'

Perl FAQ | RecentChanges | Preferences
This page is read-only | View other revisions (diff)
Search:
Strona znajduje się na serwerze KT AGH.