귀하의 예제는 실제로 데이터베이스가 작동하는 방식이 아닙니다. 이것은 가변 길이 레코드의 단순한 파일입니다. 조회를 더 효율적으로하고 싶다면 레코드 길이가 고정되어 있거나 별도의 인덱스 오프셋 인덱스를 유지해야합니다. 그러나 그것은 당신의 질문에 대답 할 수있는 범위를 벗어납니다.
myscript ACTION_NAME FILENAME CONTENT [CONTENT [...]]
을 스크립트 안에는 @ARGV
배열에 표시되는 명령 줄에 전달 된 필드 :
은 다음과 같이 스크립트의 실행 의미가있는 것으로 보인다.
아래의 솔루션에서 나는 결국 Create_table
을 제외한 다른 작업을 수행 할 수 있다는 가정하에 작업하므로 확장 성을 허용하기위한 노력이 기울여졌습니다. 간단한 가정은 이러한 동작이 어떤 식 으로든 @ARGV
에 전달 된 매개 변수에서 작동한다는 것입니다. 적어도 Create_table
의 경우입니다. @ARGV
의 내부에서 우리는 다음과 같은 찾을 수 있도록 : 우리가 필요로하는 그런
my %actions = (Create_table => sub {...}, ...);
액션을 이동하는 것입니다 :
@ARGV = ($action, $filename, @fields);
을 그래서 우리는 먼저 다양한 작업을 처리 할 수있는 디스패치 테이블을 설정
if (exists $actions{$action}) {
$actions{$action}->(@ARGV);
}
else {
die "Unknown action: $action. Choose one of:\n\t",
join("\n\t", keys %actions),
"\n";
}
01 :
my $action = shift @ARGV;
그리고 다음 우리는 파견을 적용해야
@ARGV
의 나머지 요소는 Create_table
액션과 관련된 익명 하위 항목으로 전달하거나 일치하는 작업을 찾을 수없는 경우 죽게됩니다.
이제 우리는 액션의 서브 루틴 내부에서 일어날 필요가있는 것을 살펴 봐야합니다.
($filename, $tablename, @content)
그래서 우리가 그 인수를 잡아 : 우리가
@ARGV
에서 온에서 통과 될 요소는
my ($fname, $tname, @content) = @_;
그런 다음 우리는 추가 모드에서 출력 파일을 열어야합니다. 추가 모드는
'>>'
지정을 사용하여 지정 : 마지막 비트는 몇 가지 오류 처리가
open my $out_fh, '>>', $fname
or die "Error opening $fname for append: $!\n";
그건 : 파일이 우리가 쉽게 스크립트에서이 시점에서에서 복구 할 수없는 예외적 인 상태에 도달 한 열 수없는 경우, 그래서 우리는 예외 (die)를 던지고 STDERR에 보내진 적절한 메시지와 함께 나간다.
다음으로 출력 파일에 텍스트를 추가합니다. ' | '
와 함께, 각 "단어"에 가입하여 먼저 우리는 테이블 이름을 추가 한 다음 우리는 (이 시점에서 @content
) @ARGV
에서 나머지 항목을 인쇄 :
print $out_fh "$tname\n", join(' | ', @content), "\n";
마지막으로 우리가 그것을 만들기 위해 명시 적으로 파일 핸들을 닫습니다 감지 가능한 오류 : 당신은 몇 번 지금
$!
을 발견했을 수
close $out_fh or die "Error writing to $fname: $!\n";
. Perl에서 시스템 호출 (예 : open
, close
및 기타 많은 경우)이 실패하면 특수 변수 $!
에 문자열 컨텍스트에 오류 메시지가 포함되므로 오류 출력에 추가하면 호출자에게 진단 정보가 제공됩니다. 모든 퍼팅
는
함께 우리는이를 얻을 :
#!/usr/bin/env perl
use strict;
use warnings;
my %actions = (
Create_table => sub {
my ($fname, $tname, @content) = @_;
open my $out_fh, '>>', $fname
or die "Could not complete action Create_table - Failed to open $fname for append: $!\n";
print $out_fh "$tname\n", join(' | ', @content), "\n";
close $out_fh or die "Error writing to $fname: $!\n";
},
);
my $action = shift @ARGV;
if (exists $actions{$action}) {
$actions{$action}->(@ARGV);
}
else {
die "Unknown action: $action\n";
}
추가 작업 처리를 쉽게 %actions
해시에 더 ACTION_NAME => sub {...},
요소를 채워 추가 할 수 있습니다.
명령 줄 처리가 더 정교해야 할 경우 Perl과 함께 제공되는 Getopt::Long
을 참조하십시오. 이 예제 코드를 참조에 사용되는 구조를 설명하는 추가 문서
:
perldoc perlintro
: 펄에 대한 간단한 소개.
perldoc perlopentut
, perldoc -f open
, perldoc -f close
: 파일 처리.
perldoc perlvar
: $!
및 @ARGV
에 대한 설명입니다.
perldoc -f join
perldoc -f die
: 오류 처리.
perldoc perldata
: 해시 설명.
perldoc perlreftut
다음 if(){}
구문 설명 : (subrefs 포함) 참조
perldoc perlsyn
의 설명.
perldoc perlsub
: 서브 루틴, 매개 변수 전달 및 익명 하위의 설명.
펄의 문서는 명령 줄로 볼 수 있습니다 : 개별 함수 또는 서브 루틴보다는 더 넓은 범위의 문서를 지정하는 데 사용됩니다 -f
perldoc [-f] DOCUMENT_NAME
.
Perl을 처음 사용하는 경우, perldoc perlintro
으로 시작하여 거기에서 빌드하십시오.
$ ARGV [1] .txt \ n $ ARGV [3] | $ ARGV [4] \ n "; ' – PerlDuck
죄송합니다. 파일에 기록 될 것입니다. . @PerlDuck –
질문은 "어떻게 추가 할 파일을 열 수 있습니까?"_ – PerlDuck