从 '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