La función de chomp() en Perl

En el lenguaje de programación Perl tiene integrada la función de chomp(). Esta función se utiliza cuando se trabaja con cadenas. En el caso más sencillo, la función de chomp() elimina la reserva el símbolo de \n en la variable que se haya presentado el argumento de esta función.

He aquí un ejemplo:

▶ Run
#!/usr/bin/perl

my $string = "ASDF\n";

chomp($string);

print "'$string'";

Este programa mostrará en pantalla el texto 'ASDF'.

  • En caso de que el valor de la variable no termina en \n, el valor no va a cambiar
  • En caso de que la variable contiene más de un carácter \n al final, sólo se elimina un carácter \n

Los argumentos

En caso de que la función de chomp no se transfieren a ningún argumento, la función trabaja con дефолтной variable $_:

▶ Run
#!/usr/bin/perl

$_ = "123\n";

chomp;

print "'$_'";

En el caso de que en la variable $_ se encuentra undef y utiliza la use warnings;, será una advertencia:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

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

En función de chomp() puede enviar скаляры, matrices, hashes. En el caso de hash la función sólo funciona con los valores de las claves, los mismos claves no cambiarán.

El argumento de la función chomp() siempre debe ser una variable. En caso de que tratar de pasar a esta función de la cadena, lo que se producirá un error y la aplicación de programas se detiene:

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

El valor devuelto

La función de chomp() siempre devuelve un número entero mayor o igual que 0. Si la función devuelve 0, esto significa que la sustitución no es. El número más 0 indica cuánto se ha producido el cambio.

He aquí un ejemplo de la situación cuando la función de chomp() devuelve el número de 2:

▶ Run
#!/usr/bin/perl

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

He aquí un ejemplo de la utilización del valor devuelto para realizar diferentes el código en si fue la sustitución o reemplazo no es:

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

La variable $/

La función de chomp() elimina con el final de la línea el símbolo que figura en el mundial la variable $/. De forma predeterminada, esta variable contiene el símbolo de \n. Pero usted puede poner en este la variable de algún otro carácter y la función de chomp() va a quitar. He aquí un ejemplo:

▶ Run
#!/usr/bin/perl

$/ = "F";

my $string = "ASDF";

chomp($string);

print "'$string'";

El programa mostrará en pantalla el texto 'ASD'.

En caso de que la variable se encuentra una cadena vacía ($/ = '';), lo chomp() no quita uno el carácter final \n, y todos los caracteres \n al final de la línea.

Uso estándar de

Muy a menudo la función de chomp() se utiliza para leer línea por línea desde el archivo. Para el tratamiento de las líneas de un archivo a menudo es conveniente que en estas líneas no es el símbolo de \n en el final de la línea:

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

Borrar todos los caracteres \n al final de la línea

Normalmente, la función chomp() sólo se elimina un carácter \n al final de la línea:

▶ Run
#!/usr/bin/perl

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

chomp($string);

print "'$string'";

El resultado:

'Line1
Line2

'

Hay varias maneras de cómo se puede eliminar todos los caracteres \n al final de la fila.

He aquí un ejemplo del uso de la expresión regular:

▶ Run
#!/usr/bin/perl

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

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

print "'$string'";

Otro método para eliminar todos los espacios en blanco finales es establecer el valor de la la variable $/ en una cadena vacía:

▶ Run
#!/usr/bin/perl

$/ = '';

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

chomp($string);

print "'$string'";

El uso de la expresión regular, a menudo es mejor: es simple y no cambia la variable global que puede afectar al código en otros partes del programa.

La documentación oficial

He aquí el resultado 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)".

Otros articulos