在'use constant'中从perl heredoc中删除无关空格的perl语法是什么

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)

Dav*_*idO 7

这是一个示例,它将从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的字符串文字.