...好友
我试图在perl中解析这个字符串。
对于我测试Oracle tns文件和测试变体的最后几节课,这个特别小的代码确实需要时间,有人可以建议吗?
基本上使用if语句,我试图读取tns文件并在哈希引用中放入单个值,直到if语句得到预期结果...
首先如果有效但多次连接几个数据库。
代码:
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
答案 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;