2010-09-14 15 views
6

मैं आमतौर पर साधारण उद्धरण चिह्नों का उपयोग, लेकिन कुछ समय मैं बहुत लंबी लाइनों जो मैं नहीं तोड़ सकते हैं और यह भी बच वर्णों का उपयोग करने की आवश्यकता हो, तो मैं कुछ इस तरह मिलती है:मैं पर्ल में एक लंबी स्ट्रिंग कैसे उद्धृत कर सकता हूं?

my $str = "select query_accession,query_tag,hit_accession,hit_tag,significance from summaryTables where query_id = \'$query_id\';" 

मुझे पता है कि विभिन्न अन्य तरीके हैं पर्ल में तारों का प्रतिनिधित्व करने के लिए। आप क्या सुझाव देंगे?

अद्यतन आप एसक्यूएल से संबंधित सुझावों के लिए सभी लोग धन्यवाद। मैं कुछ मूल्यवान चीजें सीखता हूं, लेकिन, मेरा प्रश्न बना रहता है (सामान्य के रूप में, एसक्यूएल के बावजूद): क्या कोई ऑपरेटर है जो लाइन ब्रेक को पकड़ने के बिना उद्धरण की अनुमति देता है?

my $str = "123 123 456 sdndfnd sdfdmd " . 
"dfsdjkfs 343489 dfjsdj 3 34kdfsk kd " . 
"fd kd9534 rfg 546 5"; 

जो काफी बदसूरत है:

क्या अब मैं क्या की तरह कुछ है।

+0

देखें http://www.perlmonks.org/?node_id=401006 –

+0

* खांसी * इंजेक्शन भेद्यता * खांसी * http://xkcd.com/327/ – Ether

उत्तर

3

नहीं। पर्ल 5 की सभी स्ट्रिंग निर्माण विधियों के बारे में पता है और न्यूलाइन शामिल हैं। आप संयोजन ऑपरेटर उपयोग कर सकते हैं के रूप में आप अपने प्रश्न में किया था, या दूर सार कोड समस्या को ठीक करने की जरूरत:

#!/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"; 
5

perlop's Quote-Like Operators में देखें। एकल उद्धरण के लिए डबल कोट्स और q के लिए qq का उपयोग करें।

1

इस विशेष मामले में मैं,, प्लेसहोल्डर का उपयोग कर की सलाह देते हैं, जब तक आप पूरी तरह से 100% यकीन है कि $ query_id "अजीब वर्ण"

Obligatory xkcd reference

+0

क्या आप प्लेसहोल्डर्स के बारे में विस्तृत जानकारी देना चाहेंगे? –

+2

