2012-07-25 2 views
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. 
+3

'warnings'을 사용하면 perl은'exec()'가 실행 된 후에 아무것도 경고하지 않습니다. (* "성명서에 도달 할 것 같지 않습니다 ...") *) – pilcrow

답변

6

표시되는 출력은 print 문에서 가져온 것이 아니며, 콘솔 출력은 ls입니다. 변수에 ls 출력을 얻으려면, 역 따옴표를 사용

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

exec는 반환하지 않기 때문에, 그 후 문이 실행되지 않습니다이다. perldoc :

exec 함수는 시스템 명령을 실행하고 반환하지 않습니다. 반환하려는 경우 exec 대신 시스템을 사용하십시오. 그것은 실패하고 명령이 존재하지 않는 경우에만 false를 반환하고 직접 대신 시스템의 명령 쉘

를 통해 실행되지만이 때문에, 출력 캡처를 허용하지 않기 때문에 도움이되지 않습니다 system 명령을 사용하여, 백틱. 그러나 glob 기능을 사용하는 것이 더 좋다 :

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

는 또한, 펄 배열 인덱스는 print "$lsarray[0]\n"를 사용해야합니다 file1.pl 얻으려면, 0에 있지 1. 시작

.

+0

와우, 고마워. 그것은 완벽. – opmeitle

3

Perl 내에서 무언가를 쓸 수있을 때 셸을 사용하는 것은 나쁜 습관입니다.

이 프로그램은 내가 원하는 것으로 표시합니다.

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

편집

난 그냥 당신이 perreal의 게시물에서 필요한 것을 더 잘 이해했다.

print((glob '*')[0], "\n"); 
+0

감사합니다 Borodin, 내 문제를 해결할 수있는 대답. – opmeitle

0
print <*> // die("No file found\n"), "\n"; 

쓰기, 현재 작업 디렉토리에서 첫 번째 파일을 표시하려면 (스크립트가 더 아무것도 될 경우 스칼라 문맥에서 반복자를 사용하는 것은 일반적으로 피해야한다지만.)