J'utilise habituellement des citations simples, mais parfois, je reçois des lignes très longues que je ne peux pas casser et aussi besoin d'utiliser des personnages d'évasion, alors je reçois quelque chose comme ça: Je sais Il existe divers autres moyens de représenter des chaînes à Perl. Que recommanderais-tu? p> Mise à jour forte>
Merci à tous les gars pour les suggestions liées au SQL. J'apprends des objets de valeur, mais ma question reste (en général un, indépendamment de SQL): y a-t-il un opérateur qui permet de citer sans ruptures de ligne? P> Ce que je fais maintenant, c'est quelque chose comme: < / p> qui est assez laid. p> p>
8 Réponses :
Regardez dans Opérateurs de devis de Perlop . Utilisez qq code> pour les guillemets doubles et
q code> pour guillemets simples. P>
Dans ce cas particulier, je recommanderais d'utiliser des espaces loués, sauf que vous n'êtes absolument sûr que $ QUERY_ID ne peut jamais contenir "caractères drôles" p>
Souhaitez-vous élaborer des organisateurs d'espèces?
@David B et même si vous pensez que vous êtes certain, allez-y et utilisez des espaces réservés de toute façon. Voir Quels sont les espaces réservés dans DBI, et pourquoi voudrais-je les utiliser?
Dans l'exemple que vous avez donné, il n'y a aucune raison de ne pas casser la ligne et il n'est pas nécessaire d'échapper aux guillemets simples.
my $str = "select query_accession, query_tag, hit_accession, hit_tag,significance from summaryTables where query_id = '$query_id';"
Vous ne devriez pas donner un exemple dangereusement incorrect. Montrez-lui la bonne façon de le faire avec des espaces réservés dès le début, ou vous pouvez être sûr que quelqu'un va copier / coller, voir qu'il «fonctionne» et être satisfait.
Comme son SQL que vous citez, envisagez ensuite d'utiliser quelque chose comme SQL :: Abstrait code>
pour construire votre requête.
Par exemple: P>
my $sth = $dbh->prepare( $query ); $sth->execute( @bind );
J'aime ici les documents, même si certaines personnes les méprisent parce que la terminaison doit apparaître au début de la ligne malgré votre niveau de tiret.
my $str = <<"SQL"; SELECT query_accession, query_tag, hit_accession, hit_tag, significance FROM summaryTables WHERE query_id = ? SQL
non. Toutes les méthodes de création de chaînes de Perl 5 connaissent et incluent les nouvelles lignes neuves. Vous pouvez utiliser l'opérateur de concaténation comme vous l'avez fait dans votre question ou abstrait du code nécessaire pour résoudre le problème:
#!/usr/bin/perl use strict; use warnings; sub single_line { my @strings = @_; for (@strings) { s/\s+/ /g; s/^\s+|\s+$//g; } return wantarray ? @strings : $strings[0]; } my $sql = single_line " select query_accession,query_tag,hit_accession,hit_tag,significance from summaryTables where query_id = ?; "; print "[$sql]\n";
Pour le bâtiment de texte général ( re: votre mise à jour em>) Une réponse exotique consiste à utiliser un moteur de modèle. C'est un peu comme un Printf sur des stéroïdes! Voici un exemple en utilisant Vous pouvez également le construire comme ceci: p> et voici un exemple avec une citation, etc: p> Un meilleur exemple est quelque chose comme ça avec votre texte SQL d'origine: p> Voir: p> Toolkit de modèle code> : p>
String: TT CODE>
module CPAN li>
Et enfin aller d'exotique à bizarre, vous pouvez même créer un nouveau Opérateur similaire avec PERLX :: QuoteOperator : P> use PerlX::QuoteOperator q_strip_newline => {
-emulate => 'q',
-with => sub ($) {
my $txt = shift;
$txt =~ s/\n//g;
$txt;
},
};
my $str = q_strip_newline{123 123 456 sdndfnd sdfdmd
dfsdjkfs 343489 dfjsdj 3 34kdfsk kd
fd kd9534 rfg 546 5};
Vous êtes très bienvenu. Et merci en échange de m'inspirer d'écrire deux (ou est-ce que trois!) Réponses! (Surtout me faire souffler mon perlx :: Quototeoperator Trumpet :)
Bien qu'il n'y ait pas d'opérateur intégré pour le faire, voici une autre approche qui pourrait fonctionner:
my $str = qq( 123 123 456 sdndfnd sdfdmd dfsdjkfs 343489 dfjsdj 3 34kdfsk kd fd kd9534 rfg 546 5 ); $str =~ s/\n//g;
Voir perlmonks.org/?node_id=401006
la toux i> la vulnérabilité d'injection la toux i> xkcd.com/327