@ डेविड बी और यहां तक ​​कि अगर आपको लगता है कि आप निश्चित हैं, तो आगे बढ़ें और वैसे भी प्लेसहोल्डर का उपयोग करें। देखें [डीबीआई में प्लेसहोल्डर्स क्या हैं, और मैं उनका उपयोग क्यों करना चाहूंगा?] (Http://www.perlmonks.org/?node_id=7548) –

+1

http://bobby-tables.com/ – daxim

2

उदाहरण में है कि तुम दे दिया है को शामिल नहीं कर सकते हैं कर रहे हैं लाइन को तोड़ने का कोई कारण नहीं है और एकल उद्धरण चिह्नों से बचने की कोई आवश्यकता नहीं है।

my $str = "select query_accession, 
        query_tag, 
        hit_accession, 
        hit_tag,significance 
      from summaryTables 
      where query_id = '$query_id';" 

लेकिन, जैसा कि दूसरों एसक्यूएल प्रश्नों में प्रतिस्थापन कि dBi को आप प्लेसहोल्डर का उपयोग कर बंद काफी बेहतर रहे हैं पारित होने के लिए जा रहे हैं के लिए ही बताया है,।

+2

पर आपका समर्थन होना चाहिए एक खतरनाक गलत उदाहरण नहीं देते हैं। उसे शुरुआत से प्लेसहोल्डर्स के साथ करने का सही तरीका दिखाएं, या आप सुनिश्चित कर सकते हैं कि कोई इसे कॉपी/पेस्ट करने जा रहा है, देखें कि यह "काम करता है" और संतुष्ट हो। –

3

इसके एसक्यूएल के रूप में आप उद्धरण दे रहे हैं तो अपनी क्वेरी बनाने के लिए SQL::Abstract जैसे कुछ का उपयोग करने पर विचार करें।

उदाहरण के लिए:

SELECT query_accession, query_tag, hit_accession, hit_tag, significance FROM summaryTables WHERE (query_id = ?) 

और @bind में:

xyzzy 

तो $query पहले से ही एसक्यूएल स्वीकार करने के लिए बनाया गया है

use SQL::Abstract; 

my $sql = SQL::Abstract->new; 
my $query_id = 'xyzzy'; # arbitary value 

my ($query, @bind) = $sql->select( 
    'summaryTables', 
    [qw/ query_accession query_tag hit_accession hit_tag significance /], 
    { query_id => $query_id }, 
); 

यह आपको $query में देखना होगा क्या है प्लेसहोल्डर और @bind एच आवश्यक मूल्यों के रूप में। तो अपनी तो बस हमेशा की तरह DBI सामान इस तरह क्वेरी चलाने के लिए:

my $sth = $dbh->prepare($query); 
$sth->execute(@bind); 

अब आप सभी सुरक्षा और अनुकूलन कि SQL प्लेसहोल्डर प्रदान करते हैं (SQL injection Wikipedia entry देखें)

इसके अलावा इस पिछले तो सवाल यह देखें: Is there SQL parameter binding for arrays?

/I3az/

10

मैं यहाँ दस्तावेज की तरह है, हालांकि कुछ लोग उन्हें घृणा क्योंकि टर्मिनेटर अपने मांगपत्र स्तर के बावजूद पंक्ति के आरंभ में प्रकट करने के लिए है।

my $str = <<"SQL"; 
    SELECT 
    query_accession, 
    query_tag, 
    hit_accession, 
    hit_tag, 
    significance 
    FROM 
    summaryTables 
    WHERE 
    query_id = ? 
SQL 

मुझे अपने एसक्यूएल को स्वरूपित करना भी पसंद है, इसलिए मैं आसानी से कथन में संरचना देख सकता हूं।

2

सामान्य पाठ निर्माण के लिए (फिर से: अगर आपके अपडेट) एक विदेशी जवाब उपयोग करने के लिए है एक टेम्पलेट इंजन। यह स्टेरॉयड पर printf की तरह थोड़ा सा है! एक उदाहरण आदि

my $str2 = buildtt '{all.join(" ")}' => { 
    all => [ "123 123 456 sdndfnd sdfdmd", 
      "dfsdjkfs 343489 dfjsdj 3 34kdfsk kd", 
      "fd kd9534 rfg 546 5" ], 
}; 

और यहाँ है कुछ के हवाले से,:

यहाँ एक उदाहरण Template Toolkit उपयोग कर रहा है:

sub buildtt { 
    use Template; 
    my $tt = Template->new(START_TAG => '{', END_TAG => '}'); 
    $tt->process(\$_[0], $_[1], \my $output); 
    return $output; 
} 

my $str = buildtt '{a} {b} {c}' => { 
    a => "123 123 456 sdndfnd sdfdmd", 
    b => "dfsdjkfs 343489 dfjsdj 3 34kdfsk kd", 
    c => "fd kd9534 rfg 546 5", 
}; 

तुम भी इसे इस तरह का निर्माण कर सकते

my $str3 = buildtt '{all.join(" ")}' => { 
    all => [ "no quoted text here", 
      "here's some and here's some more", 
      q{$str2 was "buildtt"}, 
      $str2 ], 
}; 

एक बेहतर उदाहरण आपके मूल SQL पाठ के साथ ऐसा कुछ है:

my $sql = buildtt 'select {v.join(",")} from {t} where {q}' => { 
    v => [qw/ query_accession query_tag hit_accession hit_tag significance /], 
    t => 'summaryTables', 
    q => '(query_id = ?)', 
}; 

यह भी देखें:


पर सूची (पूरा नहीं) और अंत में से जा रहा अजीब के लिए विदेशी आप भी एक बना सकते हैं नई quote-like operatorPerlX::QuoteOperator साथ:

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

/I3az/

+0

+1 धन्यवाद धन्यवाद! –

+0

आपका बहुत स्वागत है।और मुझे दो लिखने के लिए प्रेरित करने के बदले में धन्यवाद (या वह तीन!) जवाब! (विशेष रूप से मुझे अपने PerlX :: QuoteOperator तुरही उड़ाने के लिए मिल रहा है :) – draegtun

0

जबकि वहाँ है ऑपरेटर में बनाया गया कोई ऐसा करने के लिए, यहाँ एक और दृष्टिकोण है कि काम दे सकता है:

(my $str = qq(
123 123 456 sdndfnd sdfdmd 
dfsdjkfs 343489 dfjsdj 3 34kdfsk kd 
fd kd9534 rfg 546 5 
)) =~ s/\n//g; 

या दो कदम के रूप में :

my $str = qq(
123 123 456 sdndfnd sdfdmd 
dfsdjkfs 343489 dfjsdj 3 34kdfsk kd 
fd kd9534 rfg 546 5 
); 
$str =~ s/\n//g; 

दोनों बदसूरत, लेकिन कार्यात्मक हैं।

संबंधित मुद्दे

 संबंधित मुद्दे