#!/usr/bin/perl
use warnings;
use diagnostics;
use strict;

# context.pl
#
# Please send corrections, suggestions for improvement, comments etc. to
# chandra@ee.uwa.edu.au
#
# This program illustrates the difference between scalar and list context
# as it applies to assignment of arrays to variables.
#
my (@fruits, $fruits, $f1, $f2, @new_fruits);

@fruits = ("oranges", "apples", "peaches", "bananas", "pineapples");
print 'print @fruits, "\n";', "\t--> ";
print @fruits, "\n"; # @fruits is not interpolated
print 'print "@fruit\n";', "\t--> ";
print "@fruits\n"; # @fruits is interpolated

$fruits = @fruits; # assigned in scalar context
print "\n";
print '$fruits = @fruits;', "\n", 'print $fruits, "\n";', "\t--> ";
print $fruits, "\n";

($fruits) = @fruits; # assigned in list context
print "\n";
print '($fruits) = @fruits;', "\n", 'print $fruits, "\n";', "\t--> ";
print $fruits, "\n";

# $fruits = @fruits[3]; # uncomment this line to see a warning
$fruits = $fruits[3];
print "\n";
print '$fruits = $fruits[3];', "\n", 'print $fruits, "\n";', "\t--> ";
print $fruits, "\n";

# assign a comma-separated list to a scalar
$fruits = ("oranges", "apples", "peaches", "bananas", "pineapples")[3];
print "\n";
print '$fruits = ("oranges", "apples", "peaches", "bananas", "pineapples")[3];',
"\n", 'print $fruits, "\n";', "\t--> ";
print $fruits, "\n";

# shift the elements of the array out
$fruits = shift @fruits;
print "\n";
print '$fruits = shift @fruits;', "\n", 'print $fruits, "\n";', "\t--> ";
print $fruits, "\n";
$fruits = shift @fruits;
print '$fruits = shift @fruits;', "\n", 'print $fruits, "\n";', "\t--> ";
print $fruits, "\n";
print 'print "@fruit\n";', "\t--> ";
print "@fruits\n";

# assign in list context to 2 scalars
($f1, $f2) = @fruits;
print "\n";
print '($f1, $f2) = @fruits;', "\n", 'print $f1, "\n";', "\t--> ";
print $f1, "\n";
print '($f1, $f2) = @fruits;', "\n", 'print $f2, "\n";', "\t--> ";
print $f2, "\n";

# assign in list context to an array
@new_fruits = @fruits;
print "\n";
print '@new_fruits = @fruits;', "\n", 'print "@new_fruits\n";', "\t--> ";
print "@new_fruits\n";
print '@new_fruits = @fruits;', "\n", 'print "@fruits\n";', "\t--> ";
print "@fruits\n";

# assign a comma-separated list to a scalar
#
# Uncomment the block below to see behaviour
#
# $fruits = ("oranges", "apples", "peaches", "bananas", "pineapples");
# print "\n";
# print '$fruits = ("oranges", "apples", "peaches", "bananas", "pineapples");',
# "\n", 'print $fruits, "\n";', "\t--> ";
# print $fruits, "\n";
#
# Can you guess what would result from:
#
# ($fruits) = ("oranges", "apples", "peaches", "bananas", "pineapples");
#
# Uncomment and execute the above line to see if you guessed correctly

# assign a comma-separated list to a scalar in brackets
$fruits = ["oranges", "apples", "peaches", "bananas", "pineapples"];
print "\n";
print '$fruits = ["oranges", "apples", "peaches", "bananas", "pineapples"];',
"\n", 'print $fruits, "\n";', "\t--> ";
print $fruits, "\n";
print 'print @$fruits, "\n";', "\t--> ";
print "@$fruits\n";