Because the 'while' loop goes off first, populating $_ with one line of DATA. Your range operator then applies to that, which is why it doesn't work.
#!/usr/bin/perl
use strict;
use warnings;
my %rec;
while ( my $line = <DATA>)
{
$line .= <DATA>;
$line =~ s/\"//g;
$line =~s/,//g;
my ( $id, $name ) = ( $line =~ m/id: (\S+)\nname: (\S+)/mg );
print "$id = $name\n";
$rec{$id} = $name;
}
__DATA__
"id": "xx-ada-qwebasd",
"name": "telphone",
"id": "fasda-asd-123123-fkja123a",
"name": "car",
"id": "97f921-a312-fas2",
"name": "ball",
That I think does the trick. (Basically, grabs two lines in a go, but isn't ideal if your data structure is more complicated). I suspect there's something more clever you could do to parse a file and grab out pattern matching, but I think most of those would involve reading the file in a scalar context and reading the whole lot (which may be fine, but can go wrong with large files).