John Ackley wrote:
> Inherited code (from Verisign):   @[EMAIL PROTECTED] = split /\t/,$rec;
> which worked but really puzzled me.

What is happening is a hash slice assignment similar to:

@datafield{ 'a', 'b', 'c' } = ( 'd', 'e', 'f' );

Where the first element in @send is used as the key for the first value from
split() and the second element in @send is used as the key for the second
value from split(), etc.

> I assumed that it meant    [EMAIL PROTECTED] = split /\t/,$rec;
> which worked also as I verified by testing both versions.

[EMAIL PROTECTED] = split /\t/,$rec;

Is short for:

[EMAIL PROTECTED] = @_ = split /\t/,$rec;

Where @_ is assigned the values from split() and since [EMAIL PROTECTED] is a
scalar both @_ and @send are evaluated in scalar context which means that the
number of elements in @send is used as the key and the number of elements in
@_ is used as the value.

> However [EMAIL PROTECTED] = split /\t/,$rec;
> gives the warning quote: Use of implicit split to @_ is deprecated at . . .
> 
> Could some please explain the error messages
> and the syntax of these lines of code?
> 
> I understand the right side produces a list from a string.

Yes.

> I do not understand the first @ on the left side.
> Does it produce a list of $datafield{one}, $datafield{two}, . . . ?
> assuming @send = ( one, two, . . .);

Yes.  @[EMAIL PROTECTED] is short for ( $datafield{$send[0]},
$datafield{$send[1]}, $datafield{$send[2]}, $datafield{$send[3]}, ...,
$datafield{$send[$#send]} )

> Can someone point out documentation that explains
> this use of @?  I learned that @ flags an array.

perldoc -q 'What is the difference between \$array\[1] and @array\[1]'

And see the "Slices" section in perldata and perllol:

perldoc perldata
perldoc perllol



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to