Perl - Как получить число элементов в анонимном массиве, для того, чтобы кратко обрезать пути

Я пытаюсь свалить блок кода к одной строке. Мне нужен способ получить количество объектов в списке. Мой код в настоящее время похож на это:

# Include the lib directory several levels up from this directory
my @ary = split('/', $Bin);
my @ary = @ary[0 .. $#ary-4];
my $res = join '/',@ary;
lib->import($res.'/lib');

Это является большим, но я хотел бы сделать ту одну строку, что-то вроде этого:

lib->import( join('/', ((split('/', $Bin)) [0 .. $#ary-4]))  );

Но конечно синтаксис $#ary бессмысленно в вышеупомянутой строке.

Там эквивалентный путь состоит в том, чтобы получить число элементов в анонимном списке?

Спасибо!

PS: причина консолидации этого состоит в том, что это будет в заголовке набора сценариев жемчуга, которые являются вспомогательными для главного приложения, и я хочу, чтобы это небольшое колдовство было более сокращено и доказательство вставки.

Спасибо все

Кажется, нет сокращения от числа элементов в анонимном списке. Это походит на контроль. Однако предложенные альтернативы были всей пользой.

Я иду с:

lib->import(join('/', splice( @{[split('/', $Bin)]}, 0, -4)).'/lib');

Но Эфир предложил следующее, которое является намного более корректным и портативным:

my $lib = File::Spec->catfile(
                realpath(File::Spec->catfile($FindBin::Bin, ('..') x 4)),
               'lib');
lib->import($lib);
6
задан NXT 10 May 2010 в 00:51
поделиться

3 ответа

lib->import(join('/', splice(@{[split('/', $bin)]}, 0, -4)).'/lib');
3
ответ дан 17 December 2019 в 02:25
поделиться

Проверьте функцию splice.

2
ответ дан 17 December 2019 в 02:25
поделиться

Вы можете манипулировать массивом (например, удалять последние n элементов) с помощью функции splice, но вы также можете генерировать фрагмент массива, используя отрицательный индекс (где -1 означает последний элемент, -2 - предпоследний и т.д.): например, @list = @arr[0 ... -4] является законным.

Однако, вы, кажется, делаете много сальто назад, манипулируя этими списками, когда, похоже, вам нужно только расположение каталога lib. Не проще ли указать аргумент -I в исполняемом файле perl или использовать $FindBin::Bin и File::Spec->catfile для определения местоположения каталога относительно местоположения скрипта?

use strict;
use warnings;

use Cwd 'realpath';
use File::Spec;
use FindBin;

# get current bin
# go 4 dirs up,
# canonicalize it,
# add /lib to the end
# and then "use" it

my $lib = File::Spec->catfile(
                realpath(File::Spec->catfile($FindBin::Bin, ('..') x 4)),
               'lib');
lib->import($lib);
1
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: