Похоже, что одним из источников путаницы является извлечение элемента из массива. Массив равен нулю или больше скалярных элементов - вы не можете просто назначить его другому, потому что ... ну, что должно произойти, если есть не один элемент (это обычный случай).
Учитывая массив, мы можем:
pop @array
возвращает последний элемент (и удалить его из массива), чтобы вы могли my $result = pop @array;
[0]
является первым элементом массива, поэтому мы можем my $result = $array[0];
- Или мы можем назначить один массив другому:
my ($result) = @array;
- потому что с левой стороны у нас есть массив, и это единственный элемент - первый элемент @array
переходит в $result
. (Остальное не используется в этом сценарии - но вы могли бы сделать my ($result, @anything_else) = @array;
Таким образом, в вашем примере - если то, что вы пытаетесь сделать, это получить значение, соответствующее критерия - нормальный инструмент для работы будет быть grep
- который фильтрует массив путем применения условного теста к каждому элементу
Итак:.
#!/usr/bin/env perl
use strict;
use warnings;
my @lines = grep { (split /,/)[2] eq "12:00:00" } <DATA>;
print "@lines";
print $lines[0];
__DATA__
1,2015-08-20,00:00:00,89,1007.48,295.551,296.66,
2,2015-08-20,03:00:00,85,1006.49,295.947,296.99,
3,2015-08-20,06:00:00,86,1006.05,295.05,296.02,
4,2015-08-20,09:00:00,85,1005.87,296.026,296.93,
5,2015-08-20,12:00:00,77,1004.96,298.034,298.87
Что мы можем свести к:
my ($firstresult) = grep { (split /,/)[2] eq "12:00:00" } <DATA>;
print $firstresult;
Но поскольку мы хотим преобразовать наш массив - map
- это инструмент для работы.
my ($result) = map { (split /,/)[6] - 273.15 } grep { (split /,/)[2] eq "12:00:00" } <DATA>;
print $result;
Сначала:
- использование Grep для извлечения совпадающих элементов. (один в этом случае, но необязательно должен быть!)
- используйте карту, чтобы преобразовать список, чтобы мы превратили каждый элемент в его 6-е поле и вычитали 273,15
- присвоить всю сумму список, содержащий один элемент - фактически только первый результат и отбрасывание остальных.
Или, может быть:
#!/usr/bin/env perl
use strict;
use warnings;
my ($result) = map {
(split /,/)[2] eq "12:00:00"
? (split /,/)[6] - 273.15
:()
} <DATA>;
print $result;
Но лично я думаю, что это становится немного сложнее и может быть трудно понять. map
- это мощная функция, но может привести к тому, что код, который трудно прочитать для будущих программистов по обслуживанию.
Так что я хотел бы предложить вместо:
my $result;
while (<DATA>) {
my @fields = split /,/;
if ($fields[2] eq "12:00:00") {
$result = $fields[6] - 273.15;
last;
}
}
print $result;
итерацию данные, сплит - и тест - каждая строка, и когда вы найдете тот, который соответствует критериям - установить $result
и выручать из цикла.
Ваш пример кода сравнивает столбец с символом «9: 00: 00' - отсутствует недостающий начальный ноль в вашей паре или вашем коде? –
typo - выше работает, но проблема остается в виде массива – BrianB
Не используйте 'map', если вы хотите' grep'. –