La voix du secrétaire (Jean)
Présents à la réunion, en fonction de la disposition autour de la table :
Nous avons mangé des pizzas orientales, une pizza campione, des magrets de canard, d'autres plats que j'ai oubliés une crème brûlée, des mousses au chocolat, une coupe colonel. Nous avons bu des mojitos, de la bière, du rosé et du café (déca ou normal).
Nous avons parlé de Perl, Internet informatique et points divers.
my $ch = 'àâçèéêëîïôùû'; print length($ch), "\n";Vous obtenez 24, car Perl considère que vous avez spécifié une chaîne de caractères avec des « A-tilde copyright » et similaires. Pour avoir réellement des minuscules accentuées et afficher le nombre 12, il faut coder :
use utf8: my $ch = 'àâçèéêëîïôùû'; print length($ch), "\n";Essayons maintenant d'imprimer la chaîne de caractères en plus de sa longueur.
use utf8: my $ch = 'àâçèéêëîïôùû'; print length($ch), "\n", $ch, "\n";Vous obtenez bien la longueur de 12, mais la chaîne affichée sur votre console sera représentée par 12 glyphes indiquant des caractères invalides. C'est seulement en tapant :
use utf8: use open ':encoding(utf8)'; use open ':std'; my $ch = 'àâçèéêëîïôùû'; print length($ch), "\n", $ch, "\n";que l'on obtient un affichage correct. Perl est censé « rendre faciles les choses faciles et faisables les choses difficiles », on peut avoir des doutes quand à la première partie de l'adage. Certes, il y a l'argument de la rétro-compatibilité. Toutefois, lorsque l'on précise une version récente de Perl, le résultat est identique. J'ai essayé le script suivant dans une machine xubuntu 22.04 :
use v5.34; my $ch = 'àâçèéêëîïôùû'; print length($ch), "\n";Et la longueur affichée est de 24 caractères. Le pragma use v5.34 (ou similaire), est censé montrer de façon indéniable que l'on accepte de casser la rétro-compatibilité. Même si le programmeur déclare piétiner la rétro-compatibilité avec l'époque des encodages à 8 bits, Perl continue à privilégier les encodages à 8 bits.
use locale; my @test = qw/a b 0 1 9 . , + -/; system("locale"); print 4 * atan2(1, 1), "\n"; print join ' ', 'Numériques', (grep { /^\d$/ } @test), "\n"; print join ' ', 'Autres' , (grep { /^\D$/ } @test), "\n";J'ai obtenu le résultat :
LANG=fr_FR.UTF-8 LANGUAGE= LC_CTYPE="fr_FR.UTF-8" LC_NUMERIC="fr_FR.UTF-8" LC_TIME="fr_FR.UTF-8" LC_COLLATE="fr_FR.UTF-8" LC_MONETARY="fr_FR.UTF-8" LC_MESSAGES="fr_FR.UTF-8" LC_PAPER="fr_FR.UTF-8" LC_NAME="fr_FR.UTF-8" LC_ADDRESS="fr_FR.UTF-8" LC_TELEPHONE="fr_FR.UTF-8" LC_MEASUREMENT="fr_FR.UTF-8" LC_IDENTIFICATION="fr_FR.UTF-8" LC_ALL= 3,14159265358979 Numériques 0 1 9 Autres a b . , + -On voit bien que les nombres décimaux sont imprimés avec une virgule, mais les virgules ne sont pas pour autant des caractères numériques. Contre-expérience en diésant le use locale :
LANG=fr_FR.UTF-8 LANGUAGE= LC_CTYPE="fr_FR.UTF-8" LC_NUMERIC="fr_FR.UTF-8" LC_TIME="fr_FR.UTF-8" LC_COLLATE="fr_FR.UTF-8" LC_MONETARY="fr_FR.UTF-8" LC_MESSAGES="fr_FR.UTF-8" LC_PAPER="fr_FR.UTF-8" LC_NAME="fr_FR.UTF-8" LC_ADDRESS="fr_FR.UTF-8" LC_TELEPHONE="fr_FR.UTF-8" LC_MEASUREMENT="fr_FR.UTF-8" LC_IDENTIFICATION="fr_FR.UTF-8" LC_ALL= 3.14159265358979 Numériques 0 1 9 Autres a b . , + -Cette fois-ci, le nombre décimal est imprimé avec un point, puisque la locale est inactive. Mais la liste des caractères numériques est identique. Je pense qu'il y a une confusion avec l'expression régulière \w pour laquelle il est clairement dit dans la page de documentation pointée ci-dessus et dans Mastering Regular Expressions que les locales changent la liste de caractères reconnus par cette expression régulière. Voir pages 87 et 119 dans la deuxième édition (je n'ai pas la troisième édition sur mes étagères).