Я пытаюсь свалить блок кода к одной строке. Мне нужен способ получить количество объектов в списке. Мой код в настоящее время похож на это:
# 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);
lib->import(join('/', splice(@{[split('/', $bin)]}, 0, -4)).'/lib');
Вы можете манипулировать массивом (например, удалять последние 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);