2

私の名前はルイスです。argに住んでいます。解決できない問題があります。

**IN BASH**
pwd
/home/labs-perl
ls
file1.pl file2.pl

**IN PERL**
my $ls = exec("ls");
my @lsarray = split(/\s+/, $ls);
print "$lsarray[1]\n"; #how this, i need the solution. >> file.pl
file1.pl file2.pl # but this is see in shell.
4

3 に答える 3

6

表示される出力は、printステートメントからのものではなく、のコンソール出力ですls。出力をls変数にするには、バッククォートを使用します。

my $ls = `ls`;
my @lsarray = split(/\s+/, $ls);
print "$lsarray[1]\n";

これは、execが返されないため、それ以降のステートメントは実行されないためです。perldocから:

exec関数はシステムコマンドを実行し、戻ることはありません。戻りたい場合は、execの代わりにsystemを使用してください。コマンドが存在せず、システムのコマンドシェルを介さずに直接実行された場合にのみ、失敗してfalseを返します。

ただし、systemコマンドを使用すると、出力キャプチャ、つまりバックティックが許可されないため、役に立ちません。ただし、glob関数を使用する方が適切です。

my @arr = glob("*");
print $arr[1], "\n";

また、perl配列インデックスは1ではなく0から始まります。file1.plを取得するには、を使用する必要がありますprint "$lsarray[0]\n"

于 2012-07-25T04:14:14.333 に答える
3

Perl 内で何かを記述できるときにシェルを使用するのは悪い習慣です。

このプログラムは、私があなたが望むと思うものを表示します。

chdir '/home/labs-perl' or die $!;
my @dir = glob '*';
print "@dir\n";

編集

perreal の投稿から、必要なものがよくわかりました。

現在の作業ディレクトリの最初のファイルを表示するには、次のように記述します

print((glob '*')[0], "\n");
于 2012-07-25T04:17:22.557 に答える
0
print <*> // die("No file found\n"), "\n";

(ただし、スクリプトがさらに何かを行う場合は、スカラー コンテキストでイテレータを使用することは通常避けるべきです。)

于 2012-07-25T04:53:43.857 に答える