Inline::SLang::Assoc - Support for associative arrays
use Inline 'SLang'; # you can send hash references to S-Lang print_in_slang( { a => 23, "b b" => "foo" } ); # and get them back from S-Lang $href = get_from_slang(); print "The assoc array contains:\n" . join( "", map { "\t$_ => $$href{$_}\n"; } keys %$href ); __END__ __SLang__ define print_in_slang (assoc) { message( "SLang thinks you sent it an assoc. array with:" ); foreach ( assoc ) using ( "keys", "values" ) { variable k, v; ( k, v ) = (); vmessage( " key %s = %S", k, v ); } } define get_from_slang() { variable x = Assoc_Type [String_Type]; x["a key"] = "a value"; x["another key"] = "another value"; return x; }
The output of this code - which can be found in the source-code distribution as examples/assoc.pl - is:
SLang thinks you sent it an assoc. array with: key a = 23 key b b = foo The assoc array contains: another key => another value a key => a value
Since S-Lang's associative arrays are similar to Perl's associative (aka "hash") arrays then the conversion is fairly easy. It is not completely trivial since S-Lang's assoc. arrays know about the datatype of the variables they contain.
When a S-Lang associative array is sent to Perl, it is converted into a Assoc_Type Perl object. As discussed below, this behaves just like a hash reference with a few additional method calls.
Assoc_Type
When sending an associative array to a S-Lang function from Perl, two different (but not very different) techniques can be used:
As a hash reference.
When converted to S-Lang, it will appear as a Assoc_Type [Any_Type] array since the code does not try to guess the type based on the stored values. This could be a future enhancement if the current approach turns out to be unsatisfactory (Any_Type variables can be a bit of a pain to work with in S-Lang).
Assoc_Type [Any_Type]
Any_Type
Or we could assume a default type of Int_Type, which would match S-Lang's approach.
Int_Type
As a Perl Assoc_Type object.
Whilst it involves more typing to set up, you are guaranteed that the datatype is correct.
The Perl Assoc_Type class stores the datatype of the array along with the data. Once you have created the object you can use it as a hash reference to get and set fields in the array. As described below the object also has a number of methods based on the S-Lang language which provides similar functionality.
The Assoc_Type class inherit the default methods of all the Inline::SLang objects, namely:
typeof()
This returns Assoc_Type as a DataType_Type object. See the _typeof() method below to find the datatype used to store the data.
DataType_Type
_typeof()
stringify()
This returns the string "Assoc_Type".
is_struct_type()
This returns 0.
As with the other object classes these methods can only be called using the $object->method( args ) syntax. There are also a number of additional methods for this class:
$object->method( args )
new( datatype )
The constructor takes the datatype of the asociative array - as either a string or a DataType_Type object - and returns an Assoc_Type object.
The return value can be treated as a hash reference, or you can use some of the other methods described below to manipulate the contents of the array.
my $assoc = Assoc_Type->new( "String_Type" ); $$assoc{foo} = "hello"; $$assoc{baz} = "hi there"; while ( my ($k,$v) = each %$assoc ) { print " key $k has a value of $v\n"; }
The order of keys returned by the Perl hash iterators - such as each, keys, and values - is not guaranteed to match that of S-Lang's iterators such as assoc_get_keys.
each
keys
values
assoc_get_keys
Returns - as a DataType_Type object - the class of the data stored in the array. This is unlike the S-Lang _typeof command which just returns Assoc_Type.
_typeof
my $assoc = Assoc_Type->new( "Complex_Type" ); my $type = $assoc->_typeof();
length()
Returns the number of keys in the associative array.
my $assoc = Assoc_Type->new( "Double_Type" ); $$assoc{"foo"} = 1.0; $$assoc{"bar"} = 3.0e6; print "Number of keys = ", $assoc->length, "\n";
get_keys()
Returns, as an array reference, a list of the keys of the asociative array. It is essentially S-Lang's assoc_get_keys() routine although it is implemented using Perl's keys routine. This means that the order of the returned keys is not guaranteed to match that of S-Lang's assoc_get_keys().
assoc_get_keys()
my $assoc = Assoc_Type->new( "Double_Type" ); $$assoc{"foo"} = 1.0; $$assoc{"bar"} = 3.0e6; foreach my $k ( $assoc->get_keys ) { print " key $k has value $$assoc{$k}\n"; }
There is no advantage to using this method over Perl's keys %$assoc.
keys %$assoc
get_values()
Returns, as an array reference, a list of the values of the asociative array. It is essentially S-Lang's assoc_get_values() routine although it is implemented using Perl's values routine. This means that the order of the returned keys is not guaranteed to match that of S-Lang's assoc_get_values().
assoc_get_values()
my $assoc = Assoc_Type->new( "Double_Type" ); $$assoc{"foo"} = 1.0; $$assoc{"bar"} = 3.0e6; foreach my $v ( $assoc->get_values ) { print " array contains $v\n"; }
There is no advantage to using this method over Perl's values %$assoc.
values %$assoc
key_exists( $key )
Returns 1 if the key exists in the associative array and 0 otherwise. It is essentially S-Lang's assoc_key_exists() routine.
assoc_key_exists()
my $assoc = Assoc_Type->new( "Double_Type" ); $$assoc{"foo"} = 1.0; $$assoc{"bar"} = 3.0e6; print "foo exists\n" if $assoc->key_exists("foo");
There is no advantage to using this method over Perl's exists $$assoc{$key}.
exists $$assoc{$key}
delete_key( $key )
Removes the key from the associative array. It is essentially S-Lang's delete_key() routine.
delete_key()
There is no advantage to using this method over Perl's delete $$assoc{$key}.
delete $$assoc{$key}
get_value( $key )
Returns the value for the given key.
my $assoc = Assoc_Type->new( "Double_Type" ); $$assoc{"foo"} = 1.0; $$assoc{"bar"} = 3.0e6; my $val = $assoc->get_value( "foo" );
There is no advantage to using this method rather than Perl's $$assoc{$key}.
$$assoc{$key}
set_value( $key, $val )
Sets the given key to the supplied value.
my $assoc = Assoc_Type->new( "Double_Type" ); $$assoc{"foo"} = 1.0; $$assoc{"bar"} = 3.0e6; $assoc->set_value( "foo", 44.1 );
There is no advantage to using this method over Perl's $$assoc{$key}.
Inline::SLang::Array, Inline::SLang, Math::Complex, PDL
To install Inline::SLang, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Inline::SLang
CPAN shell
perl -MCPAN -e shell install Inline::SLang
For more information on module installation, please visit the detailed CPAN module installation guide.