Возьмите входные данные из файла и поместите каждое значение, разделенное пробелами, в переменную - PullRequest
0 голосов
/ 10 мая 2011

Первый постер и моя первая попытка написания сценариев на Perl, так что будьте осторожны со мной.

Что мне нужно сделать, это прочитать файл журнала, который содержит IP-адреса и номера портов. Содержимое файла:

6056 255.255.255.255 6056 255.255.255.255 80
16056 255.255.255.255 16056 255.255.255.255 80
7056 255.255.255.255 7056 255.255.255.255 80
17056 255.255.255.255 17056 255.255.255.255 80

Файл содержит больше записей, подобных этой.

Первое значение каждой строки необходимо извлечь и добавить в переменную $LocalPort, второе значение каждой строки, присвоенное $LicenseServer, третье значение $RemotePort, четвертое значение $ShServer, пятое значение $ShServerport.

В конце каждого цикла значения будут вставлены в переменную $command и записаны в файл, который может быть запущен как скрипт для установления vsh-соединения. Я могу читать в файле очень хорошо, но я не уверен, как извлечь каждое значение и назначить его соответствующему значению каждый раз, когда он запускает цикл. В настоящее время у меня есть это:

open (LOGFILE, $LogPath) || "Unable to open the log file or file does not exist $!";
while (@line =  <LOGFILE>)
{
    $LocalPort=$line[0]; 
    $LicenseServer=$line[1];
    $RemotePort=$line[2];
    $ShServer=$line[3];
    $ShServerpor=$line[4];

    print "$LocalPort\n";
    print "$LicenseServer\n"
    print "$RemotePort\n";
    print "ShServer\n";
    print "ShServerPort\n";
}

Пока все, что я могу сделать, это выплюнуть точный файл, когда он его читает. Это действительно моя первая попытка написания сценариев, и у меня нет никакой подготовки, кроме того, что я могу получить от лорда Google. Любая помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 10 мая 2011

@line = <LOGFILE> считывает весь файл в @line. Вам нужно что-то вроде этого:

while (<LOGFILE>) {
   ( $LocalPort, $LicenseServer,
       $RemotePort,$ShServer,$ShServerpor ) = split (/\s/, $_ );
}
1 голос
/ 10 мая 2011
use strict;
use warnings;

while(<>) {
    chomp;
    next if /^\s*$/; #skip empty lines
    my($local_port, $license_server, $remote_port, $sh_server, $sh_server_port) = split;
    print "$local_port\n";
    #....
}

использовать как

perl my_script.pl < file_with_data.txt

или

perl my_script.pl file_with_data.txt
0 голосов
/ 10 мая 2011

Добро пожаловать, Дэн, в stackoverflow.

#!/usr/bin/perl 
# ALWAYS declare these two lines
use strict;
use warnings;

my $logPath = '/path/to/logfile';
# use 3 args open and test for failure
open my $fh, '<', $logPath or die "unable to open '$logPath' for reading: $!";

# read one line at a time
while(my $line = <$fh>) {
    # delete line separator
    chomp $line;
    # split each line on spaces
    my ($LocalPort, $LicenseServer, $RemotePort, $ShServer, $ShServerpor) = split/\s+/, $line;

    # do the stuff with the variables

}
#close the file and test for failure
close $fh or die "unable to close '$logPath' : $!";
...