6

我正在尝试将一段代码简化为一行。我需要一种方法来获取列表中的项目数。我的代码目前如下所示:

# 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:合并它的原因是它会在一堆附属于主应用程序的 perl 脚本的标题中,我希望这个小咒语更能被剪切和粘贴证明。

感谢大家

匿名列表中的元素数量似乎没有简写。这似乎是一个疏忽。然而,建议的替代方案都很好。

我要去:

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

但 Ether 提出了以下建议,更正确和便携:

my $lib = File::Spec->catfile(
                realpath(File::Spec->catfile($FindBin::Bin, ('..') x 4)),
               'lib');
lib->import($lib);
4

3 回答 3

3
lib->import(join('/', splice(@{[split('/', $bin)]}, 0, -4)).'/lib');
于 2010-05-10T00:18:47.120 回答
2

检查拼接功能。

于 2010-05-10T00:03:47.867 回答
1

您可以使用splice函数操作数组(例如删除最后 n 个元素),但您也可以使用负索引生成数组的切片(其中 -1 表示最后一个元素,-2 表示倒数第二个,等):例如@list = @arr[0 .. -4]是合法的。

但是,当您似乎想要的是 lib 目录的位置时,您似乎正在经历很多操作这些列表的后空翻。为 perl 可执行文件提供 -I 参数,或者使用$FindBin::BinFile::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);
于 2010-05-10T00:15:26.917 回答