7
votes

Comment puis-je citer une longue chaîne à Perl?

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: XXX

Je sais Il existe divers autres moyens de représenter des chaînes à Perl. Que recommanderais-tu?

Mise à jour 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?

Ce que je fais maintenant, c'est quelque chose comme: < / p> xxx

qui est assez laid.


2 commentaires

Voir perlmonks.org/?node_id=401006


la toux la vulnérabilité d'injection la toux xkcd.com/327


8 Réponses :


5
votes

Regardez dans Opérateurs de devis de Perlop . Utilisez qq pour les guillemets doubles et q pour guillemets simples.


0 commentaires

1
votes

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"

Référence XKCD obligatoire


2 commentaires

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?



2
votes

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';"


1 commentaires

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.



3
votes

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 );


0 commentaires

10
votes

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


0 commentaires

3
votes

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";


0 commentaires

2
votes

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 Toolkit de modèle code> : p> xxx pré>

Vous pouvez également le construire comme ceci: p> xxx pré>

et voici un exemple avec une citation, etc: p> xxx pré>

Un meilleur exemple est quelque chose comme ça avec votre texte SQL d'origine: p> xxx pré>

Voir: p>


1 commentaires

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 :)



0
votes

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;


0 commentaires