Funzione chomp() in Perl

Nel linguaggio di programmazione Perl ci sono built-in funzione di chomp(). Questa funzione viene utilizzata quando si lavora con le stringhe. Nel caso più semplice, la funzione chomp() rimuove l'ultima simbolo \n a ca che è trasmessa argomento a questa funzione.

Ecco un esempio:

▶ Run
#!/usr/bin/perl

my $string = "ASDF\n";

chomp($string);

print "'$string'";

Questo programma visualizzerà il testo 'ASDF'.

  • Nel caso in cui il valore di una variabile non finisce a \n, il valore non cambia
  • Nel caso in cui l'variabile che contiene più di un simbolo \n alla fine, viene rimosso solo un simbolo \n

Argomenti

Nel caso in cui la funzione chomp non trasmessi gli argomenti, la funzione lavora con di default della variabile $_:

▶ Run
#!/usr/bin/perl

$_ = "123\n";

chomp;

print "'$_'";

Nel caso in cui in una variabile $_ si trova undef e viene utilizzato use warnings;, ci sarà un avvertimento:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

chomp;
Use of uninitialized value $_ in scalar chomp at script.pl line 6.

In funzione chomp() è possibile trasferire scalari, array, hash. In caso di hash la funzione funziona solo con i valori delle chiavi, le chiavi non cambieranno.

L'argomento della funzione chomp() deve essere sempre variabile. Nel caso in cui provare a passare a questa funzione una stringa, allora sarà un errore e l'esecuzione del programma sarà interrotta:

▶ Run
#!/usr/bin/perl

chomp("ASDF\n"); # Error!
Can't modify constant item in chomp at script.pl line 3, near ""ASDF\n")"
Execution of script.pl aborted due to compilation errors.

Il valore restituito

Funzione chomp() restituisce sempre un numero intero maggiore o uguale a 0. Se la funzione restituisce 0, questo significa che la sostituzione non è stato. Il numero più 0 indica quanti sono stati cambiamenti.

Ecco un esempio di una situazione in cui la funzione chomp() restituisce il numero di 2:

▶ Run
#!/usr/bin/perl

my @arr = ("ASDF\n", "QWERTY\n");
print chomp(@arr);

Ecco un esempio di utilizzo del valore restituito per eseguire diversi il codice, nel caso se è stata la sostituzione o la sostituzione non è stato:

▶ Run
#!/usr/bin/perl

use feature qw(say);

my $string = "ASDF\n";

if (chomp($string)) {
    say 'Removed \n';
} else {
    say 'String is unchanged';
}

print "'$string'";

Variabile $/

Funzione chomp() rimuove con il simbolo di fine riga che contiene globale variabile $/. Per impostazione predefinita, in questa variabile contiene il simbolo \n. Ma è possibile inserire in questo una variabile di un altro personaggio e poi la funzione chomp() sarà cancellare. Ecco un esempio:

▶ Run
#!/usr/bin/perl

$/ = "F";

my $string = "ASDF";

chomp($string);

print "'$string'";

Il programma visualizzerà il testo 'ASD'.

Nel caso in cui la variabile è una stringa vuota ($/ = '';), quello chomp() rimuoverà non un carattere di fine \n, e tutti i personaggi \n alla fine della riga.

L'uso standard

Molto spesso la funzione chomp() viene utilizzato per leggere riga per riga da un file. Per il trattamento delle stringhe da un file spesso conveniente per in queste righe non era il simbolo \n alla fine della riga:

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.csv';

open FILE, '<', $file_name or die $!;

while my $line (<FILE>) {
    chomp($line);
    print "Parsing line $line";
}

Rimuovere tutti i simboli \n alla fine della riga

Di solito la funzione chomp() rimuove solo un simbolo \n alla fine della riga:

▶ Run
#!/usr/bin/perl

my $string = "Line1\nLine2\n\n\n";

chomp($string);

print "'$string'";

Risultato:

'Line1
Line2

'

Ci sono diversi modi come è possibile eliminare tutti i caratteri \n alla fine della riga.

Ecco un esempio di utilizzo di un'espressione regolare:

▶ Run
#!/usr/bin/perl

my $string = "Line1\nLine2\n\n\n";

$string =~ s/\n*$//;

print "'$string'";

Un altro modo per rimuovere tutti gli spazi finali — è quello di impostare il valore variabile $/ in una stringa vuota:

▶ Run
#!/usr/bin/perl

$/ = '';

my $string = "Line1\nLine2\n\n\n";

chomp($string);

print "'$string'";

L'uso di un'espressione regolare è spesso meglio: è chiaro e non cambia una variabile globale che può influire sul funzionamento del codice in altri parti del programma.

La documentazione ufficiale di

Ecco l'output del comando perldoc -f chomp:

       chomp VARIABLE
       chomp( LIST )
       chomp   This safer version of "chop" removes any trailing string that
               corresponds to the current value of $/ (also known as
               $INPUT_RECORD_SEPARATOR in the "English" module).  It returns
               the total number of characters removed from all its arguments.
               It's often used to remove the newline from the end of an input
               record when you're worried that the final record may be missing
               its newline.  When in paragraph mode ("$/ = """), it removes
               all trailing newlines from the string.  When in slurp mode ("$/
               = undef") or fixed-length record mode ($/ is a reference to an
               integer or the like; see perlvar) chomp() won't remove
               anything.  If VARIABLE is omitted, it chomps $_.  Example:

                   while (<>) {
                       chomp;  # avoid \n on last field
                       @array = split(/:/);
                       # ...
                   }

               If VARIABLE is a hash, it chomps the hash's values, but not its
               keys.

               You can actually chomp anything that's an lvalue, including an
               assignment:

                   chomp($cwd = `pwd`);
                   chomp($answer = );

               If you chomp a list, each element is chomped, and the total
               number of characters removed is returned.

               Note that parentheses are necessary when you're chomping
               anything that is not a simple variable.  This is because "chomp
               $cwd = `pwd`;" is interpreted as "(chomp $cwd) = `pwd`;",
               rather than as "chomp( $cwd = `pwd` )" which you might expect.
               Similarly, "chomp $a, $b" is interpreted as "chomp($a), $b"
               rather than as "chomp($a, $b)".

Altri articoli