2010-11-27 27 views
1

Que fait cette fonction?Perl: question de base, fonctionnalité fonctionnelle

sub MyDigit { 
     return <<END; 
     0030\t0039 
     END 
    } 
+2

Que s'est-il passé lorsque vous l'avez appelé? –

+0

Il définit une classe de caractères comprenant uniquement les chiffres ASCII, à utiliser dans les expressions régulières. Vois ma réponse. PS: Cela ne devrait-il pas être écrit [Le_Cœur] (http://translate.google.com/#en|fr|Where%20is%20my%20heart%3F), * n'est-ce pas? * – tchrist

Répondre

8

Ce qu'on appelle un "here-document", et est utilisé pour briser les chaînes au-dessus de plusieurs lignes comme une alternative à la concaténation ou les opérations de liste:

print "this is ", 
    "one line when printed, ", 
    "because print takes multiple ", 
    "arguments and prints them all!\n"; 
print "however, you can also " . 
    "concatenate strings together " . 
    "and print them all as one string.\n"; 

print <<DOC; 
But if you have a lot of text to print, 
you can use a "here document" and create 
a literal string that runs until the 
delimiter that was declared with <<. 
DOC 
print "..and now we're back to regular code.\n"; 

Vous pouvez en savoir plus sur ici-documents dans le manuel: voir perldoc perlop.

+0

Notez que le 'END' de l'OP n'est pas aligné. Par conséquent, le code OP ne contient pas d'hérédoc valide. –

+0

@Sinan: Je supposais que c'était une faute de frappe dans la transcription, mais il est certainement raisonnable de vérifier si c'est effectivement le cas. – Ether

+2

@Sinan: Voir ma réponse. Tout le monde a raté ce qui se passe vraiment ici! – tchrist

2

Il utilise ce qu'on appelle un Here Document pour retourner une chaîne « 0030 \ t0039 »

+0

That isn 't le point. Vois ma réponse. – tchrist

2

Renvoie la chaîne "0030\t0039\n" (\t étant un onglet et \n un saut de ligne qui est ajouté car la ligne se termine par un saut de ligne (évidemment)).

<<FOO 
sometext 
FOO 

Est-ce un soi-disant heredoc, une façon d'écrire facilement des chaînes multi-lignes (mais ici il est utilisé avec une seule ligne).

+0

N'y at-il pas un modificateur que vous pouvez ajouter pour rendre le littéral '\ t '? Je me rappelle avoir besoin de mettre une seule citation quelque part ... – Cameron

+0

@Sinan: Oui, je l'ai fait. Je l'ai réparé. Merci. – sepp2k

+0

@Cameron: à partir de [documentation] (http://perldoc.perl.org/perlop.html# << EOF): "Les guillemets simples indiquent que le texte doit être traité littéralement sans interpolation de son contenu. aux guillemets simples sauf que les antislashs n'ont pas de signification particulière ". Vous devez donc dire << << FOO >>. – Vlad

0

Vous pouvez vous aider en essayant une expérience simple:

C:\Temp> cat t.pl 
#!/usr/bin/perl 

use strict; use warnings; 

print MyDigit(); 

sub MyDigit { 
    return <<END; 
    0030\t0039 
END 
} 

Sortie:

C:\Temp> t | xxd 
0000000: 2020 2020 3030 3330 0930 3033 390d 0a  0030.0039..

Maintenant, dans votre cas, le END n'est pas aligné au début de la ligne, donc vous devriez avoir le message:

Can't find string terminator "END" anywhere before EOF at …
+1

Eh bien oui, mais si vous voulez vraiment donner une leçon sur heredox, je pense que ma stratégie de déqueuing dans [unichars] (http://training.perl.com/scripts/unichars), [uninames] (http: // training.perl.com/scripts/uninames), [uniprops] (http://training.perl.com/scripts/uniprops), et même [leo] (http://training.perl.com/scripts/leo) fait pour l'heredox regardant le plus propre. Mais vraiment, vous avez tous manqué ce que la fonction est vraiment en train de faire: créer une propriété qui ne correspond qu'aux chiffres ASCII. Doit avoir été avant que '\ p {POSIX_Digit}' est apparu la version v5.12. – tchrist

+0

@tchrist Je pense qu'il devrait être 'deQ' –

7

Vous avez tous manqué le point!

Il définit une propriété définie par l'utilisateur à utiliser dans \p{MyDigit} et \P{MyDigit} en utilisant des expressions régulières.

Il est comme ces:

sub InKana { 
     return <<'END'; 
    3040 309F 
    30A0 30FF 
    END 
    } 

Sinon, vous pouvez le définir en termes de noms de propriété existants:

sub InKana { 
     return <<'END'; 
    +utf8::InHiragana 
    +utf8::InKatakana 
    END 
    } 

Vous pouvez également faire la soustraction définies à l'aide d'un "C < ->" préfixe . Supposons que vous seulement voulez les caractères réels, pas seulement les plages de blocs de caractères. Vous pouvez éliminer tous les non définis comme ceci:

sub IsKana { 
     return <<'END'; 
    +utf8::InHiragana 
    +utf8::InKatakana 
    -utf8::IsCn 
    END 
    } 

Vous pouvez également commencer par un caractère complété défini à l'aide du préfixe « C »:

sub IsNotKana { 
     return <<'END'; 
    !utf8::InHiragana 
    -utf8::InKatakana 
    +utf8::IsCn 
    END 
    } 

Je me dis que je dois être juste, puisque Je parle ex camelis. :)

+0

Je vais vous croire sur parole' ;-) 'Oh, et,' + 1_000_000'. ... –

+0

Dans quel espace de noms cette fonction doit-elle vivre pour que cela soit utile? – Ether

+0

@Ether: Celui que vous spécifiez: '\ p {Some :: Function}' est dans l'espace de noms '% Some ::', alors que '\ p {Function}' est dans le paquet 'current', pour certaines définitions de actuel. – tchrist