2010-11-05 6 views
1

est-il un moyen facile, en utilisant un sous-programme peut-être, d'imprimer une chaîne en Perl sans échapper à chaque caractère spécial?chaîne d'impression en Perl

C'est ce que je veux faire:

print DELIMITER <I don't care what is here> DELIMITER 

Alors, évidemment, ce sera bien si je peux mettre une chaîne comme délimiteur au lieu de caractères spéciaux.

+0

Pouvez-vous donner quelques exemples de certaines chaînes qui vous semblent difficiles à imprimer? – Ether

+0

Il y a beaucoup de guillemets simples dans it.Idea est d'imprimer le contenu de la chaîne indépendamment de ce qui est à l'intérieur de celui-ci. Un sous-programme à imprimer où vous pouvez spécifier le délimiteur de chaîne. – Jean

+2

@alertjean Ce serait les opérateurs de chaînes génériques 'q //' et 'qq //'. Vous pouvez spécifier le délimiteur, de sorte que vous pouvez dire 'my $ s = qq (this contains" et '); 'Il y a deux types de délimiteurs: bracketing et non-bracketing Les délimiteurs bracketing sont'() ',' [] ',' {} ', et' <> '. Le premier caractère commence la chaîne et la seconde le ferme, avec l'avertissement que l'imbrication est permise (donc' qq (Il a dit "Hey (c'était mon paren)"); 'est une chaîne valide.) Les délimiteurs non encadrés ferment la chaîne lorsqu'ils sont vus une seconde fois (par exemple' qq/foo /; '). –

Répondre

4
$str = q(this is a "string"); 
print $str; 

si vous voulez dire des citations et des apostrophes avec 'caractères spéciaux

2

L'impression ne fait pas des choses spéciales aux évasions, doubles guillemets font. Vous pouvez essayer les chaînes entre guillemets simples:

print 'this is \n', "\n"; 

Dans une seule chaîne entre guillemets les seuls caractères qui doivent être échappées sont entre guillemets simples et une barre oblique inverse qui se produit immédiatement avant la fin de la chaîne (à savoir 'foo\\').

Il est important de noter que l'interpolation ne fonctionne pas avec les chaînes entre guillemets simples, si

print 'foo is $foo', "\n"; 

Ne sera pas imprimer le contenu de $foo.

0

Si vous souhaitez imprimer une chaîne littéralement et vous avez Perl 5.10 ou plus tard, puis

say 'This is a string with "quotes"' ; 

imprimera la chaîne avec une nouvelle ligne .. La chose importaning est d'utiliser des guillemets simples ' ' plutôt que doubler les " "

+0

'pour ce faire, mais vous devez utiliser la fonction 'say'' ou spécifier une version minimale comme dans' use 5.10.0' pour ce faire, ou ca n dans une doublure avec -E plutôt que -e. Voir la fonction 'perldoc'. –

8

perldoc perlop, sous la rubrique « opérateurs apostrophe et type apostrophe », contient tout ce dont vous avez besoin.

Alors que nous pensons généralement des citations comme des valeurs littérales, en Perl ils fonctionnent comme des opérateurs, en fournissant divers types d'interpoler et le modèle correspondant à capacités. Perl fournit des guillemets coutumiers pour ces comportements, mais fournit également un moyen pour vous de choisir votre caractère de citation pour l'un des eux. Dans le tableau suivant, un "{}" représente n'importe quelle paire de délimiteurs que vous choisissez.

Customary Generic  Meaning  Interpolates 
    ''  q{}   Literal    no 
    ""  qq{}   Literal    yes 
    ``  qx{}   Command    yes* 
      qw{}   Word list   no 
    //  m{}  Pattern match   yes* 
      qr{}   Pattern    yes* 
      s{}{}  Substitution   yes* 
      tr{}{} Transliteration   no (but see below) 
    <<EOF     here-doc   yes* 

    * unless the delimiter is ''. 
3

Vous pouvez utiliser la directive __DATA__ qui traitera toutes les lignes suivantes dans un fichier qui est accessible à partir de la DATA poignée:

while (<DATA>) { 
    print # or do something else with the lines 
} 

__DATA__ 
#!/usr/bin/perl -w 
use Some::Module; 
.... 

ou vous pouvez utiliser un heredoc:

my $string = <<'END'; #single quotes prevent any interpolation 
#!/usr/bin/perl -b 
use Some::Module; 
.... 
END 
1

Vous pouvez utiliser à peu près n'importe quel caractère avec q ou qq. Par exemple:

#!/usr/bin/perl 

use utf8; 
use strict; use warnings; 

print q∞This is a test∞; 
print qq☼\nThis is another test\n☼; 
print q»But, what is the point?»; 
print qq\nYou are just making life hard on yourself!\n; 
print qq¿That last one is tricky\n¿; 

Vous ne pouvez pas utiliser qq DELIMITER foo DELIMITER.Cependant, vous pouvez utiliser heredocs pour un effet similaire:

print <<DELIMITER 
... 
DELIMETER 
; 

ou

print <<'DELIMETER' 
... 
DELIMETER 
; 

mais votre code source serait vraiment laid.

+1

J'ai une solution garantie: les points de code U + FFFE et F + FFFF (entre autres) sont garantis comme étant illégaux pour l'échange, mais vous pouvez les utiliser en interne. Cela inclut également les points de code> 0x10_FFFF, comme '\ x {DEADBEEF}'. – tchrist

+0

Je pensais que vous étiez censé mettre le point-virgule sur la ligne avec le << pour autoriser plusieurs heredocs dans la même ligne? c'est-à-dire 'print << 'DELIMITER'; ... ' –

Questions connexes