Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行bash脚本,读取其输出并使用Perl创建html_Perl_Bash - Fatal编程技术网

执行bash脚本,读取其输出并使用Perl创建html

执行bash脚本,读取其输出并使用Perl创建html,perl,bash,Perl,Bash,我有一个bash脚本,它生成不同的整数值。当我运行该脚本时,输出如下所示: 十二, 三十四 三十四 67 六, 此脚本在Solaris服务器上运行。为了向网络中的其他用户提供这些值,我决定编写一个Perl脚本,它可以: 运行bash文件 读取其输出 构建一个小html页面,其中包含一个存储bash值的表 这对我来说是一项艰巨的工作,因为我几乎没有Perl方面的经验。我知道我可以使用system执行unix命令(和bash文件),但无法获得输出。我还听说了qx,这听起来对我的案例非常有用 但我

我有一个bash脚本,它生成不同的整数值。当我运行该脚本时,输出如下所示:

十二,

三十四

三十四

67

六,

此脚本在Solaris服务器上运行。为了向网络中的其他用户提供这些值,我决定编写一个Perl脚本,它可以:

  • 运行bash文件
  • 读取其输出
  • 构建一个小html页面,其中包含一个存储bash值的表
这对我来说是一项艰巨的工作,因为我几乎没有Perl方面的经验。我知道我可以使用system执行unix命令(和bash文件),但无法获得输出。我还听说了qx,这听起来对我的案例非常有用


但我必须承认我不知道如何开始。。。您能给我一些提示如何解决这个问题吗?

要捕获bash文件的输出,您可以使用backtick操作符:

use strict;
my $e = `ls`;
print $e;

要捕获bash文件的输出,可以使用backtick操作符:

use strict;
my $e = `ls`;
print $e;
为什么只使用perl:

您可以在shell脚本本身中使用awk。 我以前做过这件事。 如果变量中有out put值,则使用以下方法:

echo $SUBSCRIBERS|awk 'BEGIN {
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?><GenTransactionHandler  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><EntityToPublish>\n<Entitytype=\"C\" typeDesc=\"Subscriber level\"><TargetApplCode>UHUNLD</TargetApplCode><TrxName>GET_SUBSCR_DATA</TrxName>" 
}
{for(i=1;i<NF+1;i++) printf("<value>%d</value>\n",$i)}
END{
print "</Entity>\n</EntityToPublish></GenTransactionHandler>"}' >XML_SUB_NUM`date +%Y%m%d%H%M%S`.xml
echo$SUBSCRIBERS|awk'开始{
打印“\nHunldGet\u SUBSCR\u数据”
}
{对于(i=1;i为什么只使用perl:

您可以在shell脚本本身中使用awk。 我以前做过这件事。 如果变量中有out put值,则使用以下方法:

echo $SUBSCRIBERS|awk 'BEGIN {
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?><GenTransactionHandler  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><EntityToPublish>\n<Entitytype=\"C\" typeDesc=\"Subscriber level\"><TargetApplCode>UHUNLD</TargetApplCode><TrxName>GET_SUBSCR_DATA</TrxName>" 
}
{for(i=1;i<NF+1;i++) printf("<value>%d</value>\n",$i)}
END{
print "</Entity>\n</EntityToPublish></GenTransactionHandler>"}' >XML_SUB_NUM`date +%Y%m%d%H%M%S`.xml
echo$SUBSCRIBERS|awk'开始{
打印“\nHunldGet\u SUBSCR\u数据”
}

{for(i=1;i像这样的问题有点难知道从哪里开始

您所指的
qx
是Perl的一个特性。“q*”或“类似于引号的操作符”记录在Perl“操作符”手册页中(通常您会使用
man perlop
在传统安装Perl的系统上阅读)

具体地说,
qx
是“引用的命令执行”…它本质上是Perl中`(反勾号或“命令替换”)操作符的另一种形式

换句话说,如果执行如下命令:

perl-e'$foo=qx{ls};打印“\n####\n$foo\n###\n”

…在安装了Perl的系统上,它应该运行Perl,Perl应该计算(-e)您提供的表达式(引号)。换句话说,我们正在命令行上编写一个小程序。这个程序首先创建一个变量,其内容将是“标量”(这是Perl对字符串或数字的术语)。我们正在将通过执行
ls
命令捕获的输出赋值给($foo)。之后,我们将使用这些内容前后的##行打印变量的内容(无论
ls
命令将打印什么)

Perl的
qx
操作符(以及其他各种q*操作符)的一个怪癖它允许您使用任意字符来分隔命令。例如,
perl-e'$bar=qx/pwd/;”
将捕获
pwd
命令的输出。当您在文本括号、大括号、方括号等周围使用通常用作分隔符的任何字符时)然后,
qx
命令将查找适当的匹配分隔符。如果您使用任何其他标点符号(或非字母数字字符?),则该字符也将作为终止分隔符。此后续行为类似于“替换”中的功能,并受其启发来自旧的
sed
实用程序和
ed
行编辑器的命令;而括号、大括号等的匹配是Perl的创新之处

这就是如何捕获shell脚本输出的基础。要在HTML表中打印数字,必须将捕获的输出拆分为单独的行(保存到列表或数组中),然后打印HTML序言(
(标题)标记等)…它们在一系列
行上循环,将数字插入
(表数据)容器中),然后最后打印HTML尾声(带结束标记)

为此,您需要阅读Perl
print
函数以及Perl中的“插值”。这是一个相当复杂的主题


这都是非常粗糙的,有一些工具可以让您在更高的级别上处理HTML的生成。您是否希望将shell脚本的执行包装在Perl脚本中也是相当可疑的,因为您似乎可以修改shell脚本以直接输出HTML(可能是由命令行开关或环境变量控制的选项)或者您可以用Perl重新编写shell脚本。这可能会消除解析输出的额外工作(将输出拆分为行,并将这些行中的值拆分为数组),因为您可以将数据直接捕获到数组中(或者可能在生成HTML行时直接打印出来)(不管您现有的shell脚本如何执行该操作)。

像这样的问题,很难知道从哪里开始

您所指的
qx
是Perl的一个特性。“q*”或“类似于引号的操作符”记录在Perl“操作符”手册页中(通常您会使用
man perlop
在传统安装Perl的系统上阅读)

具体地说,
qx
是“引用的命令执行”…它本质上是Perl中`(反勾号或“命令替换”)操作符的另一种形式

换句话说,如果执行如下命令:

perl-e'$foo=qx{ls};打印“\n####\n$foo\n###\n”

…在安装了Perl的系统上,它应该运行Perl,Perl应该计算(-e)已安装的表达式p