I’ve been trying to learn how to use Perl to do some simple stuff whenever I just cannot use PHP. PERL is a language that I have access on every machine under my control, but unfortunately I cannot say the same thing about PHP and that is why I have decided to start learning using this ultra flexible language.

Now, the first thing I have developed (aside from the popular Hello World – LOL) was a simple script to check for website updates. This was particularly useful to check for updates on a website related to a contest.

use strict;
use warnings;
use LWP::Simple;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use Encode qw(encode_utf8);
 
my $link                = 'http://www.foobar.com';
my $email_from          = '[email protected]';
my $email               = '[email protected]';
my $email_subject       = 'Website Changed!';
my $email_body          = 'Hello! I just want to let you know that the website ' 
                          . $link . ' have just changed!';
my $tmp_file            = '/tmp/stored_hash';
 
my $web_source = get( $link );
my $current_hash =  md5_hex(encode_utf8($web_source));
 
if(-e $tmp_file)
{
        open FH, "<$tmp_file" or die "could not open: $!\n";
        my $mod_hash = <FH>;
        if( $current_hash ne $mod_hash )
        {
                open(MAIL, "|/usr/sbin/sendmail -t");
                print MAIL "To: $email\n";
                print MAIL "From: $email_from\n";
                print MAIL "Subject: $email_subject\n\n";
                print MAIL "$email_body\n";
                close(MAIL);
 
        }
        close FH;
}
        open FH, ">$tmp_file" or die "could not create: $!\n";
        print FH $current_hash;
        close FH;

Just replace the email and link stuff to suite your needs and you are all set! Enjoy!

Depois do último algoritmo para validar o contribuinte, aqui fica uma versão para validar o NIB.

function isValidNib($nib){
$result = "";
if(strlen(intval($nib)) != 21)
return "NIB INVALIDO (Standard: 21 algarismos. Introduzido: " . strlen(intval($nib)) . ")";
 
$nnib = str_split(intval($nib));
 
for($i=0; $i&lt; 19 ; $i++){
        $result = (($result + $nnib[$i]) * 10) % 97;
}
$result = 98 - (($result * 10) % 97);
 
if($result &lt; 10)
        $result = "0" + $result;
 
if(substr($nib, 19, 2) != $result)
        return "NIB INVALIDO";
else
        return "NIB VALIDO";
}

Se preferirem podem trocar o texto enviado no retorno das funções e utilizar um boleano true/false.

EDIT: Agradecimentos ao Nuno Cancelo pela dica de optimização enviada! :)

Já tenho visto por aí vários algoritmos para validar o numero de contribuinte, mas não vi um feito em PHP.

Disponibilizo aqui um pedaço de código em PHP para que possam incluir nos vossos serviços.

function isValidNif($nif){
 
//Verificar se e' um numero e se e' composto exactamente por 9 digitos
if(!is_numeric($nif) || strlen($nif) != 9) return false;
 
$narray = str_split($nif);
 
//verificar se o primeiro digito e' valido. O primeiro digito indica o tipo de contribuinte.
if($narray[0] != 1 &amp;&amp; $narray[0] != 2 &amp;&amp;  $narray[0] != 5 &amp;&amp; $narray[0] != 6 &amp;&amp; $narray[0] != 8 &amp;&amp; $narray[0] != 9)
        return false;
 
$checkbit = $narray[0] * 9;
 
for($i=2; $i&lt;=8; $i++){
        $checkbit += $nif[$i-1] * (10 - $i);
}
 
$checkbit = 11 - ($checkbit % 11);
 
if($checkbit &gt;= 10) $checkbit=0;
 
if($nif[8] == $checkbit) return true;
echo "$nif - $checkbit";
return false;
}

O PHP4 já foi descontinuado à muito tempo mas infelizmente ainda é necessário em algumas plataformas que não são actualizadas e necessitam desta versão para não ficarem quebradas no PHP5.

A última versão do PHP4 lançada foi a 4.4.9 e é impossível instalar esta versão em conjunto com o Fedora Core 9.

Depois de satisfeitas as dependências, a configuração do php-4.4.9 continua à procura das algumas libs no sitio errado, ou seja, /usr/lib ao contrario de /usr/lib64.

Para agravar o problema, as flags –libdir ou –with-libdir não parecem surtir efeito pois apesar de se indicar o directório /lib64 a configuração continua à procura das libs na pasta /lib.

Para se corrigir isto convém pode-se optar por duas opções :

1ª Copiar todas as bibliotecas que o PHP não encontra e que se encontram em /usr/lib64 e que são necessárias em /usr/lib (podem usar o utilitário strace para saber exactamente o caminho completo necessário).
2ª Instalar a versão de 32 bits das mesmas bibliotecas e criar links simbólicos para a versão base de cada biblioteca (ex. /usr/lib/libjpeg.so.5.2 -> /usr/lib/libjpeg.so).

Só depois de insto corrigido é que será possível. Em alternativa podem optar por uma versão mais antiga que não terá este problemas (por ex, a 4.4.4).