Re: Need to turn off prints from module
by Corion (Patriarch) on Nov 17, 2010 at 17:08 UTC
|
It would seem to me that this is a bug in Parse::HTTP::UserAgent. It contains a regular expression to suppress those messages, but the RE is
use constant RE_WARN_INVALID => qr{\QVersion string .+? contains inva
+lid data; ignoring:\E}xms;
... which will quotemeta all metachars, especially .+?, which seems wrong. Also, the mixed usage of x and \Q happens to work but usually when using /x, you should use \s (or [ ]) for matching spaces.
My approach would be to either preload and monkeypatch Parse::HTTP::UserAgent::Constants or to fix the module upstream.
Also, I'm not sure what actually raises these warnings. | [reply] [d/l] [select] |
Re: Need to turn off prints from module
by kcott (Archbishop) on Nov 17, 2010 at 17:39 UTC
|
If you can identify the point in the code where this is happening, you can selectively turn off this specific warning type with:
no warnings 'misc';
# problem code here
use warnings 'misc';
Be aware this turns off all 'misc' warnings between no warnings 'misc'; and use warnings 'misc';.
If you look in perldiag, you can do a search for 'Version string' which finds:
Version string '%s' contains invalid data; ignoring: '%s'
(W misc) The version string contains invalid characters at the end, which are being ignored.
The "(W misc)" tells you which warning to turn off.
perllexwarn describes all the warning types.
| [reply] [d/l] [select] |
|
Thank you all!
Ken, i love your suggestion - this is exactly what i'm looking for. I tried putting no warnings 'misc'; just before i start using the module in my $ua = Parse::HTTP::UserAgent->new($useragent); and said to use warnings after all the parsing is done, but that doesnt change anything - i still see those pesky lines. :o( I also tried no warnings; and that didnt help either.
Looking forward to more ideas!
| [reply] |
|
warnings are lexically scoped so, for that solution to work you'd need to modify version.pm. JavaFan was spot on (below) - if you're interested, check the Parse::HTTP::UserAgent source code: in sub _numify you'll find the line my $rv = version->new("$v")->numify;.
Anyway, not being someone who likes to be beaten by zeros and ones, here's a workaround. Before the line:
my $ua = Parse::HTTP::UserAgent->new($useragent);
add
$useragent =~ s{ ( [+] ) [[] [^]]+ []] ( [+] ) }{$1$2}msx;
I ran a few tests with this and it seems to work fine. The test code and output is below (click on Read more...).
| [reply] [d/l] [select] |
|
|
Re: Need to turn off prints from module
by JavaFan (Canon) on Nov 17, 2010 at 17:56 UTC
|
The warning seems to come from version.pm. It seems Parse::HTTP::UserAgent passes '4.06[en]' to be versionified. But version.pm doesn't like that. | [reply] [d/l] |
Re: Need to turn off prints from module
by biohisham (Priest) on Nov 17, 2010 at 18:29 UTC
|
| [reply] [d/l] |
|
This is how the "offender" user agent strings look like:
Mozilla/4.06+[en]+(WinNT;+I)
| [reply] [d/l] |
Re: Need to turn off prints from module
by thargas (Deacon) on Nov 18, 2010 at 13:27 UTC
|
My take on this is that any module which spits out warnings is broken and should be fixed. There is no good way to suppress these warnings external to the module. You can use $SIG{__WARN__} or re-route STDERR or even hack the symbol-table to stuff your own replacement for the method which is causing you problems. They all have their problems which will surface to bite you later.
IMHO you should look at why you are trying to parse the user-agent string anyway. There is no standard for what might be there, browsers are all regularly impersonating each other, and the end-user can tell them to use some random string as the user-agent. Anything you try for parsing the user-agent is a hack and may or may not work today, but you can pretty much guarantee that it will break someday.
Please consider if whatever you are trying to accomplish would not be better done in the browser itself by feature-detection, rather than browser-detection. Feature-detection is much more reliable and doesn't depend on figuring out which browser you've got.
| [reply] |
Re: Need to turn off prints from module
by Mushka (Acolyte) on Nov 18, 2010 at 17:32 UTC
|
Thank you all again!
Ken, thanks for pointing out that your user agents have spaces instead of plusses. Im grabbing my strings from the server logs, and it looks like the user agent strings are being modified by the script that's producing these logs. Changing plusses to spaces helped greatly, but there are still occasional errors like:
Use of uninitialized value in split at /usr/local/share/perl/5.8.8/Par
+se/HTTP/UserAgent.pm line 98, <FILES> line 14.
and
Version string '3.5.9-1.fc11' contains invalid data; ignoring: '-1.fc11' at /usr/local/share/perl/5.8.8/Parse/HTTP/UserAgent.pm line 210, <FILES> line 181.
However, making the plusses into spaces allowed the two other modules that i mentioned to make more sense out of the user agent strings that i was passing. And neither of them are giving me the annoying notifications :o) So i will probably end up using one of these as opposed to Parse::HTTP::UserAgent since there seems to be no easy way to shut the module up. And yes, like i said at the beginning, turning off all errors and warnings is not an option for a sensible programmer.
Thargas, thank you for bringing up a good point that user agent strings are not a science, that im never gonna get a 100% accurate result, and that the accuracy is going to drop as the time goes by. To answer your question, we want to see a statistics of which browsers our clients are using to reach our website so we could make business decisions on which browsers we should start/continue to provide support for. Luckily, our management understands that the report is going to have an approximation of what browsers are being used and they still see a value in such report. If you see a different approach to better achieve this goal i would love to hear your ideas! | [reply] [d/l] [select] |