使我的文件以 Perl 或 HTML 可读
Posted
技术标签:
【中文标题】使我的文件以 Perl 或 HTML 可读【英文标题】:make my file readable as either Perl or HTML 【发布时间】:2011-01-25 06:57:14 【问题描述】:本着“Perl Preamble”的精神,无论是由 shell 脚本解释器还是 Perl 解释器执行,脚本都能正常工作......
我有一个 Perl 脚本,其中包含一个嵌入的 html 文档(作为“heredoc”),即:
#!/usr/bin/perl
... some Perl code ...
my $html = <<'END' ;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
... more HTML ...
</HTML>
END
... Perl code that processes $html ...
我希望能够处理 Perl 脚本中的 HTML,并使用 Web 浏览器检查它,并且只在 HTML 是我想要的方式时运行脚本。为此,我需要该文件可以作为 HTML 文件和 Perl 脚本打开。
我用 Perl cmets 和 HTML cmets 尝试了各种技巧,但不能让它非常完美。文件作为一个整体不必是“严格合法”的 HTML(尽管嵌入的文档应该是)......只是可以在浏览器中显示,而没有(或最少)可见的 Perl 垃圾。
编辑:已解决!看我自己的答案
【问题讨论】:
我认为您的解决方案集是空集。如果您打算通过 shbang 将 perl 与文件关联,那么您需要第一行。 SGML 注释不能出现在此行之前,因此您将显示 shbang——大多数浏览器会将其作为自己的文档放置——即使它生成非标准 HTML。 只需添加一些 javascript 即可从 DOM 中删除 shebang! @Axeman,见下面的空集;) 【参考方案1】:阅读它并为@Axeman 先生哭泣...我现在向您展示空集:
</dev/fd/0 eval 'exec perl -x -S $0 $1+"$@"' #> <!--
#!perl
... some Perl code ...
my $html = << '<!-- END' ; # -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
... more HTML ...
</HTML>
<!-- END
... Perl code that processes $html ...
# -->
【讨论】:
巧妙的把戏。尽管我仍然建议不要这样做。你真的应该在不同的地方有不同的东西。 我赞扬你的聪明才智。 +1 令人敬畏的骇人听闻。但是,对于生产代码或任何其他可维护性甚至是次要问题的情况,我仍然认为使用模板(正如我昨天提交的答案中所建议的那样)从长远来看会给你带来更少的痛苦。【参考方案2】:这听起来像是一条通往痛苦的道路。考虑将 HTML 存储在一个单独的文件中并在脚本中读取它。
【讨论】:
【参考方案3】:也许这是Markup::Perl
的工作:
# don't write this...
print "Content-type: text/html;\n\n";
print "<html>\n<body>\n";
print "<p>\nYour \"lucky number\" is\n";
print "<i>", int rand 10, "</i>\n</p>\n";
print "</body>\n</html>\n";
# write this instead...
use Markup::Perl;
<html><body><p>
Your "lucky number" is
<i><perl> print int rand 10 </perl></i>
</p></body></html>
您也可以删除 use Markup::Perl
行并像这样运行您的脚本
perl -MMarkup::Perl my_page_with_embedded_perl.html
那么页面应该渲染得很好。
【讨论】:
【参考方案4】:在我看来,您需要一个模板解决方案,例如 Template::Toolkit 或 HTML::Template。在您的代码中嵌入 HTML 或在您的 HTML 中嵌入代码是一个痛苦的秘诀。
【讨论】:
【参考方案5】:您是否考虑过将 Perl 放入 HTML 中?
像ASP4 一样吗?
这样会更容易很多 - 相信我 ;-)
【讨论】:
显然 Template::Refine 是最好的方法 ;) 有趣...不... 太棒了!以上是关于使我的文件以 Perl 或 HTML 可读的主要内容,如果未能解决你的问题,请参考以下文章
在Perl中有个if语句为if (-e "$dir/$_),其中$dir是某个目录,$_已取得$dir目录下的文件。