2014-07-02 48 views
0

我試圖創造運用Q {}這樣一個Javascript的字符串:編寫JavaScript的多行字符串在Perl

my $javascript = q{ 
     $(function() { 
      var chart; 

      $(document).ready(function() { 

       // Build the chart 
       $(\'#container\').highcharts({ 
        chart: { 
         plotBackgroundColor: null, 
         plotBorderWidth: null, 
         plotShadow: false 
        }, 
        title: { 
         text: \'title\' 
        }, 
    }; 

它需要在這樣的片段,而不是完整的Javascript塊。我的問題是,由於該塊沒有完成,它包含開括號'{',沒有右括號,perl正在將q {}的右括號解釋爲其中一個javascript塊的右括號。我嘗試使用q()代替,但同樣的問題發生。我可以使用另一個字符作爲分隔符而不是(或{?我也嘗試過使用qq,但導致同樣的問題,它涉及更多的轉義。我知道我可以做到沒有q或qq,只寫個別行,但這看起來清爽多了,所以我希望得到這個工作,我相信一定有辦法 感謝

回答

4

在單引號文字中,您必須轉義\和分隔符(本例中爲{})。

q{abc\{def\\ghi'jkl} # Produces: abc{def\ghi'jkl 

例外:如果它不含糊,則無需轉義\

q{abc\\def} # Produces: abc\def 
q{abc\def}  # Produces: abc\def, just like previous 

q{abc\\\\def} # Produces: abc\\def 
q{abc\\\def} # Produces: abc\\def, just like previous 

例外:如果你使用{}[]()分隔符是字面平衡你不必分隔符。

q{ foo \{ bar \{ baz \} qux \} moo } # Produces: foo { bar { baz } qux } moo 
q{ foo \{ bar { baz } qux \} moo }  # Same as above 
q{ foo { bar { baz } qux } moo }  # Same as above 

問題是你沒有正確地逃脫你的分隔符。如果結果爲\',您也希望\'導致'

my $javascript = q{ 
    $(function() \{       <---- Escape 
     var chart; 

     $(document).ready(function() \{  <---- Escape 

      // Build the chart 
      $('#container').highcharts({  <---- No slash for ', and 
       chart: {       optional for balanced { } 
        plotBackgroundColor: null, 
        plotBorderWidth: null, 
        plotShadow: false 
       }, 
       title: { 
        text: 'title' 
       }, 
}; 

更好的是,使用不出現在文本中的分隔符。 (你只需要逃避\\。)

my $javascript = q~ 
    $(function() { 
     var chart; 

     $(document).ready(function() { 

      // Build the chart 
      $('#container').highcharts({ 
       chart: { 
        plotBackgroundColor: null, 
        plotBorderWidth: null, 
        plotShadow: false 
       }, 
       title: { 
        text: 'title' 
       }, 
~; 

另一種選擇是使用單引號定界符。你不需要—確實你不能—轉義任何東西。

my $javascript = <<'__EOJS__'; 
    $(function() { 
     var chart; 

     $(document).ready(function() { 

      // Build the chart 
      $('#container').highcharts({ 
       chart: { 
        plotBackgroundColor: null, 
        plotBorderWidth: null, 
        plotShadow: false 
       }, 
       title: { 
        text: 'title' 
       }, 
__EOJS__ 
3

使用不同的分隔符像q~ ~

my $javascript = q~ 
     $(function() { 
      var chart; 

      $(document).ready(function() { 

       // Build the chart 
       $('#container').highcharts({ 
        chart: { 
         plotBackgroundColor: null, 
         plotBorderWidth: null, 
         plotShadow: false 
        }, 
        title: { 
         text: 'title' 
        }, 
    ~; 

或者使用定界符。!

my $javascript = <<'END_JS'; 
     $(function() { 
      var chart; 

      $(document).ready(function() { 

       // Build the chart 
       $('#container').highcharts({ 
        chart: { 
         plotBackgroundColor: null, 
         plotBorderWidth: null, 
         plotShadow: false 
        }, 
        title: { 
         text: 'title' 
        }, 
END_JS 

注意:I tra在上面的文本中,所有的\'都只是',因爲它們很可能是最初使用單引號作爲分隔符的工件。

+0

使用heredoc很好。我嘗試了多個其他分隔符,他們沒有工作......我試過〜,*,%,\等。他們不工作的任何理由? –

+0

如果像上面'q〜〜'演示的那樣使用它們,並且您的實際文本與您的示例相匹配,那麼爲什麼替代分隔符不起作用是沒有道理的。你會希望選擇一個理想情況下未包含在文本中的分隔符。 '〜'可能是最常見的選擇。但是,如果你擁有的只是文本文本,在我看來,heredoc是你的最佳選擇。 – Miller

+1

看起來像是在工作,我使用VIM,並且顏色爲字符串等而改變,當我使用像〜這樣的分隔符時,就像字符串和變量一樣改變顏色。但是,當我編譯時,它運行正常。只是不愉快的看看。我想我會堅持heredoc。謝謝! –