-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


Funzioni Perl in italiano

indietro

  • vec ESPR,SCOSTAMENTO,NUMERO_DI_BIT

    Tratta la stringa in ESPR come un vettore di bit confezionato con elementi di ampiezza NUMERO_DI_BIT e restituisce il valore dell'elemento specificato da OFFSET come intero senza segno. NUMERO_DI_BIT dunque specifica il numero di bit che sono riservati per ogni elemento nel vettore di bit. Questo deve essere una potenza di due da 1 a 32 (oppure 64 se la piattaforma li supporta).

    Se NUMERO_DI_BIT è 8, "elementi" coincide con i byte della stringa di input.

    Se NUMERO_DI_BIT è 16 o più, i byte della stringa di input sono raggruppati in pezzi di dimensione NUMERO_DI_BIT/8 ed ogni gruppo viene convertito in un numero come con pack()/unpack() con i formati big-endian n/N (analogamente per NUMERO_DI_BIT==64). Consultate "pack" per i dettagli.

    Se il numero di bit è 4 o meno, la stringa viene spezzata in bytes, poi i bit di ogni byte sono spezzati in 8/NUMERO_DI_BIT gruppi. I bit di un byte sono numerati alla maniere dei little-endian, come in 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80. Per esempio, spezzare il singolo byte di input chr(0x36) in due gruppi, dà una lista (0x6, 0x3); spezzarlo in 4 gruppi dà (0x2, 0x1, 0x3, 0x0).

    vec può anche essere assegnato, nel qual caso le parentesi sono necessarie per dare all'espressione la corretta precedenza, come in

        vec($immagine, $max_x * $x + $y, 8) = 3;

    Se l'elemento selezionato è al di fuori della stringa, viene restituito il valore 0. Se un elemento viene scritto oltre la fine della stringa, il Perl per prima cosa estenderà la stringa con un numero adeguato di byte a zero. È un errore il tentare di scrivere oltre l'inizio della stringa (cioè uno SCOSTAMENTO negativo).

    La stringa non dovrebbe contenere alcun carattere con valore > 255 (che può avvenire solo se si sta usando la codifica UTF8). Se lo contiene, sarà trattato come qualcosa che non è codificata UTF8. Quando vec viene assegnato, anche altre parti del programma non considereranno la stringa come codificata UTF8. In altre parole, se si hanno tali caratteri nelle stringhe, vec() opererà sulla stringa di byte effettiva e non sulla stringa di caratteri concettuale.

    Le stringhe create con vec possono anche venir manipolate con gli operatori logici |, &, ^ e ~. Questi operatori assumeranno che quando entrambi gli operandi sono stringhe, sarà richiesta un'operazione a vettore di bit. Si veda perlop/"Bitwise String Operators" ["Operatori di stringa bitwise", NdT].

    Il codice seguente costruirà una stringa ASCII che recita 'PerlPerlPerl'. I commenti mostrano la stringa dopo ogni passo. Va notato che questo codice funziona nella stessa maniera sia su elaboratori big-endian che little-endian.

        my $pippo = '';
        vec($pippo,  0, 32) = 0x5065726C;	# 'Perl'
        # $pippo eq "Perl" eq "\x50\x65\x72\x6C", 32 bit
        print vec($pippo, 0, 8);		# prints 80 == 0x50 == ord('P')
        vec($pippo,  2, 16) = 0x5065;	# 'PerlPe'
        vec($pippo,  3, 16) = 0x726C;	# 'PerlPerl'
        vec($pippo,  8,  8) = 0x50;		# 'PerlPerlP'
        vec($pippo,  9,  8) = 0x65;		# 'PerlPerlPe'
        vec($pippo, 20,  4) = 2;		# 'PerlPerlPe'   . "\x02"
        vec($pippo, 21,  4) = 7;		# 'PerlPerlPer'
                                            # 'r' e` "\x72"
        vec($pippo, 45,  2) = 3;		# 'PerlPerlPer'  . "\x0c"
        vec($pippo, 93,  1) = 1;		# 'PerlPerlPer'  . "\x2c"
        vec($pippo, 94,  1) = 1;		# 'PerlPerlPerl'
                                            # 'l' e` "\x6c"

    Per trasformare un vettore di bit in una striga o lista di 0 e 1, si usino queste:

        $numero_di_bit = unpack("b*", $vettore);
        @numero_di_bit = split(//, unpack("b*", $vettore));

    Se siete a conoscenza dell'esatta lunghezza in bit, la si può usare al posto del *.

    Ecco un esempio per illustrare come i bit vanno effettivamente a posto:

        #!/usr/bin/perl -wl
        print <<'EOT';
                                          0         1         2         3
                           unpack("V",$_) 01234567890123456789012345678901
        ------------------------------------------------------------------
        EOT
        for $w (0..3) {
            $ampiezza = 2**$w;
            for ($spostamento=0; $spostamento < $ampiezza; ++$spostamento) {
                for ($distanza=0; $distanza < 32/$ampiezza; ++$distanza) {
                    $str = pack("B*", "0"x32);
                    $numero_di_bit = (1<<$spostamento);
                    vec($str, $distanza, $ampiezza) = $numero_di_bit;
                    $ris = unpack("b*",$str);
                    $val = unpack("V", $str);
                    write;
                }
            }
        }
        format STDOUT =
        vec($_,@#,@#) = @<< == @######### @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        $distanza, $ampiezza, $numero_di_bit, $val, $ris
        .
        __END__

    Indifferente all'architettura dell'elaboratore sul quale viene eseguito, l'esempio soprastante dovrebbe stampare la seguente tabella:

                                          0         1         2         3
                           unpack("V",$_) 01234567890123456789012345678901
        ------------------------------------------------------------------
        vec($_, 0, 1) = 1   ==          1 10000000000000000000000000000000
        vec($_, 1, 1) = 1   ==          2 01000000000000000000000000000000
        vec($_, 2, 1) = 1   ==          4 00100000000000000000000000000000
        vec($_, 3, 1) = 1   ==          8 00010000000000000000000000000000
        vec($_, 4, 1) = 1   ==         16 00001000000000000000000000000000
        vec($_, 5, 1) = 1   ==         32 00000100000000000000000000000000
        vec($_, 6, 1) = 1   ==         64 00000010000000000000000000000000
        vec($_, 7, 1) = 1   ==        128 00000001000000000000000000000000
        vec($_, 8, 1) = 1   ==        256 00000000100000000000000000000000
        vec($_, 9, 1) = 1   ==        512 00000000010000000000000000000000
        vec($_,10, 1) = 1   ==       1024 00000000001000000000000000000000
        vec($_,11, 1) = 1   ==       2048 00000000000100000000000000000000
        vec($_,12, 1) = 1   ==       4096 00000000000010000000000000000000
        vec($_,13, 1) = 1   ==       8192 00000000000001000000000000000000
        vec($_,14, 1) = 1   ==      16384 00000000000000100000000000000000
        vec($_,15, 1) = 1   ==      32768 00000000000000010000000000000000
        vec($_,16, 1) = 1   ==      65536 00000000000000001000000000000000
        vec($_,17, 1) = 1   ==     131072 00000000000000000100000000000000
        vec($_,18, 1) = 1   ==     262144 00000000000000000010000000000000
        vec($_,19, 1) = 1   ==     524288 00000000000000000001000000000000
        vec($_,20, 1) = 1   ==    1048576 00000000000000000000100000000000
        vec($_,21, 1) = 1   ==    2097152 00000000000000000000010000000000
        vec($_,22, 1) = 1   ==    4194304 00000000000000000000001000000000
        vec($_,23, 1) = 1   ==    8388608 00000000000000000000000100000000
        vec($_,24, 1) = 1   ==   16777216 00000000000000000000000010000000
        vec($_,25, 1) = 1   ==   33554432 00000000000000000000000001000000
        vec($_,26, 1) = 1   ==   67108864 00000000000000000000000000100000
        vec($_,27, 1) = 1   ==  134217728 00000000000000000000000000010000
        vec($_,28, 1) = 1   ==  268435456 00000000000000000000000000001000
        vec($_,29, 1) = 1   ==  536870912 00000000000000000000000000000100
        vec($_,30, 1) = 1   == 1073741824 00000000000000000000000000000010
        vec($_,31, 1) = 1   == 2147483648 00000000000000000000000000000001
        vec($_, 0, 2) = 1   ==          1 10000000000000000000000000000000
        vec($_, 1, 2) = 1   ==          4 00100000000000000000000000000000
        vec($_, 2, 2) = 1   ==         16 00001000000000000000000000000000
        vec($_, 3, 2) = 1   ==         64 00000010000000000000000000000000
        vec($_, 4, 2) = 1   ==        256 00000000100000000000000000000000
        vec($_, 5, 2) = 1   ==       1024 00000000001000000000000000000000
        vec($_, 6, 2) = 1   ==       4096 00000000000010000000000000000000
        vec($_, 7, 2) = 1   ==      16384 00000000000000100000000000000000
        vec($_, 8, 2) = 1   ==      65536 00000000000000001000000000000000
        vec($_, 9, 2) = 1   ==     262144 00000000000000000010000000000000
        vec($_,10, 2) = 1   ==    1048576 00000000000000000000100000000000
        vec($_,11, 2) = 1   ==    4194304 00000000000000000000001000000000
        vec($_,12, 2) = 1   ==   16777216 00000000000000000000000010000000
        vec($_,13, 2) = 1   ==   67108864 00000000000000000000000000100000
        vec($_,14, 2) = 1   ==  268435456 00000000000000000000000000001000
        vec($_,15, 2) = 1   == 1073741824 00000000000000000000000000000010
        vec($_, 0, 2) = 2   ==          2 01000000000000000000000000000000
        vec($_, 1, 2) = 2   ==          8 00010000000000000000000000000000
        vec($_, 2, 2) = 2   ==         32 00000100000000000000000000000000
        vec($_, 3, 2) = 2   ==        128 00000001000000000000000000000000
        vec($_, 4, 2) = 2   ==        512 00000000010000000000000000000000
        vec($_, 5, 2) = 2   ==       2048 00000000000100000000000000000000
        vec($_, 6, 2) = 2   ==       8192 00000000000001000000000000000000
        vec($_, 7, 2) = 2   ==      32768 00000000000000010000000000000000
        vec($_, 8, 2) = 2   ==     131072 00000000000000000100000000000000
        vec($_, 9, 2) = 2   ==     524288 00000000000000000001000000000000
        vec($_,10, 2) = 2   ==    2097152 00000000000000000000010000000000
        vec($_,11, 2) = 2   ==    8388608 00000000000000000000000100000000
        vec($_,12, 2) = 2   ==   33554432 00000000000000000000000001000000
        vec($_,13, 2) = 2   ==  134217728 00000000000000000000000000010000
        vec($_,14, 2) = 2   ==  536870912 00000000000000000000000000000100
        vec($_,15, 2) = 2   == 2147483648 00000000000000000000000000000001
        vec($_, 0, 4) = 1   ==          1 10000000000000000000000000000000
        vec($_, 1, 4) = 1   ==         16 00001000000000000000000000000000
        vec($_, 2, 4) = 1   ==        256 00000000100000000000000000000000
        vec($_, 3, 4) = 1   ==       4096 00000000000010000000000000000000
        vec($_, 4, 4) = 1   ==      65536 00000000000000001000000000000000
        vec($_, 5, 4) = 1   ==    1048576 00000000000000000000100000000000
        vec($_, 6, 4) = 1   ==   16777216 00000000000000000000000010000000
        vec($_, 7, 4) = 1   ==  268435456 00000000000000000000000000001000
        vec($_, 0, 4) = 2   ==          2 01000000000000000000000000000000
        vec($_, 1, 4) = 2   ==         32 00000100000000000000000000000000
        vec($_, 2, 4) = 2   ==        512 00000000010000000000000000000000
        vec($_, 3, 4) = 2   ==       8192 00000000000001000000000000000000
        vec($_, 4, 4) = 2   ==     131072 00000000000000000100000000000000
        vec($_, 5, 4) = 2   ==    2097152 00000000000000000000010000000000
        vec($_, 6, 4) = 2   ==   33554432 00000000000000000000000001000000
        vec($_, 7, 4) = 2   ==  536870912 00000000000000000000000000000100
        vec($_, 0, 4) = 4   ==          4 00100000000000000000000000000000
        vec($_, 1, 4) = 4   ==         64 00000010000000000000000000000000
        vec($_, 2, 4) = 4   ==       1024 00000000001000000000000000000000
        vec($_, 3, 4) = 4   ==      16384 00000000000000100000000000000000
        vec($_, 4, 4) = 4   ==     262144 00000000000000000010000000000000
        vec($_, 5, 4) = 4   ==    4194304 00000000000000000000001000000000
        vec($_, 6, 4) = 4   ==   67108864 00000000000000000000000000100000
        vec($_, 7, 4) = 4   == 1073741824 00000000000000000000000000000010
        vec($_, 0, 4) = 8   ==          8 00010000000000000000000000000000
        vec($_, 1, 4) = 8   ==        128 00000001000000000000000000000000
        vec($_, 2, 4) = 8   ==       2048 00000000000100000000000000000000
        vec($_, 3, 4) = 8   ==      32768 00000000000000010000000000000000
        vec($_, 4, 4) = 8   ==     524288 00000000000000000001000000000000
        vec($_, 5, 4) = 8   ==    8388608 00000000000000000000000100000000
        vec($_, 6, 4) = 8   ==  134217728 00000000000000000000000000010000
        vec($_, 7, 4) = 8   == 2147483648 00000000000000000000000000000001
        vec($_, 0, 8) = 1   ==          1 10000000000000000000000000000000
        vec($_, 1, 8) = 1   ==        256 00000000100000000000000000000000
        vec($_, 2, 8) = 1   ==      65536 00000000000000001000000000000000
        vec($_, 3, 8) = 1   ==   16777216 00000000000000000000000010000000
        vec($_, 0, 8) = 2   ==          2 01000000000000000000000000000000
        vec($_, 1, 8) = 2   ==        512 00000000010000000000000000000000
        vec($_, 2, 8) = 2   ==     131072 00000000000000000100000000000000
        vec($_, 3, 8) = 2   ==   33554432 00000000000000000000000001000000
        vec($_, 0, 8) = 4   ==          4 00100000000000000000000000000000
        vec($_, 1, 8) = 4   ==       1024 00000000001000000000000000000000
        vec($_, 2, 8) = 4   ==     262144 00000000000000000010000000000000
        vec($_, 3, 8) = 4   ==   67108864 00000000000000000000000000100000
        vec($_, 0, 8) = 8   ==          8 00010000000000000000000000000000
        vec($_, 1, 8) = 8   ==       2048 00000000000100000000000000000000
        vec($_, 2, 8) = 8   ==     524288 00000000000000000001000000000000
        vec($_, 3, 8) = 8   ==  134217728 00000000000000000000000000010000
        vec($_, 0, 8) = 16  ==         16 00001000000000000000000000000000
        vec($_, 1, 8) = 16  ==       4096 00000000000010000000000000000000
        vec($_, 2, 8) = 16  ==    1048576 00000000000000000000100000000000
        vec($_, 3, 8) = 16  ==  268435456 00000000000000000000000000001000
        vec($_, 0, 8) = 32  ==         32 00000100000000000000000000000000
        vec($_, 1, 8) = 32  ==       8192 00000000000001000000000000000000
        vec($_, 2, 8) = 32  ==    2097152 00000000000000000000010000000000
        vec($_, 3, 8) = 32  ==  536870912 00000000000000000000000000000100
        vec($_, 0, 8) = 64  ==         64 00000010000000000000000000000000
        vec($_, 1, 8) = 64  ==      16384 00000000000000100000000000000000
        vec($_, 2, 8) = 64  ==    4194304 00000000000000000000001000000000
        vec($_, 3, 8) = 64  == 1073741824 00000000000000000000000000000010
        vec($_, 0, 8) = 128 ==        128 00000001000000000000000000000000
        vec($_, 1, 8) = 128 ==      32768 00000000000000010000000000000000
        vec($_, 2, 8) = 128 ==    8388608 00000000000000000000000100000000
        vec($_, 3, 8) = 128 == 2147483648 00000000000000000000000000000001
D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google