Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中引用长字符串?_Perl_String_Quotes - Fatal编程技术网

如何在Perl中引用长字符串?

如何在Perl中引用长字符串?,perl,string,quotes,Perl,String,Quotes,我通常使用简单的引号,但有时我得到很长的一行,我不能打破,还需要使用转义字符,所以我得到这样的东西: my $str = "select query_accession,query_tag,hit_accession,hit_tag,significance from summaryTables where query_id = \'$query_id\';" my $str2 = buildtt '{all.join(" ")}' => { all => [ "123 1

我通常使用简单的引号,但有时我得到很长的一行,我不能打破,还需要使用转义字符,所以我得到这样的东西:

my $str = "select query_accession,query_tag,hit_accession,hit_tag,significance from summaryTables where query_id = \'$query_id\';"
my $str2 = buildtt '{all.join(" ")}' => {
    all => [ "123 123 456 sdndfnd sdfdmd",
             "dfsdjkfs 343489 dfjsdj 3 34kdfsk kd",
             "fd kd9534 rfg 546 5" ],
};
我知道在Perl中还有其他各种表示字符串的方法。你推荐什么

更新 谢谢大家对SQL相关的建议。我学到了一些有价值的东西,但是,我的问题仍然是(作为一个一般问题,不管SQL如何):是否有一些操作符允许引用而不捕获换行符

我现在做的是:

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

这很难看。

看看里面。使用
qq
表示双引号,使用
q
表示单引号。

在这种情况下,我建议使用占位符,除非您完全100%确定$query\u id不能包含“有趣的字符”


在您给出的示例中,没有理由不打断这一行,也没有必要跳过单引号

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

<>但是,正如其他人指出的,对于要传递给DBI的SQL查询中的替换,使用占位符要好得多。

< P>作为引用的SQL,然后考虑使用类似于构建查询的一些东西。 例如:

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
中看到的内容:

SELECT query_accession, query_tag, hit_accession, hit_tag, significance FROM summaryTables WHERE ( query_id = ? )
@bind
中:

xyzzy
因此,
$query
已经构建为接受SQL占位符,
@bind
具有必要的值。因此,运行查询时通常会用到以下内容:

my $sth = $dbh->prepare( $query );
$sth->execute( @bind );
现在,您已经具备了SQL占位符提供的所有安全性和优化功能(请参阅)

另请参见前一个SO问题:


/I3az/

我喜欢这里的文档,尽管有些人鄙视它们,因为不管缩进级别如何,终结者都必须出现在行的开头

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

my$str=No。Perl5的所有字符串创建方法都知道并包含换行符。您可以像在问题中那样使用串联运算符,也可以抽象出修复问题所需的代码:

#!/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";
对于一般文本构建(re:您的更新),一个奇特的答案是使用模板引擎。这有点像服用类固醇

下面是一个示例,使用:

您也可以这样构建它:

my $str = "select query_accession,query_tag,hit_accession,hit_tag,significance from summaryTables where query_id = \'$query_id\';"
my $str2 = buildtt '{all.join(" ")}' => {
    all => [ "123 123 456 sdndfnd sdfdmd",
             "dfsdjkfs 343489 dfjsdj 3 34kdfsk kd",
             "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 = ? )',
};
另见:

  • 因此,问题:
  • CPAN模块
  • Perl5 wiki上的列表(不完整)

最后,从异国情调到怪异,你甚至可以创造一个新的:


/I3az/

虽然没有内置的操作符来执行此操作,但下面是另一种可能有效的方法:

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

两者都很难看,但都很实用

你愿意详细说明占位符吗?@David B即使你认为你是肯定的,还是继续使用占位符吧。见咳嗽注射脆弱性咳嗽你不应该给出一个危险的错误的例子。从一开始就向他展示使用占位符的正确方法,或者你可以确定有人会复制/粘贴它,看到它“起作用”,然后感到满意。非常欢迎。谢谢你鼓励我写两个(或者是三个!)答案!(特别是让我吹我的PerlX::QuoteOperator喇叭:)