
Untitled
By: a guest on
May 8th, 2012 | syntax:
None | size: 1.67 KB | hits: 13 | expires: Never
How do you flatten a hash of key,value pairs?
sub flatten{
my($ref,$delim,$item_delim,$array,$str) = @_;
die("Required Hash Reference") unless isHash($ref);
$delim = $delim ? $delim :'_';
#dump into array hash vals #simplified
if(!$item_delim){
@{$array} = %{$ref};
}else{
my($keys,$values);
$keys = getKeys($ref);
$values = getValues($ref);
#item strings
if($#$keys > 0 && $#$values > 0){
#fix for issue where value[n] is empty
@{$array}= map{ (defined $$values[ $_ ]) ? $$keys[ $_ ].$item_delim.$$values[ $_ ] : $$keys[ $_ ].$item_delim } 0 .. int($#$keys);
}else{
log "No Values to flatten";
return '';
}
}
$str = join($delim,@{$array});
return $str;
}
$HASH => {
key1 => 'val1',
key2 => 'val2',
key3 => 'val3',
}
sub flatten {
my ($hash, $delim, $item_delim) = @_;
$delim //= '&',
$item_delim //= '=';
return join $delim, map { "$_$item_delim$hash->{$_}" } keys %$hash;
}
use URI;
my $uri = URI->new("", "http"); # We don't actually care about the path...
$uri->query_form(%params);
my $query_string = $uri->query;
my $hashref = {
key1 => 'val1',
key2 => 'val2',
key3 => 'val3',
};
sub encode {
my $str = shift;
$str =~ s/([^A-Za-z0-9./_-])/sprintf("%%%02X", ord($1))/seg;
return $str;
}
my $str = join '&' => map { encode($_).'='.encode($hashref->{$_}) } grep { defined $hashref->{$_} } keys %$hashref;
key2=val2&key1=val1&key3=val3
use URI::Escape;
my $str=join '&',map {uri_escape($_).'='.uri_escape($QUERY_STRING->{$_})} grep {defined $QUERY_STRING->{$_}} keys %$QUERY_STRING;