在Perl中解析不规则的文本文件

Tof*_*ofu 3 perl parsing text

我是perl编程的新手,想了解用perl解析文本文件.我有一个文本文件,其中有不规则的格式,我想将其解析为三个.

基本上该文件包含类似这些文本:

;out;asoljefsaiouerfas'pozsirt'z
mysql_query("SELECT * FROM Table WHERE (value='true') OR (value2='true') OR (value3='true') ");
1234 434 3454

4if[9put[e]9sd=09q]024s-q]3-=04i
select ta.somefield, tc.somefield 
from TableA ta INNER JOIN TableC tc on tc.somefield=ta.somefield 
INNER JOIN TableB tb on tb.somefield=ta.somefield 
ORDER by tb.somefield
234 4536 234
Run Code Online (Sandbox Code Playgroud)

并且列表以这种格式继续.

所以我需要做的是解析三个.即顶部的那个,获得哈希检查.第二个是mysql查询,第三个是解析这三个数字.出于某种原因,我不知道如何做到这一点.我在perl中使用'open'函数来从文本文件中获取数据.然后我尝试使用'split'函数进行换行,但事实证明查询不在一行或一个模式中,所以我不能像我想象的那样使用它.

Axe*_*man 6

假设:

  1. 数据块之间会有一个空白行.
  2. 该空白行仅包含换行符.
  3. 在这些块中,哈希检查将是顶部单行,并且三个数字将是底部单行.

考虑到这一点:

use strict;
use warnings;
use English qw<$RS $OS_ERROR>;

local $RS = "\n\n";

open( my $fh, '<', $path_to_file ) 
    or die "Could not open $path_to_file! - $OS_ERROR"
    ;
while ( <> ) { 
    chomp;
    my ( $hash_check_line
       , @inner_lines 
       )
       = split /\n/
       ;
    my @numbers = split /\D+/, pop @inner_lines;
    my $sql     = join( "\n", @inner_lines );

    ...
}
Run Code Online (Sandbox Code Playgroud)

通过将$RS($/$INPUT_RECORD_SEPARATOR)更改为双换行符,我们可以更改读取记录的方式.

这并不是那么奇怪,但在我使用Perl的那些年里,我不得不在记录分隔符中创建一些非常有趣的字符串,但有时只需要读取您想要读取的块就可以了.