Как я могу преобразовать следующий скрипт bash в скрипт perl - PullRequest
1 голос
/ 02 декабря 2010

#!/bin/bash

i="0"

echo ""
echo "##################"
echo "LAUNCHING REQUESTS"
echo "  COUNT:  $2 "
echo "  DELAY:  $3 "
echo "  SESSID: $1"
echo "##################"
echo ""

while [ $2 -gt "$i" ]
do
  i=$[$i+1]
  php avtest.php $1 $4 &
  echo "EXECUTING REQUEST $i"
  sleep $3
done

вот лучший / модифицированный скрипт в bash


#!/bin/bash

i="0"
#startTime=`date +%s`
startTime=$(date -u +%s)
startTime=$[$startTime+$1+5]
#startTime=$($startTime+$1+5)
dTime=`date -d @$startTime`
echo ""
echo "##################"
echo "LAUNCHING REQUESTS"
echo "  COUNT:  $1 "
echo "  DELAY:  1 "
#echo "  EXECUTION:  $startTime "
echo "  The scripts will fire at :  $dTime "
echo "##################"
echo ""

while [ $1 -gt "$i" ]
do
  i=$[$i+1]
  php avtestTimed.php $1 $3 $startTime &
  echo "QUEUEING REQUEST $i"
  sleep 1
done

1 Ответ

4 голосов
/ 02 декабря 2010

Вот прямой перевод

#!/usr/bin/env perl
use strict;
use warnings;

print <<HERE;
##################
LAUNCHING REQUESTS
  COUNT:  $ARGV[1]
  DELAY:  $ARGV[2]
  SESSID: $ARGV[0]
##################
HERE

my $i = 0;
while($ARGV[1] > $i){
    $i += 1;
    system("php avtest.php $ARGV[0] $ARGV[3] &");
    print "EXECUTING REQUEST $i\n";
    sleep $ARGV[2];
}

Но было бы более целесообразно читать параметры командной строки в переменные, названные в соответствии с их предназначением, и не полагаться на запоминание порядка аргументов.

Краткие исправления в преобразовании:

Я использую строку здесь для представления многострочного текста.Я мог бы также добавить несколько операторов print, чтобы более точно имитировать версию bash

В аргументах bash доступ осуществляется как пронумерованные переменные, начиная с $ 1 и повышаясь.В Perl список аргументов представлен массивом @ARGV, который нумеруется, начиная с нуля (как массивы в большинстве языков).И в bash, и в Perl имя сценария можно найти в переменной $ 0.

В Perl массивы записываются как @arrayname при обращении ко всему массиву, но они используют $ arrayname [index] при доступе к членам массива.Таким образом, Perl $list[0] похож на bash ${list[0]}, а Perl @list похож на bash ${list[@]}.

В Perl переменные объявляются с ключевым словом my;эквивалент в bash будет declare.

Я использовал функцию system для порождения фоновых процессов.Его аргументом может быть просто командная строка, как вы могли бы использовать ее в bash.

В отличие от echo, print необходимо указать, если в конце строки должен быть символ новой строки.Для последних версий Perl существует функция say, которая добавит для вас новую строку.

Функция Perl sleep довольно понятна.

РЕДАКТИРОВАТЬ: из-за опечатки $i в выражении print было представлено как $ni, что приводило к ошибкам во время выполнения.Это было исправлено.

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