NAME
Inline::SLang::Assoc - Support for associative arrays
SYNOPSIS
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
DESCRIPTION
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.
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).Or we could assume a default type of
Int_Type
, which would match S-Lang's approach.As a Perl
Assoc_Type
object.Whilst it involves more typing to set up, you are guaranteed that the datatype is correct.
THE ASSOC_TYPE CLASS
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 aDataType_Type
object. See the_typeof()
method below to find the datatype used to store the data.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:
new( datatype )
The constructor takes the datatype of the asociative array - as either a string or a
DataType_Type
object - and returns anAssoc_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
, andvalues
- is not guaranteed to match that of S-Lang's iterators such asassoc_get_keys
._typeof()
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 returnsAssoc_Type
.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'skeys
routine. This means that the order of the returned keys is not guaranteed to match that of S-Lang'sassoc_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
.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'svalues
routine. This means that the order of the returned keys is not guaranteed to match that of S-Lang'sassoc_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
.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.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}
.delete_key( $key )
Removes the key from the associative array. It is essentially S-Lang's
delete_key()
routine.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
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}
.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}
.