在perl的输出中,空格被排除在外

时间:2014-03-04 07:46:33

标签: regex perl

我是perl的新手。我正在编写这个脚本,该脚本应该从包含完整更改日志的日志文件中获取为数据库中的特定表记录的任何类型的更改。并且特定表中的这些更改应存储在一个新文件中(现在我正在使用.txt文件,但实际上必须在浏览器中显示,但这是下一步)。

所以我的问题是输出是按照我的意愿存储但是所有空格都丢失了,因此输出显示为一个没有空格的字符串。任何人都可以帮忙吗?我应该如何在词汇之间形成空间?

同样在调试时我发现(根据我的意思)这是因为“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...

1 个答案:

答案 0 :(得分: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?了解原因。