Que fait cette fonction?Perl: question de base, fonctionnalité fonctionnelle
sub MyDigit {
return <<END;
0030\t0039
END
}
Que fait cette fonction?Perl: question de base, fonctionnalité fonctionnelle
sub MyDigit {
return <<END;
0030\t0039
END
}
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.
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. –
@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
@Sinan: Voir ma réponse. Tout le monde a raté ce qui se passe vraiment ici! – tchrist
Il utilise ce qu'on appelle un Here Document pour retourner une chaîne « 0030 \ t0039 »
That isn 't le point. Vois ma réponse. – tchrist
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).
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
@Sinan: Oui, je l'ai fait. Je l'ai réparé. Merci. – sepp2k
@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
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 …
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
@tchrist Je pense qu'il devrait être 'deQ' –
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. :)
Je vais vous croire sur parole' ;-) 'Oh, et,' + 1_000_000'. ... –
Dans quel espace de noms cette fonction doit-elle vivre pour que cela soit utile? – Ether
@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
Que s'est-il passé lorsque vous l'avez appelé? –
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