저는 스크립팅 언어가 새롭고 erl의 명령 줄에서 주어진 인수에서 이름을 추출해야한다는 작업이 있습니다.Perl 스크립트의 명령 줄에서 인수로 주어진 이름 추출하기
내가이
./perl.plx file.txt
같은 펄 스크립트를 호출하고 있는데이 파일의 이름을 얻으려면 해당 file
이름이 아닌 전체 file.txt
저는 스크립팅 언어가 새롭고 erl의 명령 줄에서 주어진 인수에서 이름을 추출해야한다는 작업이 있습니다.Perl 스크립트의 명령 줄에서 인수로 주어진 이름 추출하기
내가이
./perl.plx file.txt
같은 펄 스크립트를 호출하고 있는데이 파일의 이름을 얻으려면 해당 file
이름이 아닌 전체 file.txt
을 얻을 필요가, 당신은 그것을 추출해야 @ARGV
에서 가져 와서 점에서 분할하십시오.
my $fileName = (split /\./, $ARGV[0])[0];
가 Explaination : "."점 (문자는 의미, '모든 문자'정규 표현식의 특수 문자에
split /\./, $ARGV[0]
분할은, 문자 그대로 그것을 가지고, 당신이 그것을 탈출해야합니다, 따라서).
(...)[0];
은 첫 번째 요소, 즉 파일 이름을 취합니다.
File :: Basename보다'split()'을 사용하는 이유는 무엇입니까? –
@DaveCross OP의 특정 사용 사례에 신속하게 응답했기 때문에 (정확한 질문을 이해하는 데 이미 시간이 걸렸습니다. 내 질문에서 볼 수 있듯이). 솔직히 말해서, 파일 이름을 거의 조작하지 않아서'File ::'을 잊어 버리는 경향이 있습니다. – AntonH
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 모듈을 활용하면 이러한 도구 내에서 구현 된 모범 사례와 디버깅을 활용할 수 있습니다.감사합니다. 내가 말했듯이 필자는'perl '에 익숙하지 않으며, 특히 커맨드 라인 인수와 같은 것들에 익숙하다. 그러나이 덕분에 많은 도움이되었습니다. –
'@ ARGV'를 살펴 보시고, 파라메터가있는 배열입니다. 안에 있어요. – AntonH
네,하지만 $ ARGV [0]을 사용하면 ** file.txt **가 반환됩니다. 문자열 형식이 아니므로 구분 기호로 구분 기호를 사용할 수 없습니다. 그래서 말했듯이, 그것은 ** file.txt ** 전체를 제공하고 ** 파일 **의 이름 만 필요합니다. –
'@ ARGV'는 문자열 만 포함합니다. 그것은 당신이 그들과 함께하는 일입니다. 그래서 만약 당신이'$ ARGV [0]'과'file.txt'를 가지고 있다면, 그 문자열'my $ name = (split /\./, $ ARGV [0]) [0];' $ name'은 "file"을 포함합니다. – AntonH