Как я могу перебрать все отмеченные значения группы флажков в скрипте Perl CGI? - PullRequest
0 голосов
/ 13 октября 2011

У меня установлена ​​тестовая система xampp , работающая на компьютере с Windows.

У меня есть небольшое приложение командной строки, которое я хочу запустить с помощью сценария Perl CGI.

У меня есть форма, которую я создал с помощью Perl.Есть несколько флажков, а также поле ввода, где пользователь может напечатать сообщение.

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

#!"C:\xampp\perl\bin\perl.exe"

#print a standard 200 -level HTTP header
print "Content-Type:text/html\n\n";

print "<html><head><title>Broadcast Message</title></head>\n";
print "<body>\n";

#display form data
#&displayInfo();

print "</body></html>\n";

if ($ENV{REQUEST_METHOD} eq "GET") 
  {
    &formDisplay();
    exit;
  }
#Else process and display back to screen
else
  {
    #&switches();
    &parseform();
    &displayInfo();

    exit;
  }  

#This subroutine will display information without using the HTML document

sub formDisplay
  {
    print qq~

    <FORM METHOD="POST" ACTION="/cgi-bin/broadcast.cgi">
      <h3>Broadcast Message to Domain</h3>
      ***PLEASE NOTE*** This will broadcast a message to ALL machines in the Domain</br></br>
      <TABLE cellpadding=0 cellspacing=1 border=0>
      <TR>
        <TD>Select your target by switch:&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp   </br></TD>
        <TD></TD>
        <TD>Select your target by department:                       </br></TD>
      </TR>
      <TR>
        <TD><input type=CHECKBOX name=517 value="517">   - 517      </br></TD>

        <TD></TD>
        <TD><input type=CHECKBOX name=ACC value="ACC">   - ACC      </br></TD>
      </TR>
      <TR>
        <TD><input type=CHECKBOX name=testfiletxt value="testfiletxt"> - testefiletxt </br></TD>
      </TR>
      </TABLE>
      </br></br>
      Please type the message you wish to broadcast to the Domain: </br>
      <input name="message"></br>

      <input type=SUBMIT name=Send value="Send">
      <input type=RESET name=Reset value="Reset">
    </form>
    ~;
  }

#This subroutine will display information received from a form 
sub displayInfo {
  print "<b>Your Message:</b> </br>  ",         $form{"message"}, "</br>";
  $system_message=$form{"message"};
  #system "sent.exe /u:testmachine \"$system_message\"" ;
  print qq~
  <form>
  <input type="button" value="Back" onclick="history.go(-1);return true;">
  </form>
  ~;
  # Working loop for form hash
  delete $form{'Send'};

  foreach(keys %form) {
  print "$form{$_} </br>";
  }
 ##############################
  $textme=$form{"testfiletxt"}; 
    open( FILE, "< $textme" ) or die "Can't open $filename : $!";

    while( <FILE> ) {
        chomp;
        print "sent.exe $_ ", $form{"message"} , "</BR>";
    }

    close FILE; 

}


sub parseform
  {
    #get data from environment variable
    read STDIN,$qstring,$ENV{"CONTENT_LENGTH"};
    #$qstring = $ENV{'QUERY_STRING'};

    #break data up on ampersands, and store in array
    @pairs = split(/&/, $qstring);

    #start a loop to process form data
    foreach (@pairs) {
    #split field name and value on "=", store in two scalar variables
    ($key, $value) = split(/=/);
    #translate '+' signs back to spaces
    $value =~ tr/+/ /;
    #translate special characters
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    #store data in hash
    $form{$key} = $value;
    }
  }

У меня проблемы с обработкойтекстовые поля, которые были отмечены.

Мне нужно, чтобы скрипт запускал утилиту командной строки с параметрами, указанными пользователем (т. е. флажки и поле ввода).

Я думаю, что это будет работать следующим образом:

  1. У нас есть предварительно созданные текстовые файлы, которые будут содержать имен Netbios компьютеров в нашей сети, одно имя компьютераза строкуЭти файлы будут представлять коммутаторы, каждый файл коммутатора будет содержать имя Netbios подключенных к нему компьютеров.В конечном итоге мы расширим это и на создание групп.

  2. Пользователь перейдет на эту страницу трансляции и выберет переключатели, на которые он хочет транслировать.Таким образом, любая машина, подключенная к определенному коммутатору, получит это широковещательное сообщение.Пользователь также предоставит сообщение для трансляции.

  3. Когда пользователь нажимает кнопку «Отправить», необходимо выполнить несколько действий.

    • Необходимо будет открыть файл, представляющий выбранный переключатель, и сообщение, введенное пользователем, должно быть добавлено в конец каждого имени Netbios в списке.Пример:

    netbiosName сообщение, предоставленное пользователем

    • Затем, когда это будет завершено.Утилита командной строки должна запускаться с использованием файлов, которые мы только что отредактировали, в следующем формате:

       sent.exe /t:15 /f:$filename
      

    Поэтому, если пользователь выбрал 3 переключателя, команда должна быть запущена 3 раза

         sent.exe /t:15 /f:swtich1
         sent.exe /t:15 /f:switch2
         sent.exe /t:15 /f:switch3
    

Следует отметить, что опция /f "указывает команде sent.exe использовать файл, который требуется отформатировать определенным образом.

У меня был некоторый успех при обработке по одному варианту за раз.

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

Как я могу обработатьВы можете легко установить флажки с помощью цикла?

Можно ли извлечь это из подпрограммы &parseform? Или есть более простой способ сделать это?

1 Ответ

4 голосов
/ 13 октября 2011

Использование CGI.pm :

my @checked = $cgi->param('department');

предоставит вам все отмеченные флажки с именем «отдел».Для этого вам нужно очистить ваш HTML:

<input type="checkbox" name="department" value="517" 
 id="department_517"><label for="department_517">517</label>

<input type="checkbox" name="department" value="ACC" 
 id="department_ACC"><label for="department_ACC">ACC</label>

<input type="checkbox" name="department" value="testfiletxt" 
 id="department_testfiletxt"><label 
 for="department_testfiletxt">testfile.txt</label>
...