-
- 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/'