Hello.
I plan to skip the block content which include the start line of "MaterializeU4()" with the subroutin() read_block below. But failed. 
# Read a constant definition block from a file handle. 
# void return when there is no data left in the file. 
# Otherwise return an array ref containing lines to in the block.  
sub read_block { 
    my $fh = shift; 
    my @lines; 
    my $block_started = 0; 
    while( my $line = <$fh> ) { 
    # how to correct my code below? I don't need the 2nd block content.
 $block_started++ if ( ($line =~ /^(status)/) && (index($line, "MaterializeU4") != 0) ) ;
 if( $block_started ) { 
     last if $line =~ /^\s*$/; 
     push @lines, $line; 
 }
    } 
    return \@lines if @lines;
    return; 
} 
Data as below:
__DATA__ 
status DynTest = <dynamic 100>
vid = 10002
name = "DynTest"
units   = ""
status VIDNAME9000 = <U4 MaterializeU4()>
vid = 9000
name = "VIDNAME9000"
units = "degC"
status DynTest = <U1 100>
vid = 100
name = "Hello"
units   = ""
Output:
  <StatusVariables>
    <SVID logicalName="DynTest" type="L" value="100" vid="10002" name="DynTest" units=""></SVID>
    <SVID logicalName="DynTest" type="L" value="100" vid="100" name="Hello" units=""></SVID>
  </StatusVariables>
[Updated]
I print the value of index($line, "MaterializeU4"), it output 25.
Then I updated the code as below
$block_started++ if ( ($line =~ /^(status)/) && (index($line, "MaterializeU4") != 25)
Now it works.
Any comments are welcome about my practice.
Thank you.