Как читать строки из файла и разбивать их на разные массивы?

Я борюсь с этой частью для моего упражнения в колледже... Мне нужно прочитать строку из файла и поместить их в другую переменную... Команда, пожалуйста, просмотрите и, пожалуйста, ответьте в свободное время...

Входной файл: (test_ts.txt)

Test1--12:45
Test2--1:30

Автор сценария:

use strict;
use warnings;

my $filename = "test_ts.txt";
my @name = ();
my @hrs=();
my @mins=();

open(my $fh, $filename)
  or die "Could not open file '$filename' $!";

while (my $row = <$fh>) {
  chomp $row;
  push(@name, $row);
  print "$row\n";
}

Выход:

Test1--12:45
Test2--1:30

Ожидаемый результат:

Test1
Test2

*(Array should have the below values
name[0]=Test1
name[1]=Test2
hrs[0]=12
hrs[1]=1
mins[0]=45
mins[1]=30)*

Пробовал с помощью Split:

while (my $row = <$fh>) {
  chomp $row;
  $row=split('--',$row);
  print $row;
  $row=split(':',$row);
  print $row;
  push(@name, $row);
  print "$row\n";
}

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

211
211

3 ответа

Решение

split возвращает список; когда вы используете его в скалярном контексте, как $row = split(..., $row); затем:

  1. Вы получаете только количество элементов назначенного массива.
  2. Вы уничтожаете свой $row на входе.

Вам нужно что-то более похожее на:

while (my $row = <$fh>)
{
    chomp $row;
    my @bits = split /[-:]+/, $row;
    print "@bits\n";
    push(@name, $bits[0]);
    …other pushes…
    print "$row\n";
}

Рано или поздно вам нужно будет узнать о скалярном контексте и контексте массива. А пока присваиваем результат split в массив.

Иногда проще использовать глобальное регулярное выражение, чем split, Эта короткая программа работает, находя все буквенно-цифровые поля в целевой строке.

use strict;
use warnings;
use autodie;

open my $fh, '<', 'test_ts.txt';

my (@name, @hrs, @mins);

while (<$fh>) {
  my ($name, $hrs, $mins) = /\w+/g;
  push @name, $name;
  push @hrs, $hrs;
  push @mins, $mins;
  print "$name\n";
}

print "\n";

print "Names:   @name\n";
print "Hours:   @hrs\n";
print "Minutes: @mins\n";

выход

Test1
Test2

Names:   Test1 Test2
Hours:   12 1
Minutes: 45 30

Вот простой способ разбить строку на основе "-", а затем время на основе ":". Надеюсь, это поможет вам.

use strict;
use warnings;

my $filename = "test_ts.pl";
my @name = ();
my @hrs=();
my @mins=();

open(my $fh, $filename)
or die "Could not open file '$filename' $!";

while (my $row = <$fh>) {
chomp $row;
my ($a,$b) = split("--", $row);
my ($c, $d) = split (":", $b);
push(@name, $a);
push(@hrs, $c);
push(@mins, $d);
}
print "$name[0]\n";
print "$name[1]\n";
print "$hrs[0]\n";

print "$hrs[1]\n";
print "$mins[0]\n";
print "$mins[1]\n";
Другие вопросы по тегам