2017-03-04 1 views
-4

저는 스크립팅 언어가 새롭고 erl의 명령 줄에서 주어진 인수에서 이름을 추출해야한다는 작업이 있습니다.Perl 스크립트의 명령 줄에서 인수로 주어진 이름 추출하기

내가이

./perl.plx file.txt 

같은 펄 스크립트를 호출하고 있는데이 파일의 이름을 얻으려면 해당 file 이름이 아닌 전체 file.txt

+1

'@ ARGV'를 살펴 보시고, 파라메터가있는 배열입니다. 안에 있어요. – AntonH

+0

네,하지만 $ ARGV [0]을 사용하면 ** file.txt **가 반환됩니다. 문자열 형식이 아니므로 구분 기호로 구분 기호를 사용할 수 없습니다. 그래서 말했듯이, 그것은 ** file.txt ** 전체를 제공하고 ** 파일 **의 이름 만 필요합니다. –

+1

'@ ARGV'는 문자열 만 포함합니다. 그것은 당신이 그들과 함께하는 일입니다. 그래서 만약 당신이'$ ARGV [0]'과'file.txt'를 가지고 있다면, 그 문자열'my $ name = (split /\./, $ ARGV [0]) [0];' $ name'은 "file"을 포함합니다. – AntonH

답변

0

을 얻을 필요가, 당신은 그것을 추출해야 @ARGV에서 가져 와서 점에서 분할하십시오.

my $fileName = (split /\./, $ARGV[0])[0]; 

가 Explaination : "."점 (문자는 의미, '모든 문자'정규 표현식의 특수 문자에

split /\./, $ARGV[0] 분할은, 문자 그대로 그것을 가지고, 당신이 그것을 탈출해야합니다, 따라서).

(...)[0];은 첫 번째 요소, 즉 파일 이름을 취합니다.

+0

File :: Basename보다'split()'을 사용하는 이유는 무엇입니까? –

+0

@DaveCross OP의 특정 사용 사례에 신속하게 응답했기 때문에 (정확한 질문을 이해하는 데 이미 시간이 걸렸습니다. 내 질문에서 볼 수 있듯이). 솔직히 말해서, 파일 이름을 거의 조작하지 않아서'File ::'을 잊어 버리는 경향이 있습니다. – AntonH

5

Perl 스크립트에 대한 명령 줄 인수는 perldoc perlvar에 설명 된 @ARGV에 나타납니다.

파싱 파일 이름은 사소한 것처럼 보이지만 모양이 잘못 될 수 있습니다. 그러나 Perl에는 File::Basename이라는 모듈이 있습니다.이 모듈은 즉시 고려하지 않을 수있는 가장자리 사례를 처리합니다. 단순한 split이 처리하지 못하는 한 모서리의 경우는 최종 접미어를 제외하고 파일 이름의 다른 곳에 도트가 나타날 가능성이 있습니다.

명령 프롬프트에서 perldoc File::Basename을 입력하여 File::Basename의 설명서를 검토 할 수 있습니다.

use stict; 
use warnings; 
use File::Basename qw(fileparse); 

my ($fname, $dirs, $suffix) = fileparse($ARGV[0], qr/\.txt/); 

print "Base file name is $fname\n"; 
print "Suffix is $suffix\n"; 
print "Path to $fname$suffix is $dirs\n"; 

펄이 모듈 선박, 당신은 그것을 사용하는 아무것도 설치할 필요가 없기 때문에 다음은

은 예입니다. 모든 Perl 배포판과 함께 제공되는 핵심 Perl 모듈을 활용하면 이러한 도구 내에서 구현 된 모범 사례와 디버깅을 활용할 수 있습니다.

+0

감사합니다. 내가 말했듯이 필자는'perl '에 익숙하지 않으며, 특히 커맨드 라인 인수와 같은 것들에 익숙하다. 그러나이 덕분에 많은 도움이되었습니다. –

관련 문제