A função chomp() em Perl

Na linguagem de programação Perl possui a função de chomp(). Esta função é utilizada quando se trabalha com cadeias de caracteres. No caso mais simples, a função chomp() remove o último o símbolo \n / ca que é transmitida argumento essa função.

Aqui está um exemplo:

▶ Run
#!/usr/bin/perl

my $string = "ASDF\n";

chomp($string);

print "'$string'";

Este programa irá imprimir na tela o texto 'ASDF'.

  • No caso em que o valor da variável não termina em \n, então o valor não muda
  • No caso em que a variável contém mais do que um símbolo \n no final, será removido apenas um símbolo \n

Argumentos

No caso de uma função chomp não passar nenhum argumento, a função funciona com дефолтной variável $_:

▶ Run
#!/usr/bin/perl

$_ = "123\n";

chomp;

print "'$_'";

No caso de a variável $_ está undef e é usado use warnings;, então vai um aviso:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

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

Em função chomp() pode enviar escalares, arrays, hashes. Em caso de hash a função irá trabalhar apenas com valores de chaves, eles mesmos, as chaves não são alterados.

Argumento da função chomp() , deve ser sempre variável. No caso de tentar passar essa função de linha, o erro e a execução do programa será interrompido:

▶ 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.

O valor de retorno

A função chomp() sempre retorna um número inteiro maior ou igual a 0. Se a função retorna 0, o que significa que a substituição não foi. O número mais 0 significa o quanto era alterações.

Aqui está um exemplo de uma situação quando o recurso chomp() retorna o número de 2:

▶ Run
#!/usr/bin/perl

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

Aqui está um exemplo de usar o valor de retorno para executar diferentes o código é caso de substituição ou substituição não foi:

▶ 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'";

A variável $/

A função chomp() exclui o caractere de final de linha que contém global a variável $/. Por padrão, esta variável contém um caractere \n. Mas você pode colocar neste a variável de algum outro símbolo e então, a função de chomp() irá excluí-lo. Aqui está um exemplo:

▶ Run
#!/usr/bin/perl

$/ = "F";

my $string = "ASDF";

chomp($string);

print "'$string'";

O programa exibirá o texto 'ASD'.

No caso em que a variável está em branco$/ = '';), o chomp() removerá não um destino símbolo \n, e todos os símbolos de \n no final de uma linha.

O uso padrão de

Muitas vezes a função de chomp() é usado para ler linha por linha a partir de um arquivo. Para o tratamento de linhas do arquivo é muitas vezes conveniente para estas linhas não era o símbolo \n no final de uma linha:

#!/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";
}

Remover todos os caracteres \n no final de uma linha

Normalmente, a função de chomp() remove apenas um símbolo \n , no final da linha:

▶ Run
#!/usr/bin/perl

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

chomp($string);

print "'$string'";

Resultado:

'Line1
Line2

'

Existem várias maneiras de como você pode apagar todos os caracteres de \n no final da linha.

Eis um exemplo do uso de uma expressão regular:

▶ Run
#!/usr/bin/perl

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

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

print "'$string'";

Outro método para a remoção de todos os espaços é definir o valor de a variável $/ em uma linha em branco:

▶ Run
#!/usr/bin/perl

$/ = '';

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

chomp($string);

print "'$string'";

O uso de expressões regulares, muitas vezes é melhor: é нагляднее e não muda a variável global que pode afetar de código partes do programa.

A documentação oficial

Aqui está a saída do 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)".

Outros artigos