Как читать строки из файла и разбивать их на разные массивы?
Я борюсь с этой частью для моего упражнения в колледже... Мне нужно прочитать строку из файла и поместить их в другую переменную... Команда, пожалуйста, просмотрите и, пожалуйста, ответьте в свободное время...
Входной файл: (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);
затем:
- Вы получаете только количество элементов назначенного массива.
- Вы уничтожаете свой
$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";