注到OP:這將有助於地址像這樣的問題,如果你提供的不僅僅是一個單一的數據記錄。
但是,當我們結合兩個數據示例時,顯然NAME和ADDRESS字段是垂直對齊的。這提供了分析的一個相當簡單的方法,因爲我們基本上只需要匹配一個確切的正則表達式:
NAME Sprinkle, Jonathan U ADDRESS 16887 36 St NW
Calgary, AB T8O 0B0
NAME Nguyen, Michael S ADDRESS 100A
8447 149 Ave NW
Sherwood Park, AB T6J 0Z0
使用,作爲一個基準,下面的腳本作品解析四個記錄:
use warnings;
use strict;
my @records;
while (<DATA>) {
if (/^NAME (.{22})ADDRESS (.*)/) {
push @records, {
name => $1,
address => $2,
};
} elsif (/^\s{43}(.*)/) {
$records[-1]{address} .= "\n$1";
} else {
warn "Unknown format on $.: $_";
}
}
# Strip extra spacing from all fields
for (@records) {
for (values %$_) {
s/\s+$//mg;
}
}
# Output records for debugging
use Data::Dump;
dd \@records;
__DATA__
NAME Sprinkle, Jonathan U ADDRESS 16887 36 St NW
Calgary, AB T8O 0B0
NAME Nguyen, Michael S ADDRESS 100A
8447 149 Ave NW
Sherwood Park, AB T6J 0Z0
NAME Sprinkle, Jonathan U ADDRESS 16887 36 St NW
Calgary, AB T8O 0B0
NAME Nguyen, Michael S ADDRESS 100A
8447 149 Ave NW
Sherwood Park, AB T6J 0Z0
輸出:
[
{
address => "16887 36 St NW\nCalgary, AB T8O 0B0",
name => "Sprinkle, Jonathan U",
},
{
address => "100A\n8447 149 Ave NW\nSherwood Park, AB T6J 0Z0",
name => "Nguyen, Michael S",
},
{
address => "16887 36 St NW\nCalgary, AB T8O 0B0",
name => "Sprinkle, Jonathan U",
},
{
address => "100A\n8447 149 Ave NW\nSherwood Park, AB T6J 0Z0",
name => "Nguyen, Michael S",
},
]
考慮激活無論是'/ s'或'/ M'標籤 – sshashank124
我已嘗試添加/平方米,但是當我這樣做的唯一的東西,它打印出來了「1」@ sshashank124 – Mitchk
@Mitchk請嘗試使用格式工具讓你的文章更具吸引力和整潔 – HamZa