perl: March 2008 Archives
Came across a curious fact today. Try this out:
$ perl -e "print int(2.07 * 100)"
You get 206 not 207. Same rounding down happens with 2.01 2.03 and 2.05. As perldoc -f int says,
You should not use this function for rounding
One alternative is to use sprintf, for instance:
my $num = sprintf("%.0f",(2.07 * 100)); # returns 207 Or even, from the command line:
perl -e 'printf("%.0f",(2.07 * 100))' # returns 207
Or you could use Math::Round and let that do the thinking for you. ;)
Update
Recently (it's early September 2008) Microsoft released an update that made the original example in this entry fail with an error along to the lines of:
Thanks to a colleague, here's a very minor alteration that should fix the problem:
use SOAP::Lite; # +trace
use strict;
my $uri = 'http://www.webserviceX.NET';
my $url = 'http://www.webservicex.net/globalweather.asmx';
my $soap = SOAP::Lite
->uri($uri)
->on_action( sub { '"' . $uri . $_[1] . '"' } ) # surround with double quotes
->proxy($url)
->autotype(0);
# $soap->readable(1);
my $method = SOAP::Data->name('GetWeather')->attr({xmlns =>$uri});
my $result = $soap->call($method => (
SOAP::Data->name('CityName')->value('Cambridge'),
SOAP::Data->name('CountryName')->value('United Kingdom'),)
)->result;
The original example below probably works with .NET web services that haven't yet had the latest update from Microsoft applied:
use SOAP::Lite; # +trace
use strict;
my $uri = 'http://www.webserviceX.NET';
my $url = 'http://www.webservicex.net/globalweather.asmx';
my $soap = SOAP::Lite
-> uri($uri)
-> on_action( sub { join '/', $uri, $_[1] } )
-> proxy($url);
$soap->autotype(0);
# $soap->readable(1);
my $method = SOAP::Data->name('GetWeather')->attr({xmlns =>$uri});
my $result = $soap->call($method => (
SOAP::Data->name('CityName')->value('Cambridge'),
SOAP::Data->name('CountryName')->value('United Kingdom'),)
)->result;
