1=head1 NAME 2 3PDL::Lvalue - declare PDL lvalue subs 4 5=head1 DESCRIPTION 6 7Declares a subset of PDL functions so that they 8can be used as lvalue subs. In particular, this allows 9simpler constructs such as 10 11 $a->slice(',(0)') .= 1; 12 13instead of the clumsy 14 15 (my $tmp = $a->slice(',(0)')) .= 1; 16 17This will only work if your perl supports lvalue subroutines 18(i.e. versions >= v5.6.0). Note that lvalue subroutines 19are currently regarded experimental. 20 21=head1 SYNOPSIS 22 23 use PDL::Lvalue; # automatically done with all PDL loaders 24 25=head1 FUNCTIONS 26 27=cut 28 29package PDL::Lvalue; 30 31# list of functions that can be used as lvalue subs 32# extend as necessary 33my @funcs = qw/ clump diagonal dice dice_axis dummy flat 34 index index2d indexND indexNDb mslice mv 35 nslice nslice_if_pdl nnslice polyfillv px 36 range rangeb reorder reshape sever slice 37 where whereND xchg /; 38 39my $prots = join "\n", map {"use attributes 'PDL', \\&PDL::$_, 'lvalue';"} 40 @funcs; 41 42=head2 subs 43 44=for ref 45 46test if routine is a known PDL lvalue sub 47 48=for example 49 50 print "slice is an lvalue sub" if PDL::Lvalue->subs('slice'); 51 52returns the list of PDL lvalue subs if no routine name is given, e.g. 53 54 @lvfuncs = PDL::Lvalue->subs; 55 56It can be used in scalar context to find out if your 57PDL has lvalue subs: 58 59 print 'has lvalue subs' if PDL::Lvalue->subs; 60 61=cut 62 63sub subs { 64 my ($type,$func) = @_; 65 if (defined $func) { 66 $func =~ s/^.*:://; 67 return ($^V and $^V >= 5.006007) && scalar grep {$_ eq $func} @funcs; 68 } else { 69 return ($^V and $^V >= 5.006007) ? @funcs : (); 70 } 71} 72 73# print "defining lvalue subs:\n$prots\n"; 74 75eval << "EOV" if ($^V and $^V >= 5.006007); 76{ package PDL; 77 no warnings qw(misc); 78 $prots 79} 80EOV 81 82=head1 AUTHOR 83 84Copyright (C) 2001 Christian Soeller (c.soeller@auckland.ac.nz). All 85rights reserved. There is no warranty. You are allowed to redistribute 86this software / documentation under certain conditions. For details, 87see the file COPYING in the PDL distribution. If this file is 88separated from the PDL distribution, the copyright notice should be 89included in the file. 90 91=cut 92 931; 94