如何在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喇叭:)