从 'use constant' 中的 Perl heredoc 中删除多余空格的 Perl 语法是什么?
What is the Perl syntax to remove extraneous spaces from a Perl heredoc in 'use constant'?
通过我的代码库中的各种代码,我有以下结构。使用 heredoc 有利于我自己和其他人能够理解代码,但它为通过网络将数据传输到数据库提供了不必要的批量。
use constant FIND_OBJECTS_SQL => <<' END_SQL';
select object_name
,object_type
,0 PAC_REF
,owner
from all_objects
where (object_name like upper(:1)
or object_name = upper(:1))
and object_type not in ('SYNONYM'
,'PACKAGE BODY')
END_SQL
$object_data = $dbh->selectall_arrayref(FIND_OBJECTS_SQL, $object_name);
将“s/\s+/ /g”搜索和替换运算符应用于赋值的语法是什么?
以下两次尝试均无效。
use constant FIND_OBJECTS_SQL => s/\s+/ /g <<' END_SQL';
产生
Use of uninitialized value $_ in substitution (s///) at U:\junk.pl line 5.
Argument " END_SQL" isn't numeric in left bitshift (<<) at U:\junk.pl line 5.
和
use constant FIND_OBJECTS_SQL => <<' END_SQL' =~ s/\s+/ /g;
产生
Can't modify constant item in substitution (s///) at U:\junk.pl line 15, near "s/\s+/ /g;"
这是一个示例,它将在将 heredoc 分配给常量之前从每一行中去除前导空格:
use constant FOO => <<'STRING' =~ s/^\s+//mgr;
abcde
fghij
STRING
print FOO, "\n";
/r
修饰符是 Perl 5.14 中新增的,表示目标字符串未被修改,而是在内部复制,副本被修改,并且 returned 作为return 替换运算符的值。例如:
my $new_string = $string =~ s/foo/bar/r;
$new_string
将包含修改后的字符串,而 $string
将保持不变。
将此应用到您的代码中,它可能如下所示:
use constant FIND_OBJECTS_SQL => <<' END_SQL' =~ s/\s+/ /gr;
...
END_SQL
这与您演示的最后一个示例非常相似,但添加了 /r
修饰符,以便替换具有有用的 return 值,并且不会尝试修改HERE-doc 的字符串文字。
s///r
returns 修改字符串而不是修改匹配的字符串。
use constant CONSTANT => <<'EOI' =~ s/\s+/ /gr;
...
EOI
s///r
从 5.14 开始可用。如果你需要支持旧版本的 Perl,你可以使用
use constant CONSTANT => do { ( my $s = <<'EOI' ) =~ s/\s+/ /g; $s };
...
EOI
通过我的代码库中的各种代码,我有以下结构。使用 heredoc 有利于我自己和其他人能够理解代码,但它为通过网络将数据传输到数据库提供了不必要的批量。
use constant FIND_OBJECTS_SQL => <<' END_SQL';
select object_name
,object_type
,0 PAC_REF
,owner
from all_objects
where (object_name like upper(:1)
or object_name = upper(:1))
and object_type not in ('SYNONYM'
,'PACKAGE BODY')
END_SQL
$object_data = $dbh->selectall_arrayref(FIND_OBJECTS_SQL, $object_name);
将“s/\s+/ /g”搜索和替换运算符应用于赋值的语法是什么?
以下两次尝试均无效。
use constant FIND_OBJECTS_SQL => s/\s+/ /g <<' END_SQL';
产生
Use of uninitialized value $_ in substitution (s///) at U:\junk.pl line 5.
Argument " END_SQL" isn't numeric in left bitshift (<<) at U:\junk.pl line 5.
和
use constant FIND_OBJECTS_SQL => <<' END_SQL' =~ s/\s+/ /g;
产生
Can't modify constant item in substitution (s///) at U:\junk.pl line 15, near "s/\s+/ /g;"
这是一个示例,它将在将 heredoc 分配给常量之前从每一行中去除前导空格:
use constant FOO => <<'STRING' =~ s/^\s+//mgr;
abcde
fghij
STRING
print FOO, "\n";
/r
修饰符是 Perl 5.14 中新增的,表示目标字符串未被修改,而是在内部复制,副本被修改,并且 returned 作为return 替换运算符的值。例如:
my $new_string = $string =~ s/foo/bar/r;
$new_string
将包含修改后的字符串,而 $string
将保持不变。
将此应用到您的代码中,它可能如下所示:
use constant FIND_OBJECTS_SQL => <<' END_SQL' =~ s/\s+/ /gr;
...
END_SQL
这与您演示的最后一个示例非常相似,但添加了 /r
修饰符,以便替换具有有用的 return 值,并且不会尝试修改HERE-doc 的字符串文字。
s///r
returns 修改字符串而不是修改匹配的字符串。
use constant CONSTANT => <<'EOI' =~ s/\s+/ /gr;
...
EOI
s///r
从 5.14 开始可用。如果你需要支持旧版本的 Perl,你可以使用
use constant CONSTANT => do { ( my $s = <<'EOI' ) =~ s/\s+/ /g; $s };
...
EOI