6

コードのブロックを1行にまとめようとしています。リスト内のアイテムの数を取得する方法が必要です。私のコードは現在次のようになっています:

# 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');

それは素晴らしいことですが、私はその1行を次のように作成したいと思います。

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

スプライス関数を使用して配列を操作(最後のn個の要素を削除するなど)できますが、負のインデックスを使用して配列のスライスを生成することもできます(-1は最後の要素、-2は最後から2番目の要素を意味します。など):例えば@list = @arr[0 .. -4]、合法です。

ただし、必要なのがlibディレクトリの場所である場合は、これらのリストを操作する多くのバク転を経験しているようです。perl実行可能ファイルに-I引数を指定するか、$ 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);
于 2010-05-10T00:15:26.917 に答える