Hello Kwun,
The following code will work PROVIDED there is always an entry in the FROM, DEPT, TO, ARR fields. It looks for the second pipe symbol, (|), and gets the rest of the line after it. Hope this helps. Chris
#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
next unless /Bus Timetable/;
<DATA> for 1..3;
my $line;
until (($line = <DATA>) =~ /^\+/) {
# Find index of the first '|' after the first one.
my $idx = index($line, "|", 1);
# From that position (+2), capture the remaining string
$line = substr($line, $idx+2);
# Remove the '|' characters
$line =~ s/\|//g;
# Capture the first four fields
my ($fr, $dep, $to, $arr) = split ' ', $line;
print "$fr$dep:$to$arr\n";
}
}
__DATA__
---TEXT BEFORE---
+---------------+
| Bus Timetable |
+---------------+----+------------+-----------+------+
| BUS SERVICE DAY tm | FROM DEPT | TO ARR | 24/7 |
+--------------------+------------+-----------+------+
| C4 metro mon 15 | twn 0900 | Apt 1011 | yes |
| C6 intl mon 45 | LDN 1000 | XTR 1426 | no |
| B2 susx mon 20 | cly 1034 | btn 1118 | no |
| A0 xxxxx xxx xx | xxx xxxx | xxx xxxx | xxx |
+--------------------+------------+-----------+------+
---TEXT AFTER---
+---------------+
| Bus Timetable |
+---------------+----+-----------------+------------+------+
| BUS SERVICE DAY tm | FROM DEPT | TO ARR | 24/7 |
+--------------------+-----------------+------------+------+
| C4 mon 15 | twn 0900 | Apt 1011 | yes |
| intl mon | LoDoN 1000 | XTR 1426 | |
| B2 sussex 20 | cly 1034 | brgtn 1118 | no |
| A0 | manchester 1212 | xxx xxxx | xxx |
+--------------------+-----------------+------------+------+
**** RESULTS *******
***********************
twn0900:Apt1011
LDN1000:XTR1426
cly1034:btn1118
xxxxxxx:xxxxxxx
twn0900:Apt1011
LoDoN1000:XTR1426
cly1034:brgtn1118
manchester1212:xxxxxxx
|