Это не распаковка, но, поскольку у вас есть группы из 4 символов, вы можете использовать ограниченный сплит с захватом:
my ($dir, $name, file, $ext) = grep length, split /(....)/, $filename, 4;
Это довольно запутанно, так что я, вероятно, не буду его использовать, но захват в сплите - часто пропускаемая способность.
Итак, вот объяснение того, что делает этот код:
Шаг 1. split
с захватом скобок добавляет значения, захваченные шаблоном, в его выходной поток. Поток содержит смесь полей и разделителей.
qw( a 1 b 2 c 3 ) == split /(\d)/, 'a1b2c3';
Шаг 2. split
с 3 аргументами ограничивает, сколько раз строка разбивается.
qw( a b2c3 ) == split /\d/, 'a1b2c3', 2;
Шаг 3. Теперь, когда мы используем шаблон разделителя, который почти соответствует чему угодно /(....)/
, мы получаем кучу пустых (длиной 0) строк. Я пометил разделители D
символами, а поля F
:
( '', 'a', '', '1', '', 'b', '', '2' ) == split /(.)/, 'a1b2';
F D F D F D F D
Шаг 4. Итак, если мы ограничим количество полей до 3, мы получим:
( '', 'a', '', '1', 'b2' ) == split /(.)/, 'a1b2', 3;
F D F D F
Шаг 5. Собрав все это вместе, мы можем сделать это (я использовал расширение .jpeg
, чтобы расширение было длиннее 4 символов):
( '', 1000, '', 2000, '', 3000, '.jpeg' ) = split /(....)/, '100020003000.jpeg',4;
F D F D F D F
Шаг 6. Шаг 5 почти идеален, все, что нам нужно сделать, это удалить пустые строки, и мы в порядке:
(1000, 2000, 3000, '.jpeg') = длина grep, split /(....)/, '100020003000.jpeg', 4;
Этот код работает, и это интересно. Но это не более компактно, чем любое другое решение. Я не тестировал, но был бы очень удивлен, если бы он выиграл какие-либо призы за скорость или эффективность памяти.
Но настоящая проблема в том, что слишком сложно быть хорошим для реального кода. Использование split
для захвата разделителей (и, может быть, одного последнего поля), в то время как выбрасывание данных поля просто слишком странно. Это также хрупко: если одно поле меняет длину, код нарушается и должен быть переписан.
Итак, на самом деле этого не делают.
По крайней мере, это дало возможность изучить некоторые менее известные особенности split
.