Here is the working code to display PV1-3 and OBR-4.2. As you suggested, it worked after I split the message into list of segments. Thank you so much for your help Charlie.
set mh [keylget args MSGID] ;#Message header
set msg [msgget $mh]
set segs [split $msg r] ;# List of segments
set msh [lindex $segs 0] ;# MSH segment
set fldsep [string index $msh 3] ;# Field sep (|)
set subsep [string index $msh 4] ;# Subfield sep (^)
#get PV1-3 Location
set pv1idx [lsearch -regexp $segs ^PV1]
set pv1flds [split [lindex $segs $pv1idx] $fldsep
set patientLoc [lindex $pv1flds 3]
echo PV1-3 Location : $patientLoc
#get OBR-4.2 Test Description
set obridx [lsearch -regexp $segs ^OBR]
set obrflds [split [lindex $segs $obridx] $fldsep]
set testDesc [lindex [split [lindex $obrflds 4] $subsep 1]
echo OBR-4.2 Test Description : $testDesc
HL7 field Field content Displayed as
PV1-3 Family Care Center Family Care Center
OBR-4.2 DRUG SCREEN 10 DRUG SCREEN 10
[/b]