| Mojolicious documentation | Contained in the Mojolicious distribution. |
Mojo::Parameters - Parameter Container
use Mojo::Parameters; my $params = Mojo::Parameters->new(foo => 'bar', baz => 23);
Mojo::Parameters is a container for form parameters.
Mojo::Parameters implements the following attributes.
charset my $charset = $params->charset;
$params = $params->charset('UTF-8');
Charset used for decoding parameters, defaults to UTF-8.
pair_separator my $separator = $params->pair_separator;
$params = $params->pair_separator(';');
Separator for parameter pairs, defaults to &.
Mojo::Parameters inherits all methods from Mojo::Base and implements the following new ones.
new my $params = Mojo::Parameters->new;
my $params = Mojo::Parameters->new('foo=b%3Bar&baz=23');
my $params = Mojo::Parameters->new(foo => 'b;ar', baz => 23);
Construct a new Mojo::Parameters object.
append$params = $params->append(foo => 'ba;r');
Append parameters.
clonemy $params2 = $params->clone;
Clone parameters.
merge$params = $params->merge($params2, $params3);
Merge parameters.
param my @names = $params->param;
my $foo = $params->param('foo');
my @foo = $params->param('foo');
my $foo = $params->param(foo => 'ba;r');
Check parameter values.
paramsmy $parameters = $params->params; $params = $params->params([foo => 'b;ar', baz => 23]);
Parsed parameters.
parse $params = $params->parse('foo=b%3Bar&baz=23');
Parse parameters.
remove $params = $params->remove('foo');
Remove a parameter.
to_hashmy $hash = $params->to_hash;
Turn parameters into a hashref.
to_stringmy $string = $params->to_string;
Turn parameters into a string.
Mojolicious, Mojolicious::Guides, http://mojolicio.us.
| Mojolicious documentation | Contained in the Mojolicious distribution. |
package Mojo::Parameters; use Mojo::Base -base; use overload 'bool' => sub {1}, '""' => sub { shift->to_string }, fallback => 1; use Mojo::Util qw/encode decode url_escape url_unescape/; use Mojo::URL; has charset => 'UTF-8'; has pair_separator => '&'; # "Yeah, Moe, that team sure did suck last night. They just plain sucked! # I've seen teams suck before, # but they were the suckiest bunch of sucks that ever sucked! # HOMER! # I gotta go Moe my damn weiner kids are listening." sub new { my $self = shift->SUPER::new(); # Hash/Array if (@_ > 1) { $self->append(@_) } # String else { $self->{_string} = $_[0] } $self; } sub append { my ($self, @params) = @_; # Filter array values for (my $i = 1; $i < @params; $i += 2) { next if ref $params[$i] ne 'ARRAY'; push @params, map { ($params[$i - 1], $_) } @{$params[$i]}; splice @params, $i - 1, 2; } push @{$self->params}, map { defined $_ ? "$_" : '' } @params; $self; } sub clone { my $self = shift; my $clone = Mojo::Parameters->new; $clone->pair_separator($self->pair_separator); if (defined $self->{_string}) { $clone->{_string} = $self->{_string} } else { $clone->params([@{$self->params}]) } $clone; } sub merge { my $self = shift; push @{$self->params}, @{$_->params} for @_; $self; } sub param { my $self = shift; my $name = shift; # List names return sort keys %{$self->to_hash} unless $name; # Replace values $self->remove($name) if defined $_[0]; $self->append($name, $_) for @_; # List values my @values; my $params = $self->params; for (my $i = 0; $i < @$params; $i += 2) { push @values, $params->[$i + 1] if $params->[$i] eq $name; } wantarray ? @values : $values[0]; } sub params { my ($self, $params) = @_; if ($params) { $self->{_params} = $params } elsif (defined $self->{_string}) { $self->parse } $self->{_params} ||= []; } sub parse { my ($self, $string) = @_; $string = delete $self->{_string} unless defined $string; # Clear $self->params([]); # Detect pair separator for reconstruction return $self unless defined $string && length $string; $self->pair_separator(';') if $string =~ /\;/ && $string !~ /\&/; # W3C suggests to also accept ";" as a separator my $charset = $self->charset; for my $pair (split /[\&\;]+/, $string) { # Parse $pair =~ /^([^\=]*)(?:=(.*))?$/; my $name = $1; my $value = $2; $name = '' unless defined $name; $value = '' unless defined $value; # Replace "+" with whitespace $name =~ s/\+/\ /g; $value =~ s/\+/\ /g; # Unescape if (index($name, '%') >= 0) { url_unescape $name; my $backup = $name; decode $charset, $name if $charset; $name = $backup unless defined $name; } if (index($value, '%') >= 0) { url_unescape $value; my $backup = $value; decode $charset, $value if $charset; $value = $backup unless defined $value; } push @{$self->params}, $name, $value; } $self; } # "Don't kid yourself, Jimmy. If a cow ever got the chance, # he'd eat you and everyone you care about!" sub remove { my ($self, $name) = @_; $name = '' unless defined $name; # Remove my $params = $self->params; for (my $i = 0; $i < @$params;) { if ($params->[$i] eq $name) { splice @$params, $i, 2 } else { $i += 2 } } $self->params($params); $self; } sub to_hash { my $self = shift; # Format my $params = $self->params; my %params; for (my $i = 0; $i < @$params; $i += 2) { my $name = $params->[$i]; my $value = $params->[$i + 1]; # Array if (exists $params{$name}) { $params{$name} = [$params{$name}] unless ref $params{$name} eq 'ARRAY'; push @{$params{$name}}, $value; } # String else { $params{$name} = $value } } \%params; } sub to_string { my $self = shift; # String my $charset = $self->charset; if (defined(my $string = $self->{_string})) { # Escape encode $charset, $string if $charset; url_escape $string, "$Mojo::URL::UNRESERVED\\&\\;\\=\\+\\%"; return $string; } # Build pairs my $params = $self->params; return '' unless @{$self->params}; my @params; for (my $i = 0; $i < @$params; $i += 2) { my $name = $params->[$i]; my $value = $params->[$i + 1]; # Escape encode $charset, $name if $charset; url_escape $name, $Mojo::URL::UNRESERVED; if ($value) { encode $charset, $value if $charset; url_escape $value, $Mojo::URL::UNRESERVED; } # Replace whitespace with "+" $name =~ s/\%20/\+/g; $value =~ s/\%20/\+/g if $value; push @params, defined $value ? "$name=$value" : "$name"; } # Concatenate pairs my $separator = $self->pair_separator; join $separator, @params; } 1; __END__