Выполнение bash-скрипта, чтение его выходных данных и создание HTML с помощью Perl - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть скрипт bash, который выдает разные целочисленные значения.Когда я запускаю этот скрипт, вывод выглядит так:

12

34

34

67

6

Этот скрипт выполняется на сервере Solaris.Чтобы предоставить другим пользователям в сети эти значения, я решил написать Perl-скрипт, который может:

  • запустить файл bash
  • прочитать его вывод
  • создать крошечную HTML-страницу с таблицей, в которой хранятся значения bash

Это тяжелая работа для меня, потому что у меня почти нет опыта работы с Perl.Я знаю, что могу использовать system для выполнения команд unix (и файлов bash), но не могу получить вывод.Я также слышал о qx * ​​1026 *, что звучит очень полезно для моего случая.

Но я должен признать, что понятия не имею, как начать ... Не могли бы вы дать мне несколько советов, как решить эту проблему?

Ответы [ 4 ]

3 голосов
/ 27 апреля 2011

С таким вопросом немного сложно понять, с чего начать.

qx, на который вы ссылаетесь, является особенностью Perl. «Q *» или «Операторы типа цитирования и цитирования» описаны на справочной странице «Операторы» Perl (обычно вы используете man perlop, чтобы прочитать это в системах с обычной установкой Perl).

В частности, qx - это "выполнение команды в кавычках" ... которая, по сути, является альтернативной формой оператора `(обратный тик или" подстановка команды) в Perl.

Другими словами, если вы выполняете такую ​​команду, как:

perl -e '$ foo = qx {ls}; print "\ n ### \ n $ foo \ n ### \ n"; '

... в системе с установленным Perl, тогда он должен запустить Perl, который должен оценить (-e) предоставленное вами выражение (в кавычках). Другими словами, мы пишем небольшую программу прямо в командной строке. Эта программа начинается с создания переменной, содержимое которой будет скалярным (терминология Perl для строки или числа). Мы присваиваем (оператор =, или assignment) вывод, который захватывается выполнением команды ls для этой переменной ($ foo). После этого мы печатаем содержимое нашей переменной (независимо от того, что напечатала бы команда ls) с ### строками перед и после этого содержимого.

Причуда оператора Perl qx (и различных других операторов q *) заключается в том, что он позволяет вам разделять команду практически любыми символами, которые вам нравятся. Например, perl -e '$bar = qx/pwd/;' будет захватывать вывод команды pwd. Если вы используете любой из символов, которые обычно используются в качестве разделителей вокруг текстовых скобок, скобок, скобок и т. Д.), То команда qx будет искать соответствующий соответствующий разделитель. Если вы используете любую другую пунктуацию (или не буквенно-цифровой символ?), То этот же символ будет и конечным разделителем. Это более позднее поведение аналогично и было вдохновлено функцией в команде «замена» из старой утилиты sed и ed строковых редакторов; в то время как сопоставление скобок, фигурных скобок и т. д. является новинкой Perl.

Итак, это основы того, как захватить выходные данные вашего сценария оболочки. Чтобы напечатать числа в таблице HTML, вам нужно разделить захваченный вывод на отдельные строки (сохранить их в список или массив), а затем распечатать пролог HTML (теги <table> и <th> (заголовок) и т. Д. on) ... они зацикливаются на серии <tr> строк, интерполируя ваши числа в <td>> (данные таблицы)) и затем, наконец, печатают ваш HTML-эпилог (с закрывающими тегами).

Для этого вы захотите прочитать о функции Perl print и о " interpolation " в Perl. Это довольно сложная тема.

Это все очень грубо, и есть инструменты, которые позволяют вам подойти к генерации HTML на гораздо более высоком уровне. Также весьма сомнительно, что вы хотите обернуть выполнение сценария оболочки в сценарий Perl, поскольку вполне вероятно, что вы можете изменить сценарий оболочки для непосредственного вывода HTML (возможно, в качестве параметра, управляемого параметром командной строки или переменной среды), или что вы можете переписать сценарий оболочки на Perl. Это может потенциально исключить дополнительную работу по синтаксическому анализу выходных данных (разбиение его на строки и разделение значений из этих строк в массив, поскольку вы можете захватывать данные непосредственно в массив (или, возможно, распечатывать строки HTML) непосредственно, как вы генерируя их (однако это делает существующий сценарий оболочки).

1 голос
/ 27 апреля 2011

Чтобы захватить вывод вашего bash-файла, вы можете использовать оператор backtick:

use strict;
my $e = `ls`;
print $e;
0 голосов
/ 28 апреля 2011

Большое, большое спасибо вам! С вашей большой помощью. Мне удалось создать Perl-скрипт, который выполняет большую часть работы.

Это то, что я создал до сих пор:

#!/usr/bin/perl -w
use strict;
use CGI qw(:standard);

#some variables
my $message = "please wait, loading data...\n";

#First build the web page
print header;
print start_html('Hello World');
print "<H1>we need love, peace and harmony</H1>\n";
print "<p>$message</p>\n";

#Establish a pipeline between the bash and my script.
my $bash_command = '/love/peace/harmony/./lovepeace.bash';
open(my $pipe, '-|', $bash_command) or die $!;

while (my $line = <$pipe>){
# Do something with each line.
print "<p>$line</p>\n";
}

#job done, now refresh page?

print end_html;

Когда я вызываю этот скрипт .pl в своем браузере, все работает хорошо :-) Но у меня все еще есть несколько вопросов:

Когда я звоню на этот сайт, он загружает значения из канала. Поскольку существует около 10 значений, это скорее

быстрая (2-4 секунды) Но если у меня есть 100+ значений, пользователь должен немного подождать. Так как у меня не может быть индикатор выполнения, я

должен предоставить информацию пользователю. Как:

"Загрузка данных, пожалуйста, подождите ..."

А когда работа выполнена, в этом сообщении должно быть написано: «Работа выполнена» или что-то подобное.

  • Но как мне понять, закончен ли процесс?
  • можно ли перезагрузить страницу, если работа выполнена?
  • Есть ли шанс использовать мою собственную таблицу стилей с этим Perl-CGI

С уважением,

JJ

0 голосов
/ 27 апреля 2011

Почему только perl:

вы можете использовать awk для этого в самом скрипте. Я сделал это раньше. если у вас есть выходные значения в переменной, используйте следующий метод:

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

в $SUBSCRIBERS значения должны разделяться табуляцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...