Perl字符串解析

时间:2014-05-29 20:44:28

标签: string perl parsing

...好友

我试图在perl中解析这个字符串。

对于我测试Oracle tns文件和测试变体的最后几节课,这个特别小的代码确实需要时间,有人可以建议吗?

基本上使用if语句,我试图读取tns文件并在哈希引用中放入单个值,直到if语句得到预期结果...

  1. 从tns行获取单个别名值
  2. 获取该别名的SID
  3. 将不同的SId值放入哈希引用中,以便只连接一次数据库而不是多次。
  4. 首先如果有效但多次连接几个数据库。

    代码:

    if /^(([A-Za-z][A-Za-z0-9]*)(\.([A-Za-z][A-Za-z0-9]*))*)(\s|,|=)/
    {
      (/\(CONNECT_DATA\s+=\s+\(SID\s+=\s+(\w+\d+?)(\s+)?\)/)
        {  
          $hashref->{$1}="";
        }
    }
    

    示例文件(tnsfile.txt)

    DB1.UK, DB2.UK =
      (
        (ADDRESS = (PROTOCAL = TCP))
        (CONNECT_DATA = (SID = db1))
      )
    
    DB1.EU, DB2.CH =
      (
        (ADDRESS = (PROTOCAL = TCP))
        (CONNECT_DATA = (SID = db1))
      )
    
    DB3.UK =
      (
        (ADDRESS = (PROTOCAL = TCP))
        (CONNECT_DATA = (SID = db3))
      )
    
    DB3.US =
      (
        (ADDRESS = (PROTOCAL = TCP))
        (CONNECT_DATA = (SID = db3))
      )
    
    DB4.UK.US, DB5.US =
      (
        (ADDRESS = (PROTOCAL = TCP))
        (CONNECT_DATA = (SID = db5))
      )
    

    预期结果

    DB1.Uk
    
    DB3.UK
    
    DB4.UK.US
    

2 个答案:

答案 0 :(得分:0)

正则表达式应该是

/(^[A-Za-z0-9.]+)/

即。一个字符串,锚定在包含一个或多个字母数字字符或点的行的开头。如果你想更加具体地忽略字符串以点开头或以点结尾的行,你必须变得更复杂,但如果文件是有效的TNS文件则可能不需要。

这是一个更完整的正则表达式,只匹配有效字符串

/^(([A-Za-z][A-Za-z0-9]*)(\.([A-Za-z][A-Za-z0-9]*))*)(\s|,|=)/

答案 1 :(得分:0)

您可以通过Jim演示的单个正则表达式来解决这个问题。但是,我建议你将其分解为步骤

  • 以段落模式处理文件
  • 分开名字。
  • 拆分名称以获得第一个

像这样:

use strict;
use warnings;

local $/ = ""; # Paragraph mode.

while (<DATA>) {
    chomp;
    my ($name_list) = split /\s*=\s*/, $_, 2;
    my @names = split /,\s*/, $name_list;
    print $names[0], "\n";
}

__DATA__
DB1.UK, DB2.UK =
  (
    (ADDRESS = (PROTOCAL = TCP))
    (CONNECT_DATA = (SID = db1))
  )

DB3.UK =
  (
    (ADDRESS = (PROTOCAL = TCP))
    (CONNECT_DATA = (SID = db3))
  )

DB4.UK.US, DB5.US =
  (
    (ADDRESS = (PROTOCAL = TCP))
    (CONNECT_DATA = (SID = db5))
  )

输出:

DB1.UK
DB3.UK
DB4.UK.US

或者您可以简化该流程并使用

my @first_names = $data =~ /^[^,]+/mg;