2014-03-04 1 views
1

perl을 처음 사용했습니다. 그리고 나는이 스크립트를 작성하여 변경 로그를 포함하는 로그 파일에서 데이터베이스의 특정 테이블에 대해 기록 된 변경 사항을 가져와야합니다. 그리고 특정 테이블의 이러한 변경 사항은 새 파일에 저장되어야합니다 (지금은 .txt 파일로 스트리밍하고 있지만 실제로는 브라우저에 표시해야하지만 다음 단계로 진행해야합니다).perl의 출력에서 ​​공백이 제외됩니다.

내 문제는 출력을 원하는대로 저장하고 있지만 모든 공백이 없어서 출력이 공백없이 하나의 문자열로 표시된다는 것입니다. 누구든지 도와 줄 수 있습니까? 어떻게 단어들 사이에 공간을 확보해야합니까?

또한 디버깅 할 때이 줄은 전체 파일을 공백없이 하나의 문자열로 사용하므로 "while (< @file>)"때문에이 문제가 발생한다는 것을 알았습니다. 그래서 누군가는 이것을 대신 할 대안이나 해결책을 제안 할 수 있습니다.

이 스크립트는 다음과 같습니다

#!/usr/bin/perl -w 
use strict; 
use warnings; 

#take the file as input, (if want from command line use ARGV[0]) 
open(FILE, "</home/apareek/sample.txt") or die '\nfile not opened $!\n'; 
open(my $out, ">/home/apareek/output.txt") or die ":P :P"; 

my $line; 
my @file = <FILE>; 

#take table name as input 
print "\nEnter the table name you want to make query for\n"; 
my $tbl_name = <STDIN>; 
chomp($tbl_name); 
my $new_tabname = $tbl_name . "..."; 

print "\nTable Name: $new_tabname\n"; 
if (grep(m/$new_tabname/, @file) eq 1) { 
    print "Table name exsts.\n"; 
    while(<@file>) {       
     if (/^$tbl_name/ .. /^Check/) { 
      if($_ !~ /$new_tabname/ and $_ !~ /Checking/) { 
       print $out $_; # $out (is the handler of output file) 
      } 
     } 
    } 
} 

입력 데이터 :

Checking table BOARD_EQSL34V... 
Checking table CFMGlobalTbl... 
Checking table CFMMaTable... 
!!!!!! Diff001: differences in record definition section 
!!!!!! mdIdx : Record definition type differs Unsigned Int(4 Byte)(db1) vs. (db2) 
Checking table CFMMdTable... 
!!!!!! Diff002: differences in record definition section 
!!!!!! mdIdx : Record definition type differs : Unsigned Int (4 Byte) (db1) vs. (db2) 
Checking table CFMMepListTbl... 
Checking table CFMMepTable... 
+0

입력 데이터의 섹션을 어떻게 게시하고'@ file'에 그것을 읽는가? – Fabricio

+0

요청한대로 입력 데이터가 포함되었습니다. 그리고 스크립트의 추가 부분도 있으므로 @file에 그것을 읽는 방법을 알 수 있습니다. – ashish

+0

무엇을 기대합니까'(<@file>) {...}'할 수 있습니까? for (@file) {...}'을 의미합니까? – Borodin

답변

0

당신은이 일을 두 가지 방법의 조합을 가지고있다. 은 어느 쪽이든 당신은

my @file = <FILE>; 
    .... 
    for (@file) { 

갈 하나의 배열로 전체 파일을 읽거나 (파일이 큰있을 경우 바람직하다) 당신은

while (<FILE>) { 

나는 것 한 번에 파일 한 라인을 읽어 이것을 다음과 같이 작성하십시오 :

my $filename = '/home/apareek/sample.txt' ; 
    open my $file , '<', $filename or die 'file $filename not opened $!\n'; 
    while (<$file>) { 

Why is three-argument open calls with autovivified filehandles a Perl best practice?을 참조하십시오.

+0

i.r. "(<$file>)"런타임시 "openline (./str_parse2.pl의 파일 열기가 열려 있지 않은 경우)"오류가 발생합니다. – ashish

관련 문제