Ezt a "fejezetet" a Perl (Perl 5) programnyelvnek, pontosabban néhány tipikus, Perl programozás közben gyakorta felmerülő feladat "megoldásának" szentelném.
A bejegyzés folytatódik »
A bejegyzés nem kommentezhető
Gyakori feladat: van egy címlistánk, ugyanazt az e-mailt ki kell küldenünk mindegyik címre. Egy meglehetősen primitív megoldást adnék erre lentebb.
A program első paramétereként a címlistát várja (txt file, soremelésekkel lezárva, egy e-mail egy sor), másodiknak a kiküldendő e-mail file-ját. A kiküldendő file első sora a feladó e-mail címe, második a levél tárgya, harmadiktól maga a levél.
ISO-8859-2 kódkészletet feltételezünk mint a subject-re, mind a levél törzsére!
Primitiv hírlevél küldő
use strict;
use MIME::Lite;
use Slurp;
use Regexp::Common qw/Email::Address
/;
use MIME::Words qw/encode_mimeword
/;
# buffer nem
$|=
1;
# elso parameter: e-maileket tartalmazo file
die(
"$ARGV[0] not found\n")
unless (
-f $ARGV[
0]);
# masodik parameret: txt file, amit kikuldunk
die(
"$ARGV[1] not found\n")
unless (
-f $ARGV[
1]);
# file tartalma: from, subject, body
my (
$from,
$subject,
$body) =
(slurp(
$ARGV[
1]) =~
/(.*?)\n(.*?)\n(.*)$/s);
print "Subject: $subject\nFrom: $from\n";
# ISO-8859-2 -t feltetelezunk, ezert kodolnunk kell!
$subject = encode_mimeword(
$subject,
'Q',
'ISO-8859-2');
# emailek beolvasasa, soronkent szetbontasa, majd be a tombbe
my (
@emails) =
split(
/\n/, slurp(
$ARGV[
0]));
# kiirjuk az alapadatokat es varakozunk egy kicsit
print scalar @emails,
" darab e-mail cimre kuldjuk...\n";
foreach my $i (
0..5) {
print 5-
$i,
"\r";
sleep(
1); }
# tenyleges levelkuldo ciklus
foreach my $line (
@emails) {
# e-mail cim ellenorzes, biztos ami biztos
if (
$line !~
/($RE{Email}{Address})/) {
print "\nHibas cim: $line";
next;
}
print "\nTo: $1";
# mehet egy mail
my $mail =
MIME::Lite->new(
'From' =>
$from,
'Subject' =>
$subject,
'To' =>
$1,
'Data' =>
$body
);
$mail->
attr(
'content-type.charset' =>
'ISO-8859-2');
$mail->
send();
}
print "\nKesz.\n";
Az encode_mimeword-öt használjuk a subject megfelelő kodolására (ez nem tökéletes így, de erről majd valamikor máskor), levélküldésre a MIME::Lite-ot.
Ez a program így ahogy van működik, de használni "as-is" annyira nem ajánlom

. Ha valaki ténylegesen üzembe szeretné helyezni, javaslom:
- bemeneti paraméterek jobb ellenőrzését, hibaüzenetekkel
- beolvasott file-ok (főleg az e-mail file) ellenőrzését, bolondbiztosabb feldolgozását
- szöveg kódolásának ellenőrzése
- teszt beépítése (kiküldés egy címre)
- tényleges mailküldő résznél hibaellenőrzés (legalább egy "eval" blokk)
- "nohup"-os, background-os futtatást
- stdout log-olását, hogy legyen valami nyomunk, ha küldés közben valamiért elhalálozik a script
A bolondbiztossá tétel egy ilyen feladatnál igen fontos: több ezer címre hibásan e-mailt küldeni meglehetős leégést eredményezet...
A bejegyzés nem kommentezhető
A feladat: egy adott képfile átméretezése úgy, hogy a létrejövő kép egy előre megadott méretű téglalapba beférjen, és ne torzuljon (tartsa meg a méretarányait). Lehetőleg a script minél több formátumot ismerjen.
Mellébeszélés helyett lássuk egyből a kódot!
Thumbnail Generator
use strict;
use Image::Magick;
# szelesseg, magassag definicio, file-ok megadasa
my (
$width,
$height,
$infile,
$outfile) = (
160,
160,
'./kep.jpg',
'./ujkep.png');
# object letrehozasa, kep beolvasasa
my $im =
Image::Magick->new;
my $read =
$im->
Read(
$infile);
$read &&
die(
$read);
# EREDETI szelesseg, magassag beolvasasa
my (
$w,
$h) =
$im->
Get(
'width',
'height');
print "Beolvasva: $infile. Meret: $w x $h\n";
# Aranyok megallapitasa, uj meret kiszamitasa
my (
$neww,
$newh);
if (
$w/
$h >
$width/
$height) {
$neww =
$width;
$newh =
int(
$h * (
$neww/
$w));
}
else {
$newh =
$height;
$neww =
int(
$w * (
$newh/
$h));
}
print "Az uj meret: $neww x $newh\n";
# Tenyleges atmeretezes, kimentes
$im->
Resize(
'width' =>
$neww,
'height' =>
$newh);
$im->
Write(
$outfile);
print "Kesz.\n";
Ez a kód meglehetősen "kiherélt", mindössze a minimális dolgokat tudja. A felhasznált képmanipuláló modul az
ImageMagick, amely véleményem szerint az egyik legjobb képmanipuláló csomag (egy C library-ról van szó, amihez a Perl modul csak egy binding).
A képet beolvassuk, méretarányai szerint kiszámoljuk a thumbnail méretét, majd kicsinyítünk. Akkor is átméretezünk, ha "nem kell", vagyis ha a forráskép eleve kisebb, mint a megadott téglalap - házi feladat, hogy ez ne így legyen

.
Ja, és igen: az ImageMagick igazából egyetlen utasítással is tud thumbnail-t készíteni, de ezzel most ne törődjünk
Hozzászólások száma:2