W przypadku bardziej skomplikowanych zapytań regularnych przydaje się wiedzieć za co odpowiadają poszczególne jego fragmenty. Sztuczką pozwalają to osiągnąć jest skorzystanie z przełącznika x przy wyszukiwaniu oraz komentarzy oznaczonych zwykłym #, wieloliniowości oraz spacji (standardowo ignorowanych właśnie dzięki temu '/x’. Spójrzmy na poniższy przykład:
Program nc pozwala przeskanować serwer, sprawdzić czy serwer WWW jest dostępny ale jak łatwo pobrać stronę albo wywować stronę z jakimś parametrem? Jest to bardzo przydatne w przypadku posiadana urządzeń siecowych sterowanych przez przegląrkę.
Nazwa pliku powinna być taka sama jak nazwa pakietu ale dodajemy rozszerzenie pm (w naszym przypadku Template.pm). Jeżeli chcemy aby jakieś moduły były użyte w kodzie modułu, umieszczamy ich nazwy po słowie package (wcześniej wpisane dotyczyły by głównego programu czyli pakietu main).
Zwyczajowo, jeżeli chcemy odwołać się do funkcji będącej w module, musimy użyć nazwy modułu, dwukropka oraz nazwy funkcji (np. my $Cos = Template::Function(a,b)). Tą kłopotliwą składnie można uprościć dzięki eksportowaniu nazw funkcji i zmiennych (u nas use Export qw(import) i tablica wyeksportowanych elementów).
Moduł zawsze musimy kończyć wartością 1. Oznaczającą że kod został poprawnie załadowany.
#! /usr/bin/perl
package Template;
use strict;
use warnings;
use Data::Dumper;
use Exporter qw(import);
our @EXPORT_OK = qw(Function);
sub Function
{
}
1
Jednym z lepszych sposobów umieszczania danych w pliku (gdy mamy dużą ich ilość) jest umieszczenie ich na końcu pliku po napisie __END__. Wtedy możemy skorzystać z wbudowanej tablicy <DATA> jak poniżej:
#! /usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
print $_;
}
__END__
data1
data2
data3
data4
Problem:
W przypadku chęci mapowania dysków należy znaleźć vhost-a na podstawie numeru partycji, problem jest tylko jeden: numer ten jest w postaci szesnastkowej.
Poniższy kod pozwala na połączenie ssh, automatyczne podanie użytkownika i hasła, wykonanie prostej komendy, przejście do katalogu /tmp i oddaje władzę w ręce w użytkownika skryptu. Taka mała wprawka do programowania w tcl/expect…
#!/usr/bin/expect
## usage if no options
if {[llength $argv] != 3} {
puts "usage: ssh_login "
exit 1
}
# setup variables
set timeout 20
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
# call ssh command
spawn ssh "$user\@$ip"
# give password
expect "password:"
send "$password\r";
# give commands when you see "]#" mean all welcome messages are showed
expect "]#"
send "touch ~/I_was_HERE2.txt\r"
send "cd /tmp\r"
# give control to user
interact
Problem:
W pewnym pliku logów miałem stare wpisy i chciałem szybko usunąć. Wzorzeć był znany ale zabawa z tymczasowymi plikami i grepem raczej nie wchodziła w grę (nie chciałem zgubić logów właśnie zapisywanych).
Wpisy do usunięcia miały postać (chodziło o datę):
2013-08-08 11:39:17 temp:21.25
Rozwiązanie:
Sed z opcją -i pozwala zmieniać pliki w locie (inline):
Problem:
Piszę sobie hobbystycznie małą aplikację to zarządzania domowymi urządzeniami. Jednym z nich jest Arduino z podczepionymi czujnikami temperatury i natężenia światła. Dane z czujników są zapisywane na karcie SD. Na początku format daty ustaliłem sobie dość dowolnie i wyglądał on tak:
10/07/13-20:03:23 photo:49
Jednak w trakcie pisania aplikacji doszedłem do wniosku iż potrzebuję nastepujący format daty:
2013-10-07 19:53:58 photo:399
Rozwiązanie:
Rozwiązaniem okazała się jednolinijkowa komenda sed-a:
sed -i -r 's/([0-9]+)\/([0-9]+)\/([0-9]+)\-/20\3-\1-\2 /' photo_all_*.txt
Opcja -i powoduje nadpisanie pliku, -r włącza wyrażenia regularne.
W moim projekcie musiałem uzyć curl oraz logowanie przez login i hasło (w przeciwnym wypadku wystarczyło by użycie fopen). Wobec tego użyłem kodu podobnego do tego poniżej:
W nowszych wersjach PHP występuje nowa funkcja odpowiedzialna za ładowanie klass spl_autoload_register(’function_name’) w przeciwienstwie do poczciwego __autoload(). Wobec tego aby móc znowu automatycznie ładować klasy należy stworzyć kod podobny do poniższego:
function my_autoload($class_name) {
include "lib/class/$class_name".'.class.php';
}
spl_autoload_register('my_autoload');
Wiadomości o Linuksie, AIX-ie, oprogramowaniu open-source itp…