在Perl中编写Javascript的多行字符串

时间:2014-07-02 22:15:53

标签: javascript perl escaping

我尝试使用q {}创建一个Javascript字符串:

    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的情况下完成它而只是写单行,但是这看起来更干净,所以我想让这个工作,我相信一定有办法。 谢谢!

2 个答案:

答案 0 :(得分: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

例外:如果您使用的是{}[](),则不需要分隔符。\ n \ n分隔符在文字中是平衡的。

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__

另一种选择是使用单引号的heredoc。你不需要 - 实际上你不能 - 逃避任何事情。

{{1}}

答案 1 :(得分: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'
                    },
    ~;

或使用heredoc:

    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

注意:我在上面的文字中将所有\'翻译为',因为它们可能是最初使用单引号作为分隔符的工件。