Fonction chomp() en Perl

Dans le langage de programmation Perl, il ya une fonction intégrée chomp(). Cette fonction est utilisée lors de la manipulation de chaînes. Dans le cas le plus simple de la fonction chomp() supprime le dernier symbole \n en alternance qui est transmis par l'argument de cette fonction.

Voici un exemple:

▶ Run
#!/usr/bin/perl

my $string = "ASDF\n";

chomp($string);

print "'$string'";

Ce programme affiche le texte 'ASDF'.

  • Dans ce cas, si la valeur de la variable ne se termine pas par \n, la valeur ne changera pas
  • Dans ce cas si la variable contient plus d'un caractère \n à la fin, il est supprimé d'un seul caractère \n

Les arguments

Dans ce cas, si la fonction chomp n'est pas transmises à aucun argument, la fonction travaille avec дефолтной variable $_:

▶ Run
#!/usr/bin/perl

$_ = "123\n";

chomp;

print "'$_'";

Dans ce cas si la variable $_ est undef et utilisé use warnings;, ce sera un avertissement:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

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

Dans la fonction chomp() , vous pouvez transférer des scalaires, des tableaux, des tables de hachage. Dans le cas de hachage la fonction fonctionne uniquement avec les valeurs de clés, vous les clés ne sont pas modifiées.

L'argument de la fonction chomp() doit toujours être variable. Dans ce cas, si essayer de passer cette fonction de la chaîne, ce serait une erreur et l'exécution du programme sera arrêté:

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

La valeur de retour

La fonction chomp() renvoie toujours un nombre entier supérieur ou égal à 0. Si la fonction renvoie 0, ce qui signifie que le remplacement n'a pas été. Le nombre de plus 0 signifie combien de modification.

Voici un exemple d'une situation où la fonction chomp() renvoie le nombre de 2:

▶ Run
#!/usr/bin/perl

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

Voici un exemple d'utilisation de la valeur de retour afin d'effectuer différents le code dans ce cas, si un produit de remplacement ou le remplacement n'était pas:

▶ 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 fonction chomp() supprime à la fin de la chaîne symbole qui figure dans le mondial la variable $/. Par défaut, cette variable contient le symbole \n. Mais vous pouvez le placer dans cette une variable de n'importe quel autre symbole et la fonction chomp() sera le supprimer. Voici un exemple:

▶ Run
#!/usr/bin/perl

$/ = "F";

my $string = "ASDF";

chomp($string);

print "'$string'";

Le programme affichera le texte 'ASD'.

Dans ce cas si la variable est une chaîne vide ($/ = '';), alors chomp() supprime pas un caractère de fin de \n, et tous les caractères \n à la fin de la ligne.

L'utilisation standard

Très souvent, la fonction chomp() est utilisé pour lire ligne par ligne à partir d'un fichier. Pour le traitement des lignes du fichier il est souvent pratique de ces lignes n'est pas il était le symbole de \n à la fin de la ligne:

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

Supprimer tous les caractères \n à la fin de la ligne

Habituellement, la fonctionnalité de chomp() supprime un caractère \n à la fin de la ligne:

▶ Run
#!/usr/bin/perl

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

chomp($string);

print "'$string'";

Résultat:

'Line1
Line2

'

Il ya plusieurs façons que vous pouvez supprimer tous les caractères \n à la fin de la ligne.

Voici un exemple d'utilisation d'une expression régulière:

▶ Run
#!/usr/bin/perl

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

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

print "'$string'";

Une autre méthode pour supprimer tous les espaces est de définir la valeur de la variable $/ dans une chaîne vide

▶ Run
#!/usr/bin/perl

$/ = '';

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

chomp($string);

print "'$string'";

Utilisation d'une expression régulière est souvent mieux: c'est claire et ne change pas la variable globale, ce qui peut affecter le fonctionnement du code dans d'autres parties du programme.

La documentation officielle

Voici la sortie de la commande 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)".

Autres articles