Tai*_*aul 3 perl replace constants heredoc
通过我的代码库中的各种代码,我有以下结构.对于我自己和其他人来说,使用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);
Run Code Online (Sandbox Code Playgroud)
将"s /\s +// g"搜索和替换运算符应用于赋值的语法是什么.
以下两次尝试不起作用.
use constant FIND_OBJECTS_SQL => s/\s+/ /g <<' END_SQL';
Run Code Online (Sandbox Code Playgroud)
产生
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.
Run Code Online (Sandbox Code Playgroud)
和
use constant FIND_OBJECTS_SQL => <<' END_SQL' =~ s/\s+/ /g;
Run Code Online (Sandbox Code Playgroud)
产生
Can't modify constant item in substitution (s///) at U:\junk.pl line 15, near "s/\s+/ /g;"
Run Code Online (Sandbox Code Playgroud)
这是一个示例,它将从heredoc的每一行中删除前导空格,然后将其分配给常量:
use constant FOO => <<'STRING' =~ s/^\s+//mgr;
abcde
fghij
STRING
print FOO, "\n";
Run Code Online (Sandbox Code Playgroud)
该/r修改在Perl 5.14是新的,并表示该目标字符串没有被修改,而是,它的内部复制,拷贝进行修改,并返回替换操作符的返回值.例如:
my $new_string = $string =~ s/foo/bar/r;
Run Code Online (Sandbox Code Playgroud)
$new_string将包含修改后的字符串,并将$string保持不变.
将其应用于您的代码,它可能如下所示:
use constant FIND_OBJECTS_SQL => <<' END_SQL' =~ s/\s+/ /gr;
...
END_SQL
Run Code Online (Sandbox Code Playgroud)
这与您演示的最后一个示例非常相似,但添加了/r修饰符,以便替换具有有用的返回值,因此它不会尝试修改HERE-doc的字符串文字.