Perl - положить массив в Arry - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу поместить переменную в массив и взять этот массив переменной $splited_line[0]

Мой сценарий:

#!/usr/bin/perl

use DBI;
use Data::Dumper;
use DBD::mysql;
use POSIX;

#use strict; use warnings;

#"titi.log" or die $!;

open(FILE,"<file.log");

print "file loaded \n";

my @lines=<FILE>;

#tout les valeurs du fichier se trouve dans le tableau lines

close(FILE);

my @temp_arr;


foreach my $line(@lines)
{
    @temp_arr=split('\s',$line);
    #converti en nombre
    $temp_arr[12] =~ s/[^\d.]//g;
    #converti en entier
    $temp_arr[12] = floor($temp_arr[12]);

    #enlève les simple cote
    $temp_arr[10] =~ s/^'|'$//g;

    if ($temp_arr[12] > 5)
    {
        if ($temp_arr[1] eq "Jan")
        {
            $temp_arr[1] = "01"
        }
        if ($temp_arr[1] eq "Feb")
        {
            $temp_arr[1] = "02"
        }
        if ($temp_arr[1] eq "Mar")
        {
            $temp_arr[1] = "03"
        }
        if ($temp_arr[1] eq "Apr")
        {
            $temp_arr[1] = "04"
        }
        if ($temp_arr[1] eq "May")
        {
            $temp_arr[1] = "05"
        }
        if ($temp_arr[1] eq "Jun")
        {
            $temp_arr[1] = "06"
        }
        if ($temp_arr[1] eq "Jul")
        {
            $temp_arr[1] = "07"
        }
        if ($temp_arr[1] eq "Aug")
        {
            $temp_arr[1] = "08"
        }
        if ($temp_arr[1] eq "Sep")
        {
            $temp_arr[1] = "09"
        }
        if ($temp_arr[1] eq "Oct")
        {
            $temp_arr[1] = "10"
        }
        if ($temp_arr[1] eq "Nov")
        {
            $temp_arr[1] = "11"
        }
        if ($temp_arr[1] eq "Dec")
        {
            $temp_arr[1] = "12"
        }

        $temp_splited_line = "$temp_arr[4]-$temp_arr[1]-$temp_arr[2] $temp_arr[3] $temp_arr[10] $temp_arr[12]";
        my @splited_line = $temp_splited_line;

        #my @temp_array = split(' ', $line)

        $temp_arr[3] $temp_arr[10] $temp_arr[12];

        #2017-07-13 21:34:30 SG_PICK_BOL 5.428
        #$slow_trans_line = "$word5-$word2-$word3 $word4 $word11 $word13";
        #print "$slow_trans_line\n";
    }
}

print "$splited_line[0]\n";

Мне нужна строка, а не слово в выводезначение print "$ splited_line [0] \ n";.

1 Ответ

0 голосов
/ 30 ноября 2018

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

Во-первых, массив, в котором вы хотите разместить все измененные строки, равен @splited_line.Вот почему вы пытаетесь напечатать первую строку в конце вашей программы:

print "$splited_line[0]\n";

Одна из ваших проблем заключается в том, что вы объявляете массив @splited_line внутри цикла, используя my.Это означает, что его значение является локальным для цикла, и вы не можете получить к нему доступ из-за пределов цикла, например конца вашей программы.( Вот что-то , чтобы объяснить область видимости переменной, если вам это нужно.)

Поэтому я собираюсь добавить новую строку, чтобы объявить область действия @splited_line вне этого цикла.Это означает, что цикл может добавлять элементы в массив, и вы можете видеть эти элементы вне цикла.

Далее я изменил цикл так, что когда он строит измененную строку, он добавляет это кконец этого массива.Каждый раз, когда вы обходите цикл, вы обрабатываете следующую строку ввода и добавляете строку к @splited_line.Я использовал push, чтобы добавить новую строку в конец массива:

push @splited_line, $temp_splited_line;

Вы ничего не сказали нам о своем входном файле file.log, поэтому я его составилкоторый выглядит так:

Thu Nov 29 d 2018 f g h i j k l 12.345
Fri Nov 30 d 2018 f g h i j k l 23.456

И это почти все.Вот код, только слегка измененный:

#!/usr/bin/perl

use DBI;
use Data::Dumper;
#use DBD::mysql;
use POSIX;

use strict; use warnings;

#"titi.log" or die $!;

open(FILE,"<file.log");

print "file loaded \n";

my @lines=<FILE>;

#tout les valeurs du fichier se trouve dans le tableau lines

close(FILE);

my @temp_arr;
my @splited_line;


foreach my $line(@lines)
{
    @temp_arr=split('\s',$line);
    #converti en nombre
    $temp_arr[12] =~ s/[^\d.]//g;
    #converti en entier
    $temp_arr[12] = floor($temp_arr[12]);

    #enlève les simple cote
    $temp_arr[10] =~ s/^'|'$//g;

    if ($temp_arr[12] > 5)
    {
        if ($temp_arr[1] eq "Jan") { $temp_arr[1] = "01" }
        if ($temp_arr[1] eq "Feb") { $temp_arr[1] = "02" }
        if ($temp_arr[1] eq "Mar") { $temp_arr[1] = "03" }
        if ($temp_arr[1] eq "Apr") { $temp_arr[1] = "04" }
        if ($temp_arr[1] eq "May") { $temp_arr[1] = "05" }
        if ($temp_arr[1] eq "Jun") { $temp_arr[1] = "06" }
        if ($temp_arr[1] eq "Jul") { $temp_arr[1] = "07" }
        if ($temp_arr[1] eq "Aug") { $temp_arr[1] = "08" }
        if ($temp_arr[1] eq "Sep") { $temp_arr[1] = "09" }
        if ($temp_arr[1] eq "Oct") { $temp_arr[1] = "10" }
        if ($temp_arr[1] eq "Nov") { $temp_arr[1] = "11" }
        if ($temp_arr[1] eq "Dec") { $temp_arr[1] = "12" }

        my $temp_splited_line = "$temp_arr[4]-$temp_arr[1]-$temp_arr[2] $temp_arr[3] $temp_arr[10] $temp_arr[12]";
        push @splited_line, $temp_splited_line;

        #my @temp_array = split(' ', $line)

#       $temp_arr[3] $temp_arr[10] $temp_arr[12];

        #2017-07-13 21:34:30 SG_PICK_BOL 5.428
        #$slow_trans_line = "$word5-$word2-$word3 $word4 $word11 $word13";
        #print "$slow_trans_line\n";
    }
}

print "$splited_line[0]\n";
print "$splited_line[1]\n";

Вы увидите, что я добавил еще одну строку для печати второй обработанной строки:

print "$splited_line[1]\n";

Когда я запускаю программу,результат выглядит следующим образом:

file loaded 
2018-11-29 d k 12
2018-11-30 d k 23

Есть еще несколько вещей, которые можно изменить, но это должно вернуть вас в нужное русло.

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