2017-12-02 13 views
-3

데이터베이스처럼 작동합니다.펄에 추가 할 파일을 어떻게 열 수 있습니까?

내가 원하는 예는 다음

입력 :% perl youscript.pl Create_table mydb regtable REGION COUNTRY

출력 :

mydb.txt(The contents of this file): 

regtable 

REGION|COUNTRY 

입력 :% perl youscript.pl Create_table mydb nametable SURNAME NAME

출력 :

mydb.txt(The contents of this file): 

regtable 

REGION|COUNTRY 


nametable 

SURNAME|NAME 

새로운 항목은 각 항목에 추가해야합니다.

K. Rea : 모든 도움에 감사드립니다.

+0

$ ARGV [1] .txt \ n $ ARGV [3] | $ ARGV [4] \ n "; ' – PerlDuck

+0

죄송합니다. 파일에 기록 될 것입니다. . @PerlDuck –

+0

질문은 "어떻게 추가 할 파일을 열 수 있습니까?"_ – PerlDuck

답변

2

귀하의 예제는 실제로 데이터베이스가 작동하는 방식이 아닙니다. 이것은 가변 길이 레코드의 단순한 파일입니다. 조회를 더 효율적으로하고 싶다면 레코드 길이가 고정되어 있거나 별도의 인덱스 오프셋 인덱스를 유지해야합니다. 그러나 그것은 당신의 질문에 대답 할 수있는 범위를 벗어납니다.

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으로 시작하여 거기에서 빌드하십시오.