2015-02-07 37 views
4

我通過我的代碼庫中的各種代碼段擁有以下結構。 heredoc的使用對我自己和其他人來說都是有用的,能夠理解代碼,但爲通過網絡將數據傳輸到數據庫提供了不必要的批量。在'使用常量'中從perl heredoc中刪除無關空間的perl語法是什麼

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;" 

回答

7

下面是將其分配給之前剝去一個定界符的每行的開頭的空白的示例常數:

use constant FOO => <<'STRING' =~ s/^\s+//mgr; 
    abcde 
    fghij 
STRING 

print FOO, "\n"; 

/r修改在Perl 5.14是新的,並表示該目標字符串沒有被修改,而是,它的內部複製,拷貝進行修改,並返回替換操作符的返回值。例如:

my $new_string = $string =~ s/foo/bar/r; 

$new_string將包含修改後的字符串,並$string將被單獨留在家中。

將此應用於你的代碼,它可能是這樣的:

use constant FIND_OBJECTS_SQL => <<' END_SQL' =~ s/\s+/ /gr; 
    ... 
    END_SQL 

這是非常相似的,你表現出的最後一個例子,但增加了/r修改,以便取代有一個有用的返回值,因此它不會嘗試修改HERE-doc的字符串文字。

+0

直到[5.14.0](http://perldoc.perl.org/perl5140delta.html#)纔會添加'/ r'選項常用表達)。 – ThisSuitIsBlackNot 2015-02-07 12:20:36

+0

感謝您的澄清。 – DavidO 2015-02-07 16:52:30

+0

如果您不記得每個新的非[特徵](http://perldoc.perl.org)的版本,則可以使用[Syntax :: Construct](http://p3rl.org/Syntax::Construct) /feature.html)功能。 – choroba 2015-02-17 09:04:18

4

s///r返回修改後的字符串,而不是修改正在匹配的字符串。

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