Для создания общего текста ( re: ваше обновление ) экзотическим ответом является использование шаблонизатора.Это немного похоже на printf на стероидах!
Вот пример использования 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 $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 = ? )',
};
Также см .:
И, наконец, переходя от экзотики к странному, вы даже можете создать новый оператор, подобный кавычкам с PerlX :: 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 /