Ну, на самом деле, это то, как вы могли бы сделать это в perl :
# two must-have pragmas for perl development
use strict;
use warnings;
Perl позволяет создавать переменные по мере их использования, $feldman = some_function()
означает, что теперь у вас есть переменная $feldman
в вашем локальном пространстве имен. Но самое плохое в этом то, что вы можете набрать $fldman
и потратить много времени на выяснение того, почему то, что вы считали $feldman
, не имеет значения. Включение strictures означает, что ваш код не сможет скомпилироваться, если он обнаружит необъявленную переменную. Вы объявляете переменную с помощью оператора my
или our
(или в более старом коде Perl оператор use vars
.
Включение warnings
просто предупреждает вас, когда вы не получаете ожидаемые значения. Часто предупреждения, как правило, слишком обидчивы, но они обычно - хорошая вещь для разработки кода с помощью.
my %hash; # the base object for the data
Здесь я объявил хеш-переменную, которую я творчески назвал %hash
. Символ (произносится как "sijil") "%" говорит о том, что это карта пар имя-значение. Эта my
инструкция объявила переменную и делает ее допустимой для компилятора. Компилятор предупредит меня о любом использовании %hsh
.
Следующим элементом является цикл foreach
(который может быть сокращен до «для»). Цикл обработает список строк в @tmp_cycledef
, присваивая каждую по очереди $row
. ( my $row
).
- Мы
chomp
первой строки, удаляя символ конца строки для этой платформы.
- Мы
split
строки на '|' персонаж, создавая список строк, которые были разделены конвейером.
- А потом мы храним его в двухслойном хеше. Так как мы хотим сгруппировать их хотя бы по первому номеру. Мы можем сделать это с помощью массива и создать массив в месте в хэше, например:
push @{$hash{$key}}, $val
, но я обычно хочу свернуть дубликаты (не то, чтобы в вашем образце были дубликаты).
Здесь:
foreach my $row ( @tmp_cycledef ) {
chomp $row; # removes the end-of-line character when present.
my ( $key, $val ) = split /\|/, $row;
# One of the best ways to merge lists is a presence-of idea
# with the hash holding whether the value is present
$hash{$key}{$val} = 1;
}
Как только у нас есть данные в структуре, нам нужно повторить оба уровня хеша keys
. Вы хотели разделить числа «верхнего уровня» по строкам, но вы хотели, чтобы вторые числа были соединены в одной строке. Таким образом, мы печатаем строку для каждого из первых чисел и join
список строк, сохраненных для каждого числа в одной строке, разделенных запятыми. Мы также сортируем список: { $a <=> $b }
просто берет ключи и численно сравнивает их. Таким образом, вы получаете числовой заказ.
# If they were alpha keys our sort routine, we would just likely say sort keys %hash
foreach my $num ( sort { $a <=> $b } keys %hash ) {
my $h = $hash{$num};
print "$num ", join( ',', sort { $a <=> $b } keys %$h ), "\n";
}
Как я уже говорил в комментариях, sort
по умолчанию сортирует по порядку символов, поэтому вы можете просто сказать sort keys %hash
.
Чтобы помочь вам, вам действительно нужно прочитать некоторые из них: