diff --git a/CREDITS b/CREDITS index ca8fb31..ba613d5 100644 --- a/CREDITS +++ b/CREDITS @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: CREDITS,v 1.174 2013/06/07 10:05:12 gilles Exp gilles $ +# $Id: CREDITS,v 1.175 2013/08/28 22:44:09 gilles Exp gilles $ If you want to make a donation to the author, Gilles LAMIRAL, use any of the following ways: @@ -19,7 +19,7 @@ d) If you prefer making your donation with cash or cheque then my postal address is: Gilles LAMIRAL -4 La Billais +La Billais 35580 Baulon FRANCE @@ -30,6 +30,14 @@ I thank very much all of these people. I thank also very much all people who bought imapsync from the homepage but I don't cite them here. +Bowman Gillianne +Contributed by giving the book +8.60 EUR "L'Épreuve de l'étranger: Culture et traduction dans l'Allemagne romantique" + +Paul Heller +Contributed by giving the book +28.54 "Practical Packet Analysis: Using Wireshark to Solve Real-World Network Problems" + Jim Klimov Gave patch to handle proxyauth failures. @@ -40,7 +48,7 @@ Marc Weber Suggested --mark-as-deleted1 --mark-as-deleted2 Jeff Verheyen -Contributed by giving an 32GB microSDHC card and the book +Contributed by giving a 32GB micro SDHC card and the book 29.69 "Design by Nature: Using Universal Forms and Principles in Design" David Abrahams @@ -1074,6 +1082,7 @@ Eric Yung Total amount of book prices : c \ +28.54+\ 30.86+\ 87.18+\ 19.90+\ @@ -1209,4 +1218,4 @@ c \ 31.20+\ 40.00 = -3050.41 +3196.99 diff --git a/ChangeLog b/ChangeLog index 590e685..9913d9b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,17 +1,30 @@ RCS file: RCS/imapsync,v Working file: imapsync -head: 1.564 +head: 1.567 branch: locks: strict - gilles: 1.564 + gilles: 1.567 access list: symbolic names: keyword substitution: kv -total revisions: 564; selected revisions: 564 +total revisions: 567; selected revisions: 567 description: ---------------------------- -revision 1.564 locked by: gilles; +revision 1.567 locked by: gilles; +date: 2013/09/18 20:38:10; author: gilles; state: Exp; lines: +8 -7 +Fixed a warning when RFC822.SIZE is null or undef. +---------------------------- +revision 1.566 +date: 2013/09/13 13:23:41; author: gilles; state: Exp; lines: +11 -12 +Added --authmech EXTERNAL. Not tested yet. +---------------------------- +revision 1.565 +date: 2013/09/13 01:16:20; author: gilles; state: Exp; lines: +8 -6 +Fusemail success. +RackSpace success. +---------------------------- +revision 1.564 date: 2013/08/18 19:28:47; author: gilles; state: Exp; lines: +114 -22 Adapted behavior for allowing --maxdate --mindate with --noabletosearch. Use internat date instead of Date: header. ---------------------------- diff --git a/FAQ b/FAQ index 2a30202..2902852 100644 --- a/FAQ +++ b/FAQ @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: FAQ,v 1.138 2013/08/16 01:03:32 gilles Exp gilles $ +# $Id: FAQ,v 1.145 2013/09/21 21:56:33 gilles Exp gilles $ +------------------+ | FAQ for imapsync | @@ -183,6 +183,21 @@ Q. Is is legal to find imapsync gratis (or not) elsewhere? R. Yes, the license permits it http://imapsync.lamiral.info/NOLIMIT +======================================================================= +Q. How "Facts and figures" are known on http://imapsync.lamiral.info/ + +R. To know wether a newer imapsync exists or not imapsync does a http + GET to http://imapsync.lamiral.info/VERSION + Via the User-agent parameter it also send: + + * imapsync release + * Perl version + * Mail::IMAPClient version + * Operating System + +You can remove this behavior by adding option --noreleasecheck on the +command line (or by setting $releasecheck = 0 in the source code) + ======================================================================= Q. I use --useuid which uses a cache in /tmp or --tmpdir, the hostnames host1 or host2 has changed but mailboxes are the same. Will imapsync @@ -296,7 +311,40 @@ R2. Use --useuid then imapsync will avoid dealing with headers. imapsync ... --useuid ======================================================================= -Q. How can I try imapsync with Mail::IMAPClient 3.xx perl module? +Q. On Windows, with --useuid or --usecache a problem occurs with long + nested folder names. The error message is: + "No such file or directory; The filename or extension is too long" + +R. This comes from a Windows limitation on pathnames. +No more than 260 characters are allowed for pathnames. +See more details on page +http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx#maxpath + +Two workarounds to reduce the cache directory name: + +1) Use --tmpdir "D:\\temp" or simply --tmpdir "D:" + +2) add two equivalent entries in the etc/hosts for host1 imap.truc.org +and host2 imap.trac.org. +If you map the ip of imap.truc.org just with the letter a +and same thing for imap.trac.org then you gain characters + +etc/hosts + +192.168.12.1 a +192.168.55.3 b + +Then use: + + imapsync --host1 a --host2 b ... + +You can get the ip of a host with the ping command line +C:\> ping imap.truc.org + +Fixing the long path problem directly in imapsync is in the TODO file. + +======================================================================= +Q. How can I try imapsync with latest Mail::IMAPClient 3.xx perl module? R. The answer R2 deals with any Perl module use. @@ -681,6 +729,13 @@ For example to convert flag IMPORTANT to flag CANWAIT option --debugflags is usefull to see in details what imapsync does with flags. +======================================================================= +Q. How to fix this error: BAD Invalid system flag \FORWARDED + +R. Filter flag \FORWARDED with + + imapsync ... --regexflag "s/\\FORWARDED//g" + ======================================================================= Q. How to convert flags with $ to \ character? @@ -1202,7 +1257,7 @@ R. imapsync \ ... - --regextrans2 "s/INBOX(.*)/INBOX.Braunschweig$1/" \ + --regextrans2 "s/INBOX(.*)/INBOX.Braunschweig\$1/" \ --dry --justfolders 2) See if the output says everything you want imapsync to do, @@ -1384,6 +1439,31 @@ format issues. And now it works fine. (Thanks to Hansjoerg.Maurer) Server specific issues and solutions ======================================================================= + +======================================================================= +Q. From XXX to Exchange 2013 or Office365 I get this error message + sometimes: "BAD Command Argument Error 11" + +R. This error message comes from Exchange IMAP server when it + encounters any problem. Most of the time it is one of the following: + + * Some messages are bigger than the size limit. 10 MB by default + on Exchange. It can be upped by configuration. + Or use option --maxsize 10000000 (for 10 MB, change it if needed) + to tell imapsync to skip those messages. + + imapsync ... --maxsize 10000000 + + * Quota reached. The whole account is full. + It can be upped by configuration. + + * Some messages have some lines too long. Use option --maxlinelength + to skip messages whose max line length is over a number of bytes. + --maxlinelength 1000 is a RFC2822 must but most server support + higher values. + + imapsync ... --maxlinelength 1000 + ======================================================================= Q. From Zimbra to XXX @@ -1438,7 +1518,10 @@ imapsync --host1 mail.oldhost.com \ --exitwhenover 500000000 \ --exclude "\[Gmail\]$" \ --addheader \ - --regextrans2 "s,^Sent$,[Gmail]/Sent Mail," + --regextrans2 "s,^Sent$,[Gmail]/Sent Mail," \ + --regextrans2 "s/[ ]+/_/g" \ + --regextrans2 "s/[\^]/_/g" \ + --regextrans2 "s/['\"\\\\]/_/g" If you're using a different language in Gmail you might adapt @@ -1465,6 +1548,15 @@ See http://support.google.com/a/bin/answer.py?hl=en&answer=1071518 "Could not examine: 43 NO [NONEXISTENT] Unknown Mailbox: [Gmail] (now in authenticated state) (Failure)". +--regextrans2 "s/[ ]+/_/g" is there to convert blank characters not +accepted by gmail to character _ underscore. In fact only leading +and trailing blank characters are problems with gmail. + +--regextrans2 "s/[\^]/_/g" is mandatory. It converts, since +not accepted by gmail, character ^ to character _ underscore. + +--regextrans2 "s/['\"\\\\]/_/g" is optional. It converts +characters ' or " or \ to character _ underscore. You can select folders exported to imap within the gmail preferences, unselect all "System labels" depending on your needs. diff --git a/README b/README index dc0a480..d4c24f7 100644 --- a/README +++ b/README @@ -4,7 +4,7 @@ NAME More than 52 different IMAP server softwares supported with success, few failures. - $Revision: 1.564 $ + $Revision: 1.567 $ SYNOPSIS To synchronize imap account "foo" on "imap.truc.org" to imap account @@ -349,6 +349,7 @@ IMAP SERVERS - Dovecot 0.99.10.4, 0.99.14, 0.99.14-8.fc4, 1.0-0.beta2.7, 1.0.0 [dest/source] (LGPL) (http://www.dovecot.org/) - Eudora WorldMail v2 + - Fusemail imap.fusemail.net:143 (https://www.fusemail.com/). - Gimap (Gmail imap) - GMX IMAP4 StreamProxy. - Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ. @@ -375,9 +376,11 @@ IMAP SERVERS - Oracle Beehive [host1] - Qualcomm Worldmail (NT) - QQMail IMAP4Server [host1] [host2] https://en.mail.qq.com/ + - RackSpace hoster secure.emailsrvr.com:993 http://www.rackspace.com/ - Rockliffe Mailsite 5.3.11, 4.5.6 - Samsung Contact IMAP server 8.5.0 - Scalix v10.1, 10.0.1.3, 11.0.0.431, 11.4.6 + - Sendmail Mail Store IMAP4rev1 (5.5.6/mstore-5-5-build-1874 [host1]. - SmarterMail, Smarter Mail 5.0 Enterprise, Smarter Mail 5.5 [host1], SmarterMail Professional 10.2 [host1]. - Softalk Workgroup Mail 7.6.4 [host1]. - SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) @@ -466,5 +469,5 @@ SIMILAR SOFTWARES Feedback (good or bad) will often be welcome. - $Id: imapsync,v 1.564 2013/08/18 19:28:47 gilles Exp gilles $ + $Id: imapsync,v 1.567 2013/09/18 20:38:10 gilles Exp gilles $ diff --git a/VERSION b/VERSION index 4b5d34e..5d90355 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.564 +1.567 diff --git a/VERSION_EXE b/VERSION_EXE index 4b5d34e..5d90355 100644 --- a/VERSION_EXE +++ b/VERSION_EXE @@ -1 +1 @@ -1.564 +1.567 diff --git a/W/.BUILD_EXE_TIME b/W/.BUILD_EXE_TIME index bc03f25..0aa68f2 100644 --- a/W/.BUILD_EXE_TIME +++ b/W/.BUILD_EXE_TIME @@ -228,3 +228,21 @@ 1376618294 END 1.563 : vendredi 16 août 2013, 03:58:14 (UTC+0200) 1376856084 BEGIN 1.564 : dimanche 18 août 2013, 22:01:24 (UTC+0200) 1376856924 END 1.564 : dimanche 18 août 2013, 22:15:24 (UTC+0200) +1379035013 BEGIN 1.565 : vendredi 13 septembre 2013, 03:16:53 (UTC+0200) +1379036258 END 1.565 : vendredi 13 septembre 2013, 03:37:38 (UTC+0200) +1379036858 BEGIN 1.565 : vendredi 13 septembre 2013, 03:47:38 (UTC+0200) +1379038028 END 1.565 : vendredi 13 septembre 2013, 04:07:08 (UTC+0200) +1379067300 BEGIN 1.565 : vendredi 13 septembre 2013, 12:15:00 (UTC+0200) +1379068253 END 1.565 : vendredi 13 septembre 2013, 12:30:53 (UTC+0200) +1379068512 BEGIN 1.565 : vendredi 13 septembre 2013, 12:35:12 (UTC+0200) +1379069423 BEGIN 1.565 : vendredi 13 septembre 2013, 12:50:23 (UTC+0200) +1379069895 END 1.565 : vendredi 13 septembre 2013, 12:58:15 (UTC+0200) +1379070862 BEGIN 1.565 : vendredi 13 septembre 2013, 13:14:22 (UTC+0200) +1379071364 END 1.565 : vendredi 13 septembre 2013, 13:22:44 (UTC+0200) +1379541254 BEGIN 1.567 : mercredi 18 septembre 2013, 23:54:14 (UTC+0200) +1379541678 BEGIN 1.567 : jeudi 19 septembre 2013, 00:01:18 (UTC+0200) +1379544193 BEGIN 1.567 : jeudi 19 septembre 2013, 00:43:13 (UTC+0200) +1379549519 BEGIN 1.567 : jeudi 19 septembre 2013, 02:11:59 (UTC+0200) +1379550371 END 1.567 : jeudi 19 septembre 2013, 02:26:11 (UTC+0200) +1379803429 BEGIN 1.567 : dimanche 22 septembre 2013, 00:43:49 (UTC+0200) +1379804324 END 1.567 : dimanche 22 septembre 2013, 00:58:44 (UTC+0200) diff --git a/W/patches/imapsync_bhaveshah@gmail.com b/W/patches/imapsync_bhaveshah@gmail.com new file mode 100644 index 0000000..259654c --- /dev/null +++ b/W/patches/imapsync_bhaveshah@gmail.com @@ -0,0 +1,5926 @@ +#!/usr/bin/perl5.8.8 + +# structure +# pod documentation +# pragmas +# main program +# global variables initialisation +# default values +# folder loop +# subroutines +# IMAPClient 2.2.9 overrides +# IMAPClient 2.2.9 3.xx ads + +# pod documentation + +=pod + +=head1 NAME + +imapsync - IMAP synchronisation, sync, copy or migration tool. +Synchronises mailboxes between two imap servers. +Good at IMAP migration. More than 52 different IMAP server softwares +supported with success, few failures. + +$Revision: 1.564 $ + +=head1 SYNOPSIS + +To synchronize imap account "foo" on "imap.truc.org" + to imap account "bar" on "imap.trac.org" + with foo password "secret1" + and bar password "secret2": + + imapsync \ + --host1 imap.truc.org --user1 foo --password1 secret1 \ + --host2 imap.trac.org --user2 bar --password2 secret2 + +=head1 INSTALL + + imapsync works fine under any Unix OS with perl. + imapsync works fine under Windows (2000, XP, Vista, Seven) + with Strawberry Perl (5.10, 5.12 or higher) + or as a standalone binary software imapsync.exe + +imapsync can be available directly on the following distributions: +FreeBSD, Debian, Ubuntu, Gentoo, Fedora, +NetBSD, Darwin, Mandriva and OpenBSD. + + Purchase latest imapsync at + http://imapsync.lamiral.info/ + + You'll receive a link to a compressed tarball called imapsync-x.xx.tgz + where x.xx is the version number. Untar the tarball where + you want (on Unix): + + tar xzvf imapsync-x.xx.tgz + + Go into the directory imapsync-x.xx and read the INSTALL file. + The INSTALL file is also at + http://imapsync.lamiral.info/INSTALL + + The freecode (was freshmeat) record is at + http://freecode.com/projects/imapsync + +=head1 USAGE + + imapsync [options] + +To get a description of each option just run imapsync like this: + + imapsync --help + imapsync + +The option list: + + imapsync [--host1 server1] [--port1 ] + [--user1 ] [--passfile1 ] + [--host2 server2] [--port2 ] + [--user2 ] [--passfile2 ] + [--ssl1] [--ssl2] + [--tls1] [--tls2] + [--authmech1 ] [--authmech2 ] + [--proxyauth1] [--proxyauth2] + [--domain1] [--domain2] + [--authmd51] [--authmd52] + [--folder --folder ...] + [--folderrec --folderrec ...] + [--include ] [--exclude ] + [--prefix2 ] [--prefix1 ] + [--regextrans2 --regextrans2 ...] + [--sep1 ] + [--sep2 ] + [--justfolders] [--justfoldersizes] [--justconnect] [--justbanner] + [--syncinternaldates] + [--idatefromheader] + [--syncacls] + [--regexmess ] [--regexmess ] + [--maxsize ] + [--minsize ] + [--maxage ] + [--minage ] + [--search ] + [--search1 ] + [--search2 ] + [--skipheader ] + [--useheader ] [--useheader ] + [--nouid1] [--nouid2] + [--usecache] + [--skipsize] [--allowsizemismatch] + [--delete] [--delete2] + [--expunge] [--expunge1] [--expunge2] [--uidexpunge2] + [--delete2folders] [--delete2foldersonly] [--delete2foldersbutnot] + [--subscribed] [--subscribe] [--subscribe_all] + [--nofoldersizes] [--nofoldersizesatend] + [--dry] + [--debug] [--debugimap][--debugimap1][--debugimap2] + [--timeout ] + [--split1] [--split2] + [--reconnectretry1 ] [--reconnectretry2 ] + [--noreleasecheck] + [--pidfile ] + [--tmpdir ] + [--version] [--help] + [--tests] [--tests_debug] + +=cut +# comment + +=pod + +=head1 DESCRIPTION + +The command imapsync is a tool allowing incremental and +recursive imap transfer from one mailbox to another. + +By default all folders are transferred, recursively, all +possible flags (\Seen \Answered \Flagged etc.) are synced too. + +We sometimes need to transfer mailboxes from one imap server to +another. This is called migration. + +imapsync is a good tool because it reduces the amount +of data transferred by not transferring a given message +if it is already on both sides. Same headers +and the transfer is done only once. All flags are +preserved, unread will stay unread, read will stay read, +deleted will stay deleted. You can stop the transfer at any +time and restart it later, imapsync works well with bad +connections. + +You can decide to delete the messages from the source mailbox +after a successful transfer, it can be a good feature when migrating +live mailboxes since messages will be only on one side. +In that case, use the --delete option. Option --delete implies +also option --expunge so all messages marked deleted on host1 +will be really deleted. +(you can use --noexpunge to avoid this but I don't see any +good real world scenario for the combinaison --delete --noexpunge). + +You can also just synchronize a mailbox B from another mailbox A +in case you just want to keep a "live" copy of A in B. +In that case --delete2 can be used, it deletes messages in host2 +folder B that are not in host1 folder A. + +imapsync is not adequate for maintaining two active imap accounts +in synchronization where the user plays independently on both sides. +Use offlineimap (written by John Goerzen) or mbsync (written by +Michael R. Elkins) for 2 ways synchronizations. + + +=head1 OPTIONS + +To get a description of each option just invoke: + +imapsync --help + +=head1 HISTORY + +I wrote imapsync because an enterprise (basystemes) paid me to install +a new imap server without losing huge old mailboxes located on a far +away remote imap server accessible by a low bandwidth link. The tool +imapcp (written in python) could not help me because I had to verify +every mailbox was well transferred and delete it after a good +transfer. imapsync started life as a copy_folder.pl patch. +The tool copy_folder.pl comes from the Mail-IMAPClient-2.1.3 perl +module tarball source (in the examples/ directory of the tarball). + +=head1 EXAMPLE + +While working on imapsync parameters please run imapsync in +dry mode (no modification induced) with the --dry +option. Nothing bad can be done this way. + +To synchronize the imap account "buddy" (with password "secret1") +on host "imap.src.fr" to the imap account "max" (with password "secret2") +on host "imap.dest.fr": + + imapsync --host1 imap.src.fr --user1 buddy --password1 secret1 \ + --host2 imap.dest.fr --user2 max --password2 secret2 + +Then you will have max's mailbox updated from buddy's +mailbox. + +=head1 SECURITY + +You can use --passfile1 instead of --password1 to give the +password since it is safer. With --password1 option any user +on your host can see the password by using the 'ps auxwwww' +command. Using a variable (like $PASSWORD1) is also +dangerous because of the 'ps auxwwwwe' command. So, saving +the password in a well protected file (600 or rw-------) is +the best solution. + +imasync is not totally protected against sniffers on the +network since passwords may be transferred in plain text +if CRAM-MD5 is not supported by your imap servers. Use +--ssl1 (or --tls1) and --ssl2 (or --tls2) to enable +encryption on host1 and host2. + +You may authenticate as one user (typically an admin user), +but be authorized as someone else, which means you don't +need to know every user's personal password. Specify +--authuser1 "adminuser" to enable this on host1. In this +case, --authmech1 PLAIN will be used by default since it +is the only way to go for now. So don't use --authmech1 SOMETHING +with --authuser1 "adminuser", it will not work. +Same behavior with the --authuser2 option. +Authenticate with an admin account must be supported by your +imap server to work with imapsync. + +When working on Sun/iPlanet/Netscape IMAP servers you must use +--proxyauth1 to enable administrative user to masquerade as another user. +Can also be used on destination server with --proxyauth2 + +You can authenticate with OAUTH when transfering from Google Apps. +The consumer key will be the domain part of the --user, and the +--password will be used as the consumer secret. It does not work +with Google Apps free edition. + +=head1 EXIT STATUS + +imapsync will exit with a 0 status (return code) if everything went good. +Otherwise, it exits with a non-zero status. + +So if you have an unreliable internet connection, you can use this loop +in a Bourne shell: + + while ! imapsync ...; do + echo imapsync not complete + done + +=head1 LICENSE + +imapsync is free, open, public but not always gratis software +cover by the NOLIMIT Public License. +See the LICENSE file included in the distribution or just read this +simple sentence as it is the licence text: +No limit to do anything with this work and this license. + +=head1 MAILING-LIST + +The public mailing-list may be the best way to get free support. + +To write on the mailing-list, the address is: + + +To subscribe, send any message (even empty) to: + +then just reply to the confirmation message. + +To unsubscribe, send a message to: + + +To contact the person in charge for the list: + + +The list archives are available at: +http://www.linux-france.org/prj/imapsync_list/ +So consider that the list is public, anyone +can see your post. Use a pseudonym or do not +post to this list if you want to stay private. + +Thank you for your participation. + +=head1 AUTHOR + +Gilles LAMIRAL + +Feedback good or bad is very often welcome. + +Gilles LAMIRAL earns his living by writing, installing, +configuring and teaching free, open and often gratis +softwares. It used to be "always gratis" but now it is +"often" because imapsync is sold by its author, a good +way to stay maintening and supporting free open public +softwares (see the license) over decades. + +=head1 BUG REPORT GUIDELINES + +Help us to help you: follow the following guidelines. + +Report any bugs or feature requests to the public mailing-list +or to the author. + +Before reporting bugs, read the FAQ, the README and the +TODO files. http://imapsync.lamiral.info/ + +Upgrade to last imapsync release, maybe the bug +is already fixed. + +Upgrade to last Mail-IMAPClient Perl module. +http://search.cpan.org/dist/Mail-IMAPClient/ +maybe the bug is already fixed. + +Make a good title with word "imapsync" in it (my spam filter won't filter it), +Don't write an email title with just "imapsync" or "problem", +a good title is made of keywords summary, not too long (one visible line). + +Don't write imapsync in uppercase in the email title, I'll +then know you run Windows and you haven't read this README yet. + +Help us to help you: in your report, please include: + + - imapsync version. + + - output given with --debug --debugimap near the failure point. + Isolate a message or two in a folder 'BUG' and use + + imapsync ... --folder 'BUG' --debug --debugimap + + - imap server software on both side and their version number. + + - imapsync with all the options you use, the full command line + you use (except the passwords of course). + + - IMAPClient.pm version. + + - the run context. Do you run imapsync.exe, a unix binary + or the perl script imapsync. + + - operating system running imapsync. + + - virtual software context (vmware, xen etc.) + + - operating systems on both sides and the third side in case + you run imapsync on a foreign host from the both. + +Most of those values can be found as a copy/paste at the begining of the output, +so a copy of the output is a very easy and very good debug report for me. + +One time in your life, read the paper +"How To Ask Questions The Smart Way" +http://www.catb.org/~esr/faqs/smart-questions.html +and then forget it. + +=head1 IMAP SERVERS + +Failure stories reported with the following 3 imap servers: + + - MailEnable 1.54 (Proprietary) but MailEnable 4.23 is supported. + - DBMail 0.9, 2.0.7 (GPL). But DBMail 1.2.1 is supported. + Patient and confident testers are welcome. + - Imail 7.04 (maybe). + - (2011) MDaemon 12.0.3 as host2 but MDaemon is supported as host1. + MDaemon is simply buggy with the APPEND IMAP command with + any IMAP email client. + - Hotmail since hotmail.com does not provide IMAP access + - Outlook.com since outlook.com does not provide IMAP access + +Success stories reported with the following 55 imap servers +(software names are in alphabetic order): + + - 1und1 H mimap1 84498 [host1] H mibap4 95231 [host1] + - a1.net imap.a1.net IMAP4 Ready [host1] + - Apple Server 10.6 Snow Leopard [host1] + - Archiveopteryx 2.03, 2.04, 2.09, 2.10 [host2], 3.0.0 [host2] + (OSL 3.0) http://www.archiveopteryx.org/ + - Atmail 6.x [host1] + - Axigen Mail Server Version 8.0.0 + - BincImap 1.2.3 (GPL) (http://www.bincimap.org/) + - CommuniGatePro server (Redhat 8.0) (Solaris), CommuniGate Pro 5.2.17[host2] (CentOS 5.4) + - Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1, 3.0.8, 3.0.3, 4.1.1 (GPL) + (http://www.courier-mta.org/) + - Critical Path (7.0.020) + - Cyrus IMAP 1.5, 1.6, + 2.1, 2.1.15, 2.1.16, 2.1.18 + 2.2.1, 2.2.2-BETA, 2.2.3, 2.2.6, 2.2.10, 2.2.12, 2.2.13, + 2.3-alpha (OSI Approved), 2.3.1, 2.3.7, 2.3.16 + (http://asg.web.cmu.edu/cyrus/) + - David Tobit V8 (proprietary Message system). + - Deerfield VisNetic MailServer 5.8.6 [host1] (http://www.deerfield.net/products/visnetic-mailserver/) + - DBMail 1.2.1, 2.0.4, 2.0.9, 2.2rc1 (GPL) (http://www.dbmail.org/). + 2.0.7 seems buggy. + - DBOX 2.41 System [host1] (http://www.dbox.handshake.de/). + - Deerfield VisNetic MailServer 5.8.6 [host1] + - dkimap4 [host1] + - Domino (Notes) 4.61 [host1], 6.5 [host1], 5.0.6, 5.0.7, 7.0.2, 6.0.2CF1, + 7.0.1 [host1], 8.0.1 [host1], 8.5.2 [host2], 8.5.3 [host1] + - Dovecot 0.99.10.4, 0.99.14, 0.99.14-8.fc4, 1.0-0.beta2.7, + 1.0.0 [dest/source] (LGPL) (http://www.dovecot.org/) + - Eudora WorldMail v2 + - Gimap (Gmail imap) + - GMX IMAP4 StreamProxy. + - Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ. + - hMailServer 5.3.3 [host2], 4.4.1 [host1] (see FAQ) + - iPlanet Messaging server 4.15, 5.1, 5.2 + - IMail 7.15 (Ipswitch/Win2003), 8.12, 11.03 [host1] + - Kerio 7.2.0 Patch 1 [host12], Kerio 8 [host1] + - Mail2World IMAP4 Server 2.5 [host1] (http://www.mail2world.com/) + - MailEnable 4.23 [host1] [host2], 4.26 [host1][host2], 5 [host1] + - MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform), + 9.6.5 [host1], 12 [host2], 12.0.3 [host1], 12.5.5 [host1], + - Mercury 4.1 (Windows server 2000 platform) + - Microsoft Exchange Server 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1], + 6.5.7638.1 [host2], 6.5 [host1], Exchange 2007 SP1 (with Update Rollup 2), + Exchange2007-EP-SP2, + Exchange 2010 RTM (Release to Manufacturing) [host2], + Exchange 2010 SP1 RU2[host2], + - Mirapoint, 4.1.9-GA [host1] + - Netscape Mail Server 3.6 (Wintel !) + - Netscape Messaging Server 4.15 Patch 7 + - Office 365 [host1] [host2] + - OpenMail IMAP server B.07.00.k0 (Samsung Contact ?) + - OpenWave + - Oracle Beehive [host1] + - Qualcomm Worldmail (NT) + - QQMail IMAP4Server [host1] [host2] https://en.mail.qq.com/ + - Rockliffe Mailsite 5.3.11, 4.5.6 + - Samsung Contact IMAP server 8.5.0 + - Scalix v10.1, 10.0.1.3, 11.0.0.431, 11.4.6 + - SmarterMail, Smarter Mail 5.0 Enterprise, Smarter Mail 5.5 [host1], SmarterMail Professional 10.2 [host1]. + - Softalk Workgroup Mail 7.6.4 [host1]. + - SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) + - Sun Java(tm) System Messaging Server 6.2-2.05, 6.2-7.05, 6.3 + - Surgemail 3.6f5-5, 6.3d-72 [host2] + - UW-imap servers (imap-2000b) rijkkramer IMAP4rev1 2000.287 + (RedHat uses UW like 2003.338rh), v12.264 Solaris 5.7 (OSI Approved) + (http://www.washington.edu/imap/) + - UW - QMail v2.1 + - VMS, Imap part of TCP/IP suite of VMS 7.3.2 + - Yahoo [host1] + - Zarafa 6,40,0,20653 [host1] (http://www.zarafa.com/) + - Zarafa ZCP 7.1.4 IMAP Gateway [host2] + - Zimbra-IMAP 3.0.1 GA 160, 3.1.0 Build 279, 4.0.5, 4.5.2, 4.5.6, + Zimbra 5.0.24_GA_3356.RHEL4 [host1], 5.5, 6.x + +Please report to the author any success or bad story with +imapsync and do not forget to mention the IMAP server +software names and version on both sides. This will help +future users. To help the author maintaining this section +report the two lines at the begining of the output if they +are useful to know the softwares. Example: + + Host1 software:* OK louloutte Cyrus IMAP4 v1.5.19 server ready + Host2 software:* OK Courier-IMAP ready + +You can use option --justconnect to get those lines. +Example: + + imapsync --host1 imap.troc.org --host2 imap.trac.org --justconnect + + +=head1 HUGE MIGRATION + +Pay special attention to options +--subscribed +--subscribe +--delete +--delete2 +--delete2folders +--maxage +--minage +--maxsize +--useuid +--usecache + +If you have many mailboxes to migrate think about a little +shell program. Write a file called file.txt (for example) +containing users and passwords. +The separator used in this example is ';' + +The file.txt file contains: + +user001_1;password001_1;user001_2;password001_2 +user002_1;password002_1;user002_2;password002_2 +user003_1;password003_1;user003_2;password003_2 +user004_1;password004_1;user004_2;password004_2 +user005_1;password005_1;user005_2;password005_2 +... + +On Unix the shell program can be: + + { while IFS=';' read u1 p1 u2 p2; do + imapsync --host1 imap.side1.org --user1 "$u1" --password1 "$p1" \ + --host2 imap.side2.org --user2 "$u2" --password2 "$p2" ... + done ; } < file.txt + +On Windows the batch program can be: + + FOR /F "tokens=1,2,3,4 delims=; eol=#" %%G IN (file.txt) DO imapsync ^ + --host1 imap.side1.org --user1 %%G --password1 %%H ^ + --host2 imap.side2.org --user2 %%I --password2 %%J ... + +The ... have to be replaced by nothing or any imapsync option. + +Welcome in shell programming ! + +=head1 Hacking + +Feel free to hack imapsync as the NOLIMIT license permits it. + +=head1 Links + +Entries for imapsync: + http://www.imap.org/products/showall.php + + +=head1 SIMILAR SOFTWARES + + imap_tools : http://www.athensfbc.com/imap_tools + offlineimap : https://github.com/nicolas33/offlineimap + mbsync : http://isync.sourceforge.net/ + mailsync : http://mailsync.sourceforge.net/ + mailutil : http://www.washington.edu/imap/ + part of the UW IMAP tookit. + imaprepl : http://www.bl0rg.net/software/ + http://freecode.com/projects/imap-repl/ + imapcopy : http://home.arcor.de/armin.diehl/imapcopy/imapcopy.html + migrationtool : http://sourceforge.net/projects/migrationtool/ + imapmigrate : http://sourceforge.net/projects/cyrus-utils/ + wonko_imapsync: http://wonko.com/article/554 + see also file W/tools/wonko_ruby_imapsync + exchange-away : http://exchange-away.sourceforge.net/ + pop2imap : http://www.linux-france.org/prj/pop2imap/ + + +Feedback (good or bad) will often be welcome. + +$Id: imapsync,v 1.564 2013/08/18 19:28:47 gilles Exp gilles $ + +=cut + + +# pragmas + +use strict; +use warnings; +++$|; +use Carp; +use Getopt::Long; +use Mail::IMAPClient 3.29 ; +use Digest::MD5 qw( md5 md5_hex md5_base64 ); +use Digest::HMAC_SHA1 qw( hmac_sha1 ) ; +#use Term::ReadKey; +#use IO::Socket::SSL; +use MIME::Base64; +use English '-no_match_vars' ; +use File::Basename; +use POSIX qw(uname SIGALRM); +use Fcntl; +use File::Spec; +use File::Path qw(mkpath rmtree); +use IO::Socket qw(:crlf SOL_SOCKET SO_KEEPALIVE); +use Errno qw(EAGAIN EPIPE ECONNRESET); +use File::Glob qw( :glob ) ; +use IO::File; +use Time::Local ; +use Time::HiRes qw( time ) ; +use Test::More 'no_plan' ; +use IPC::Open3 'open3' ; +#use Unix::Sysexits ; + +# global variables + +my( + $rcs, $pidfile, $pidfilelocking, + $debug, $debugimap, $debugimap1, $debugimap2, $debugcontent, $debugflags, + $debugLIST, $debugsleep, $debugdev, + $nb_errors, + $host1, $host2, $port1, $port2, + $user1, $user2, $domain1, $domain2, + $password1, $password2, $passfile1, $passfile2, + @folder, @include, @exclude, @folderrec, + $prefix1, $prefix2, + @regextrans2, @regexmess, @regexflag, + $flagsCase, $filterflags, $syncflagsaftercopy, + $sep1, $sep2, + $syncinternaldates, + $idatefromheader, + $syncacls, + $fastio1, $fastio2, + $maxsize, $minsize, $maxage, $minage, + $exitwhenover, + $search, $search1, $search2, + $skipheader, @useheader, + $skipsize, $allowsizemismatch, $foldersizes, $foldersizesatend, $buffersize, + $delete, $delete2, $delete2duplicates, + $expunge, $expunge1, $expunge2, $uidexpunge2, $dry, + $justfoldersizes, + $authmd5, $authmd51, $authmd52, + $subscribed, $subscribe, $subscribe_all, + $version, $help, + $justconnect, $justfolders, $justbanner, + $fast, + + $total_bytes_transferred, + $total_bytes_skipped, + $total_bytes_error, + $nb_msg_transferred, + $nb_msg_skipped, + $nb_msg_skipped_dry_mode, + $h1_nb_msg_duplicate, + $h2_nb_msg_duplicate, + $h1_nb_msg_noheader, + $h2_nb_msg_noheader, + $h1_total_bytes_duplicate, + $h2_total_bytes_duplicate, + $h1_nb_msg_deleted, + $h2_nb_msg_deleted, + + $h1_bytes_processed, + $h1_nb_msg_processed, + $h1_nb_msg_at_start, $h1_bytes_start, + $h2_nb_msg_start, $h2_bytes_start, + $h1_nb_msg_end, $h1_bytes_end, + $h2_nb_msg_end, $h2_bytes_end, + + $timeout, + $timestart, $timestart_int, $timeend, + $timebefore, + $ssl1, $ssl2, + $ssl1_SSL_version, $ssl2_SSL_version, + $tls1, $tls2, + $uid1, $uid2, + $authuser1, $authuser2, + $proxyauth1, $proxyauth2, + $authmech1, $authmech2, + $split1, $split2, + $reconnectretry1, $reconnectretry2, + $relogin1, $relogin2, + $tests, $test_builder, $tests_debug, + $allow3xx, $justlogin, + $tmpdir, + $releasecheck, + $max_msg_size_in_bytes, + $modules_version, + $delete2folders, $delete2foldersonly, $delete2foldersbutnot, + $usecache, $debugcache, $cacheaftercopy, + $wholeheaderifneeded, %h1_msgs_copy_by_uid, $useuid, $h2_uidguess, + $addheader, + %h1, %h2, + $checkselectable, $checkmessageexists, + $expungeaftereach, + $abletosearch, + $showpasswords, + $fixslash2, + $messageidnodomain, + $fixInboxINBOX, + $maxlinelength, + $uidnext_default, +); + +# main program + +# global variables initialisation + +$rcs = '$Id: imapsync,v 1.564 2013/08/18 19:28:47 gilles Exp gilles $ '; + +$total_bytes_transferred = 0; +$total_bytes_skipped = 0; +$total_bytes_error = 0; +$nb_msg_transferred = 0; +$nb_msg_skipped = $nb_msg_skipped_dry_mode = 0; +$h1_nb_msg_deleted = $h2_nb_msg_deleted = 0; +$h1_nb_msg_duplicate = $h2_nb_msg_duplicate = 0; +$h1_nb_msg_noheader = $h2_nb_msg_noheader = 0; +$h1_total_bytes_duplicate = $h2_total_bytes_duplicate = 0; + + +$h1_nb_msg_at_start = $h1_bytes_start = 0 ; +$h2_nb_msg_start = $h2_bytes_start = 0 ; +$h1_nb_msg_processed = $h1_bytes_processed = 0 ; + +$h1_nb_msg_end = $h1_bytes_end = 0 ; +$h2_nb_msg_end = $h2_bytes_end = 0 ; + +$nb_errors = 0; +$max_msg_size_in_bytes = 0; + +my %month_abrev = ( + Jan => 0, + Feb => 1, + Mar => 2, + Apr => 3, + May => 4, + Jun => 5, + Jul => 6, + Aug => 7, + Sep => 8, + Oct => 9, + Nov => 10, + Dec => 11, +); + +sub EX_USAGE { + # 64 on my linux box. + # See http://search.cpan.org/~jmates/Unix-Sysexits-0.02/lib/Unix/Sysexits.pm + return( 64 ) ; +} + + +# @ARGV will be eat by get_options() +my @argv_copy = @ARGV; + +get_options(); + +# $SIG{ INT } = \&catch_continue ; +local $SIG{ INT } = local $SIG{ QUIT } = local $SIG{ TERM } = \&catch_exit ; + +$timestart = time( ); +$timestart_int = int( $timestart ) ; +$timebefore = $timestart; + +my $timestart_str = localtime( $timestart ) ; +print "Transfer started at $timestart_str\n"; + +$modules_version = defined($modules_version) ? $modules_version : 1; + + +$releasecheck = defined($releasecheck) ? $releasecheck : 1; +my $warn_release = ($releasecheck) ? check_last_release() : ''; + +# default values + +$tmpdir ||= File::Spec->tmpdir(); +$pidfile ||= $tmpdir . '/imapsync.pid'; + +$pidfilelocking = defined( $pidfilelocking ) ? $pidfilelocking : 0 ; + +# allow Mail::IMAPClient 3.0.xx by default +$allow3xx = defined($allow3xx) ? $allow3xx : 1; + +$wholeheaderifneeded = defined( $wholeheaderifneeded ) ? $wholeheaderifneeded : 1; + +# turn on RFC standard flags correction like \SEEN -> \Seen +$flagsCase = defined( $flagsCase ) ? $flagsCase : 1 ; + +# Use PERMANENTFLAGS if available +$filterflags = defined( $filterflags ) ? $filterflags : 1 ; + +# sync flags just after an APPEND, some servers ignore the flags given in the APPEND +# like MailEnable IMAP server. +# Off by default since it takes time. +$syncflagsaftercopy = defined( $syncflagsaftercopy ) ? $syncflagsaftercopy : 0 ; + + + +# turn on relogin 5 by default +$relogin1 = defined( $relogin1 ) ? $relogin1 : 5 ; +$relogin2 = defined( $relogin2 ) ? $relogin2 : 5 ; + +if ( $fast ) { + # $useuid = 1 ; + # $foldersizes = 0 ; + # $foldersizesatend = 0 ; +} + +# Activate --usecache if --useuid is set and no --nousecache +$usecache = 1 if ( $useuid and ( ! defined( $usecache ) ) ) ; +$cacheaftercopy = 1 if ( $usecache and ( ! defined( $cacheaftercopy ) ) ) ; + +$checkselectable = defined( $checkselectable ) ? $checkselectable : 1 ; +$checkmessageexists = defined( $checkmessageexists ) ? $checkmessageexists : 0 ; +$expungeaftereach = defined( $expungeaftereach ) ? $expungeaftereach : 1 ; +$abletosearch = defined( $abletosearch ) ? $abletosearch : 1 ; +$checkmessageexists = 0 if ( not $abletosearch ) ; +$showpasswords = defined( $showpasswords ) ? $showpasswords : 0 ; +$fixslash2 = defined( $fixslash2 ) ? $fixslash2 : 1 ; +$fixInboxINBOX = defined( $fixInboxINBOX ) ? $fixInboxINBOX : 1 ; + +$delete2duplicates = 1 if ( $delete2 and ( ! defined( $delete2duplicates ) ) ) ; + +print banner_imapsync(@argv_copy); + +print "Temp directory is $tmpdir\n"; + +is_valid_directory($tmpdir); +write_pidfile($pidfile) if ($pidfile); + +$modules_version and print "Modules version list:\n", modules_VERSION(), "\n"; + +check_lib_version() or + croak "imapsync needs perl lib Mail::IMAPClient release 3.25 or superior \n"; + +exit_clean(0) if ($justbanner); + +# By default, 100 at a time, not more. +$split1 ||= 100; +$split2 ||= 100; + +$host1 || missing_option("--host1") ; +$port1 ||= ( $ssl1 ) ? 993 : 143; + +$host2 || missing_option("--host2") ; +$port2 ||= ( $ssl2 ) ? 993 : 143; + +$debugimap1 = $debugimap2 = 1 if ( $debugimap ) ; +$debug = 1 if ( $debugimap1 or $debugimap2 ) ; + +# By default, don't take size to compare +$skipsize = (defined $skipsize) ? $skipsize : 1; + +$uid1 = defined($uid1) ? $uid1 : 1; +$uid2 = defined($uid2) ? $uid2 : 1; + +$subscribe = defined($subscribe) ? $subscribe : 1; + +# Allow size mismatch by default +$allowsizemismatch = defined($allowsizemismatch) ? $allowsizemismatch : 1; + +$delete2folders = 1 + if ( defined( $delete2foldersbutnot ) or defined( $delete2foldersonly ) ) ; + +if ($justconnect) { + justconnect(); + exit_clean(0); +} + +$user1 || missing_option("--user1"); +$user2 || missing_option("--user2"); + +$syncinternaldates = defined($syncinternaldates) ? $syncinternaldates : 1; + +# Turn on expunge if there is not explicit option --noexpunge and option +# --delete is given. +# Done because --delete --noexpunge is very dangerous on the second run: +# the Deleted flag is then synced to all previously transfered messages. +# So --delete implies --expunge is a better usability default behaviour. +if ($delete) { + if ( ! defined($expunge)) { + $expunge = 1; + } +} + +if ( $uidexpunge2 and not Mail::IMAPClient->can( 'uidexpunge' ) ) { + print "Failure: uidexpunge not supported (IMAPClient release < 3.17), use --expunge2 instead\n" ; + exit_clean( 3 ) ; +} + +if ( ( $delete2 or $delete2duplicates ) and not defined( $uidexpunge2 ) ) { + if ( Mail::IMAPClient->can( 'uidexpunge' ) ) { + print "Info: will act as --uidexpunge2\n" ; + $uidexpunge2 = 1 ; + }elsif ( not defined( $expunge2 ) ) { + print "Info: will act as --expunge2 (no uidexpunge support)\n" ; + $expunge2 = 1 ; + } +} + +if ( $delete and $delete2 ) { + print "Warning: using --delete and --delete2 together is almost always a bad idea, exiting imapsync\n" ; + exit_clean( 4 ) ; +} + +if ($idatefromheader) { + print "Turned ON idatefromheader, ", + "will set the internal dates on host2 from the 'Date:' header line.\n"; + $syncinternaldates = 0; +} + +if ($syncinternaldates) { + print "Info: turned ON syncinternaldates, ", + "will set the internal dates (arrival dates) on host2 same as host1.\n"; +}else{ + print "Info: turned OFF syncinternaldates\n"; +} + + + +if (defined($authmd5) and ($authmd5)) { + $authmd51 = 1 ; + $authmd52 = 1 ; +} + +if (defined($authmd51) and ($authmd51)) { + $authmech1 ||= 'CRAM-MD5'; +} +else{ + $authmech1 ||= $authuser1 ? 'PLAIN' : 'LOGIN'; +} + +if (defined($authmd52) and ($authmd52)) { + $authmech2 ||= 'CRAM-MD5'; +} +else{ + $authmech2 ||= $authuser2 ? 'PLAIN' : 'LOGIN'; +} + +$authmech1 = uc($authmech1); +$authmech2 = uc($authmech2); + +if (defined $proxyauth1 && !$authuser1) { + missing_option("With --proxyauth1, --authuser1"); +} + +if (defined $proxyauth2 && !$authuser2) { + missing_option("With --proxyauth2, --authuser2"); +} + +$authuser1 ||= $user1; +$authuser2 ||= $user2; + +print "Info: will try to use $authmech1 authentication on host1\n"; +print "Info: will try to use $authmech2 authentication on host2\n"; + +$timeout = defined( $timeout ) ? $timeout : 120 ; +print "Info: imap connexions timeout is $timeout seconds\n"; + + +$syncacls = (defined($syncacls)) ? $syncacls : 0 ; +$foldersizes = (defined($foldersizes)) ? $foldersizes : 1 ; +$foldersizesatend = (defined($foldersizesatend)) ? $foldersizesatend : $foldersizes ; + + + +$fastio1 = (defined($fastio1)) ? $fastio1 : 0; +$fastio2 = (defined($fastio2)) ? $fastio2 : 0; + +$reconnectretry1 = (defined($reconnectretry1)) ? $reconnectretry1 : 3; +$reconnectretry2 = (defined($reconnectretry2)) ? $reconnectretry2 : 3; + +# Since select_msgs() returns no messages when uidnext does not return something +# then $uidnext_default is never used. So I have to remove it. +$uidnext_default = 999999 ; + +@useheader = ( "Message-Id", "Message-ID", "Received" ) unless ( @useheader ) ; + +my %useheader ; + +# Make a hash %useheader of each --useheader 'key' in uppercase +for ( @useheader ) { $useheader{ uc( $_ ) } = undef } ; + +#require Data::Dumper ; +#print Data::Dumper->Dump( [ \%useheader ] ) ; +#exit ; + +print "Host1: IMAP server [$host1] port [$port1] user [$user1]\n"; +print "Host2: IMAP server [$host2] port [$port2] user [$user2]\n"; + +$password1 || $passfile1 || do { + $password1 = ask_for_password($authuser1 || $user1, $host1) unless ($authmech1 eq "EXTERNAL"); +}; + +$password1 = (defined($passfile1)) ? firstline ($passfile1) : $password1; + +#$password1 || $passfile1 || 'PREAUTH' eq $authmech1 || do { +# $password1 = ask_for_password( $authuser1 || $user1, $host1 ) ; +#} ; + +#$password1 = ( defined( $passfile1 ) ) ? firstline ( $passfile1 ) : $password1 ; + +$password2 || $passfile2 || 'PREAUTH' eq $authmech2 || do { + $password2 = ask_for_password( $authuser2 || $user2, $host2 ) ; +} ; + +$password2 = ( defined( $passfile2 ) ) ? firstline ( $passfile2 ) : $password2 ; + + +my $dry_message = '' ; +$dry_message = "\t(not really since --dry mode)" if $dry ; + +$search1 ||= $search if ( $search ) ; +$search2 ||= $search if ( $search ) ; + + +if ( @regexmess ) { + my $string = regexmess( '' ) ; + # string undef means one of the eval regex was bad. + if ( not ( defined( $string ) ) ) { + die_clean( "Error: one of --regexmess option is bad, check it" ) ; + } +} + +if ( @regexflag and not ( defined( flags_regex( '' ) ) ) ) { + die_clean( "Error: one of --regexmess option is bad, check it" ) ; +} + +my $imap1 = (); +my $imap2 = (); + +$debugimap1 and print "Host1 connection\n"; +$imap1 = login_imap($host1, $port1, $user1, $domain1, $password1, + $debugimap1, $timeout, $fastio1, $ssl1, $tls1, + $authmech1, $authuser1, $reconnectretry1, + $proxyauth1, $uid1, $split1, 'Host1', $ssl1_SSL_version ); + +$debugimap2 and print "Host2 connection\n"; +$imap2 = login_imap($host2, $port2, $user2, $domain2, $password2, + $debugimap2, $timeout, $fastio2, $ssl2, $tls2, + $authmech2, $authuser2, $reconnectretry2, + $proxyauth2, $uid2, $split2, 'Host2', $ssl2_SSL_version ); + + +$debug and print "Host1 Buffer I/O: ", $imap1->Buffer(), "\n"; +$debug and print "Host2 Buffer I/O: ", $imap2->Buffer(), "\n"; + + + +die_clean( 'Not authenticated on host1' ) unless $imap1->IsAuthenticated( ) ; +print "Host1: state Authenticated\n"; +die_clean( 'Not authenticated on host2' ) unless $imap2->IsAuthenticated( ) ; +print "Host2: state Authenticated\n"; + +print "Host1 capability: ", join(" ", @{ $imap1->capability_update() || [] }), "\n"; +print "Host2 capability: ", join(" ", @{ $imap2->capability_update() || [] }), "\n"; + + +exit_clean(0) if ($justlogin); + +# +# Folder stuff +# + +my ( +@h1_folders_all, %h1_folders_all, @h1_folders_wanted, %requested_folder, +%h1_subscribed_folder, %h2_subscribed_folder, +@h2_folders_all, %h2_folders_all, +@h2_folders_from_1_wanted, %h2_folders_from_1_wanted, +%h2_folders_from_1_several, +%h2_folders_from_1_all, +); + + +# Make a hash of subscribed folders in both servers. + +for ( $imap1->subscribed( ) ) { $h1_subscribed_folder{ $_ } = 1 } ; +for ( $imap2->subscribed( ) ) { $h2_subscribed_folder{ $_ } = 1 } ; + +# All folders on host1 and host2 +@h1_folders_all = sort $imap1->folders(); +@h2_folders_all = sort $imap2->folders(); + +for ( @h1_folders_all ) { $h1_folders_all{ $_ } = 1 } ; +for ( @h2_folders_all ) { $h2_folders_all{ $_ } = 1 } ; + +if ( $fixInboxINBOX and ( my $reg = fix_Inbox_INBOX_mapping( \%h1_folders_all, \%h2_folders_all ) ) ) { + #print "RRRRRR $reg\n" ; + push( @regextrans2, $reg ) ; +} + +if (scalar(@folder) or $subscribed or scalar(@folderrec)) { + # folders given by option --folder + if (scalar(@folder)) { + add_to_requested_folders(@folder); + } + + # option --subscribed + if ( $subscribed ) { + add_to_requested_folders( keys ( %h1_subscribed_folder ) ) ; + } + + # option --folderrec + if (scalar(@folderrec)) { + foreach my $folderrec (@folderrec) { + add_to_requested_folders($imap1->folders($folderrec)); + } + } +} +else { + # no include, no folder/subscribed/folderrec options => all folders + if (not scalar(@include)) { + add_to_requested_folders(@h1_folders_all); + } +} + + +# consider (optional) includes and excludes +if ( scalar( @include ) ) { + foreach my $include ( @include ) { + my @included_folders = grep { /$include/x } @h1_folders_all ; + add_to_requested_folders( @included_folders ) ; + print "Including folders matching pattern '$include': @included_folders\n" ; + } +} + +if ( scalar( @exclude ) ) { + foreach my $exclude ( @exclude ) { + my @requested_folder = sort( keys( %requested_folder ) ) ; + my @excluded_folders = grep { /$exclude/x } @requested_folder ; + remove_from_requested_folders( @excluded_folders ) ; + print "Excluding folders matching pattern '$exclude': @excluded_folders\n" ; + } +} + +# Remove no selectable folders + +$checkselectable and do { + foreach my $folder (keys(%requested_folder)) { + if ( not $imap1->selectable($folder)) { + print "Warning: ignoring folder $folder because it is not selectable\n"; + remove_from_requested_folders($folder); + } + } +} ; + +my @requested_folder = sort(keys(%requested_folder)); + +@h1_folders_wanted = @requested_folder; + +#my $h1_namespace = $imap1->namespace() ; +#my $h2_namespace = $imap2->namespace() ; +#require Data::Dumper ; +#$debug and print "Host1 namespace:\n", Data::Dumper->Dump([$h1_namespace]) ; +#$debug and print "Host2 namespace:\n", Data::Dumper->Dump([$h2_namespace]) ; + +my($h1_sep,$h2_sep); +# what are the private folders separators for each server ? + +$debug and print "Getting separators\n"; +$h1_sep = get_separator($imap1, $sep1, "--sep1"); +$h2_sep = get_separator($imap2, $sep2, "--sep2"); + +my($h1_prefix,$h2_prefix); +$h1_prefix = get_prefix($imap1, $prefix1, "--prefix1"); +$h2_prefix = get_prefix($imap2, $prefix2, "--prefix2"); + + +print "Host1 separator and prefix: [$h1_sep][$h1_prefix]\n"; +print "Host2 separator and prefix: [$h2_sep][$h2_prefix]\n"; + +#my $h1_xlist_folders = $imap1->xlist_folders( ) ; +#my $h2_xlist_folders = $imap2->xlist_folders( ) ; +#require Data::Dumper ; +#print "Host1 xlist:\n", Data::Dumper->Dump([$h1_xlist_folders]) ; +#print "Host2 xlist:\n", Data::Dumper->Dump([$h2_xlist_folders]) ; + +#exit ; + +foreach my $h1_fold ( @h1_folders_wanted ) { + my $h2_fold ; + $h2_fold = imap2_folder_name( $h1_fold ) ; + $h2_folders_from_1_wanted{ $h2_fold }++ ; + if ( 1 < $h2_folders_from_1_wanted{ $h2_fold } ) { + $h2_folders_from_1_several{ $h2_fold }++ ; + } +} +@h2_folders_from_1_wanted = sort keys(%h2_folders_from_1_wanted); + +foreach my $h1_fold (@h1_folders_all) { + my $h2_fold; + $h2_fold = imap2_folder_name($h1_fold); + $h2_folders_from_1_all{$h2_fold}++; +} + + +if ( $foldersizes ) { + ( $h1_nb_msg_at_start, $h1_bytes_start ) = foldersizes( "Host1", $imap1, $search1, @h1_folders_wanted ) ; + ( $h2_nb_msg_start, $h2_bytes_start ) = foldersizes( "Host2", $imap2, $search2, @h2_folders_from_1_wanted ) ; + $fast or sleep( 2 ) ; +} + + +exit_clean(0) if ($justfoldersizes); + +print + "++++ Listing folders\n", + "Host1 folders list:\n", map( { "[$_]\n" } @h1_folders_all ), "\n", + "Host2 folders list:\n", map( { "[$_]\n" } @h2_folders_all ), "\n" ; + +print + "Host1 subscribed folders list: ", + map( { "[$_] " } sort keys( %h1_subscribed_folder ) ), "\n" + if ( $subscribed ) ; + +my @h2_folders_not_in_1; +@h2_folders_not_in_1 = list_folders_in_2_not_in_1(); + +print "Folders in host2 not in host1:\n", + map( { "[$_]\n" } @h2_folders_not_in_1 ), "\n" ; + +delete_folders_in_2_not_in_1() if $delete2folders; + +# folder loop +print "++++ Looping on each folder\n"; + +my $begin_transfer_time = time ; + + +my %uid_candidate_for_deletion ; +my %uid_candidate_no_deletion ; + +FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { + + last FOLDER if $imap1->IsUnconnected(); + last FOLDER if $imap2->IsUnconnected(); + + my $h2_fold = imap2_folder_name( $h1_fold ) ; + #relogin1( ) if ( $relogin1 ) ; + printf( "%-35s -> %-35s\n", "[$h1_fold]", "[$h2_fold]" ) ; + + # host1 can not be fetched read only, select is needed because of expunge. + select_folder( $imap1, $h1_fold, 'Host1' ) or next FOLDER ; + #examine_folder( $imap1, $h1_fold, 'Host1' ) or next FOLDER ; + + + if ( ! exists( $h2_folders_all{ $h2_fold } ) ) { + create_folder( $imap2, $h2_fold, $h1_fold ) or next FOLDER ; + } + + acls_sync( $h1_fold, $h2_fold ) ; + + # Sometimes the folder on host2 is listed (it exists) but is + # not selectable but becomes selectable by a create (Gmail) + select_folder( $imap2, $h2_fold, 'Host2' ) + or ( create_folder( $imap2, $h2_fold, $h1_fold ) + and select_folder( $imap2, $h2_fold, 'Host2' ) ) + or next FOLDER ; + my @select_results = $imap2->Results( ) ; + + #print "%%% @select_results\n" ; + my $permanentflags2 = permanentflags( @select_results ) ; + ( $debug or $debugflags ) and print "permanentflags: $permanentflags2\n" ; + + if ( $expunge or $expunge1 ){ + print "Expunging host1 $h1_fold $dry_message\n" ; + unless($dry) { $imap1->expunge() } ; + #print "Expunging host2 $h2_fold\n" ; + #unless($dry) { $imap2->expunge() } ; + } + + if ( ( ( $subscribe and exists $h1_subscribed_folder{ $h1_fold } ) or $subscribe_all ) + and not exists( $h2_subscribed_folder{ $h2_fold } ) ) { + print "Subscribing to folder $h2_fold on destination server\n" ; + unless( $dry ) { $imap2->subscribe( $h2_fold ) } ; + } + + next FOLDER if ($justfolders); + + last FOLDER if $imap1->IsUnconnected(); + last FOLDER if $imap2->IsUnconnected(); + + my $h1_msgs_all_hash_ref = { } ; + my @h1_msgs = select_msgs( $imap1, $h1_msgs_all_hash_ref, $search1, $h1_fold ); + last FOLDER if $imap1->IsUnconnected(); + + my $h1_msgs_nb = scalar( @h1_msgs ) ; + $h1{ $h1_fold }{ 'messages_nb' } = $h1_msgs_nb ; + + ( $debug or $debugLIST ) and print "Host1 LIST: $h1_msgs_nb messages [@h1_msgs]\n" ; + $debug and print "Host1 selecting messages of folder [$h1_fold] took ", timenext(), " s\n"; + + my $h2_msgs_all_hash_ref = { } ; + my @h2_msgs = select_msgs( $imap2, $h2_msgs_all_hash_ref, $search2, $h2_fold ) ; + last FOLDER if $imap2->IsUnconnected(); + + my $h2_msgs_nb = scalar( @h2_msgs ) ; + $h2{ $h2_fold }{ 'messages_nb' } = $h2_msgs_nb ; + + ( $debug or $debugLIST ) and print "Host2 LIST: $h2_msgs_nb messages [@h2_msgs]\n"; + $debug and print "Host2 selecting messages of folder [$h2_fold] took ", timenext(), " s\n"; + + my $cache_base = "$tmpdir/imapsync_cache/$host1/$user1/$host2/$user2" ; + my $cache_dir = cache_folder( $cache_base, $h1_fold, $h2_fold ) ; + my ( $cache_1_2_ref, $cache_2_1_ref ) = ( {}, {} ) ; + + my $h1_uidvalidity = $imap1->uidvalidity( ) || '' ; + my $h2_uidvalidity = $imap2->uidvalidity( ) || '' ; + + last FOLDER if $imap1->IsUnconnected() ; + last FOLDER if $imap2->IsUnconnected() ; + + if ( $usecache ) { + print "cache directory: $cache_dir\n" ; + mkpath( "$cache_dir" ) ; + ( $cache_1_2_ref, $cache_2_1_ref ) + = get_cache( $cache_dir, \@h1_msgs, \@h2_msgs, $h1_msgs_all_hash_ref, $h2_msgs_all_hash_ref ) ; + print "CACHE h1 h2: ", scalar( keys %$cache_1_2_ref ), " files\n" ; + $debug and print '[', + map ( { "$_->$cache_1_2_ref->{$_} " } keys %$cache_1_2_ref ), " ]\n"; + } + + my %h1_hash = (); + my %h2_hash = (); + + my ( %h1_msgs, %h2_msgs ) ; + @h1_msgs{ @h1_msgs } = (); + @h2_msgs{ @h2_msgs } = (); + + my @h1_msgs_in_cache = sort { $a <=> $b } keys %$cache_1_2_ref ; + my @h2_msgs_in_cache = keys %$cache_2_1_ref ; + + my ( %h1_msgs_not_in_cache, %h2_msgs_not_in_cache ) ; + %h1_msgs_not_in_cache = %h1_msgs ; + %h2_msgs_not_in_cache = %h2_msgs ; + delete @h1_msgs_not_in_cache{ @h1_msgs_in_cache } ; + delete @h2_msgs_not_in_cache{ @h2_msgs_in_cache } ; + + my @h1_msgs_not_in_cache = keys %h1_msgs_not_in_cache ; + #print "h1_msgs_not_in_cache: [@h1_msgs_not_in_cache]\n" ; + my @h2_msgs_not_in_cache = keys %h2_msgs_not_in_cache ; + + my @h2_msgs_delete2_not_in_cache = () ; + %h1_msgs_copy_by_uid = ( ) ; + + if ( $useuid ) { + # use uid so we have to avoid getting header + @h1_msgs_copy_by_uid{ @h1_msgs_not_in_cache } = ( ) ; + @h2_msgs_delete2_not_in_cache = @h2_msgs_not_in_cache if $usecache ; + @h1_msgs_not_in_cache = ( ) ; + @h2_msgs_not_in_cache = ( ) ; + + #print "delete2: @h2_msgs_delete2_not_in_cache\n"; + } + + $debug and print "Host1 parsing headers of folder [$h1_fold]\n"; + + my ($h1_heads_ref, $h1_fir_ref) = ({}, {}); + $h1_heads_ref = $imap1->parse_headers([@h1_msgs_not_in_cache], @useheader) if (@h1_msgs_not_in_cache); + $debug and print "Host1 parsing headers of folder [$h1_fold] took ", timenext(), " s\n"; + + @$h1_fir_ref{@h1_msgs} = (undef); + + $debug and print "Host1 getting flags idate and sizes of folder [$h1_fold]\n" ; + if ( $abletosearch ) { + $h1_fir_ref = $imap1->fetch_hash( \@h1_msgs, "FLAGS", "INTERNALDATE", "RFC822.SIZE", $h1_fir_ref ) + if ( @h1_msgs ) ; + }else{ + my $uidnext = $imap1->uidnext( $h1_fold ) || $uidnext_default ; + $h1_fir_ref = $imap1->fetch_hash( "1:$uidnext", "FLAGS", "INTERNALDATE", "RFC822.SIZE", $h1_fir_ref ) + if ( @h1_msgs ) ; + } + $debug and print "Host1 getting flags idate and sizes of folder [$h1_fold] took ", timenext(), " s\n"; + unless ($h1_fir_ref) { + print + "Host1 folder $h1_fold: Could not fetch_hash ", + scalar(@h1_msgs), " msgs: ", $imap1->LastError || '', "\n"; + $nb_errors++; + next FOLDER; + } + + my @h1_msgs_duplicate; + foreach my $m (@h1_msgs_not_in_cache) { + my $rc = parse_header_msg($imap1, $m, $h1_heads_ref, $h1_fir_ref, 'Host1', \%h1_hash); + if (! defined($rc)) { + my $h1_size = $h1_fir_ref->{$m}->{"RFC822.SIZE"} || 0; + print "Host1 $h1_fold/$m size $h1_size ignored (no wanted headers so we ignore this message. To solve this: use --addheader)\n" ; + $total_bytes_skipped += $h1_size; + $nb_msg_skipped += 1; + $h1_nb_msg_noheader +=1; + $h1_nb_msg_processed +=1 ; + } elsif(0 == $rc) { + # duplicate + push(@h1_msgs_duplicate, $m); + # duplicate, same id same size? + my $h1_size = $h1_fir_ref->{$m}->{"RFC822.SIZE"} || 0; + $nb_msg_skipped += 1; + $h1_total_bytes_duplicate += $h1_size; + $h1_nb_msg_duplicate += 1; + $h1_nb_msg_processed +=1 ; + } + } + my $h1_msgs_duplicate_nb = scalar( @h1_msgs_duplicate ) ; + $h1{ $h1_fold }{ 'duplicates_nb' } = $h1_msgs_duplicate_nb ; + + $debug and print "Host1 selected: $h1_msgs_nb duplicates: $h1_msgs_duplicate_nb\n" ; + $debug and print "Host1 whole time parsing headers took ", timenext(), " s\n"; + + $debug and print "Host2 parsing headers of folder [$h2_fold]\n"; + + my ($h2_heads_ref, $h2_fir_ref) = ( {}, {} ); + $h2_heads_ref = $imap2->parse_headers([@h2_msgs_not_in_cache], @useheader) if (@h2_msgs_not_in_cache); + $debug and print "Host2 parsing headers of folder [$h2_fold] took ", timenext(), " s\n" ; + + $debug and print "Host2 getting flags idate and sizes of folder [$h2_fold]\n" ; + @$h2_fir_ref{@h2_msgs} = ( ); # fetch_hash can select by uid with last arg as ref + + + if ( $abletosearch ) { + $h2_fir_ref = $imap2->fetch_hash( \@h2_msgs, "FLAGS", "INTERNALDATE", "RFC822.SIZE", $h2_fir_ref) + if (@h2_msgs) ; + }else{ + my $uidnext = $imap2->uidnext( $h2_fold ) || $uidnext_default ; + $h2_fir_ref = $imap2->fetch_hash( "1:$uidnext", "FLAGS", "INTERNALDATE", "RFC822.SIZE", $h2_fir_ref ) + if ( @h2_msgs ) ; + } + + $debug and print "Host2 getting flags idate and sizes of folder [$h2_fold] took ", timenext(), " s\n" ; + + my @h2_msgs_duplicate; + foreach my $m (@h2_msgs_not_in_cache) { + my $rc = parse_header_msg($imap2, $m, $h2_heads_ref, $h2_fir_ref, 'Host2', \%h2_hash); + my $h2_size = $h2_fir_ref->{$m}->{"RFC822.SIZE"} || 0; + if (! defined($rc)) { + print "Host2 $h2_fold/$m size $h2_size ignored (no wanted headers so we ignore this message)\n" ; + $h2_nb_msg_noheader += 1 ; + } elsif(0 == $rc) { + # duplicate + $h2_nb_msg_duplicate += 1; + $h2_total_bytes_duplicate += $h2_size; + push(@h2_msgs_duplicate, $m); + } + } + my $h2_msgs_duplicate_nb = scalar( @h2_msgs_duplicate ) ; + $h2{ $h2_fold }{ 'duplicates_nb' } = $h2_msgs_duplicate_nb ; + + print "Host2 folder $h2_fold selected: $h2_msgs_nb messages, duplicates: $h2_msgs_duplicate_nb\n" + if ( $debug or $delete2duplicates or $h2_msgs_duplicate_nb ) ; + $debug and print "Host2 whole time parsing headers took ", timenext(), " s\n"; + + $debug and print "++++ Verifying [$h1_fold] -> [$h2_fold]\n"; + # messages in host1 that are not in host2 + + my @h1_hash_keys_sorted_by_uid + = sort {$h1_hash{$a}{'m'} <=> $h1_hash{$b}{'m'}} keys(%h1_hash); + + #print map { $h1_hash{$_}{'m'} . " "} @h1_hash_keys_sorted_by_uid; + + my @h2_hash_keys_sorted_by_uid + = sort {$h2_hash{$a}{'m'} <=> $h2_hash{$b}{'m'}} keys(%h2_hash); + + + if( $delete2duplicates and not exists( $h2_folders_from_1_several{ $h2_fold } ) ) { + my @h2_expunge ; + + foreach my $h2_msg ( @h2_msgs_duplicate ) { + print "msg $h2_fold/$h2_msg marked \\Deleted [duplicate] on host2 $dry_message\n" ; + push( @h2_expunge, $h2_msg ) if $uidexpunge2 ; + unless ( $dry ) { + $imap2->delete_message( $h2_msg ) ; + $h2_nb_msg_deleted += 1 ; + } + } + my $cnt = scalar @h2_expunge ; + if( @h2_expunge ) { + print "uidexpunge $cnt message(s) $dry_message\n" ; + $imap2->uidexpunge( \@h2_expunge ) if ! $dry ; + } + if ( $expunge2 ){ + print "Expunging host2 folder $h2_fold $dry_message\n" ; + $imap2->expunge( ) if ! $dry ; + } + } + + if( $delete2 and not exists( $h2_folders_from_1_several{ $h2_fold } ) ) { + # No host1 folders f1a f1b ... going all to same f2 (via --regextrans2) + my @h2_expunge; + foreach my $m_id (@h2_hash_keys_sorted_by_uid) { + #print "$m_id "; + unless (exists($h1_hash{$m_id})) { + my $h2_msg = $h2_hash{$m_id}{'m'}; + my $h2_flags = $h2_hash{$m_id}{'F'} || ""; + my $isdel = $h2_flags =~ /\B\\Deleted\b/x ? 1 : 0; + print "msg $h2_fold/$h2_msg marked \\Deleted on host2 [$m_id] $dry_message\n" + if ! $isdel; + push(@h2_expunge, $h2_msg) if $uidexpunge2; + unless ($dry or $isdel) { + $imap2->delete_message($h2_msg); + $h2_nb_msg_deleted += 1; + } + } + } + foreach my $h2_msg ( @h2_msgs_delete2_not_in_cache ) { + print "msg $h2_fold/$h2_msg marked \\Deleted [not in cache] on host2 $dry_message\n"; + push(@h2_expunge, $h2_msg) if $uidexpunge2; + unless ($dry) { + $imap2->delete_message($h2_msg); + $h2_nb_msg_deleted += 1; + } + } + my $cnt = scalar @h2_expunge ; + if( @h2_expunge ) { + print "uidexpunge $cnt message(s) $dry_message\n" ; + $imap2->uidexpunge( \@h2_expunge ) if ! $dry ; + } + if ($expunge2){ + print "Expunging host2 folder $h2_fold $dry_message\n" ; + $imap2->expunge( ) if ! $dry ; + } + } + + if( $delete2 and exists( $h2_folders_from_1_several{ $h2_fold } ) ) { + print "Host2 folder $h2_fold $h2_folders_from_1_several{ $h2_fold } folders left to sync there\n" ; + my @h2_expunge; + foreach my $m_id ( @h2_hash_keys_sorted_by_uid ) { + my $h2_msg = $h2_hash{ $m_id }{ 'm' } ; + unless ( exists( $h1_hash{ $m_id } ) ) { + my $h2_flags = $h2_hash{ $m_id }{ 'F' } || "" ; + my $isdel = $h2_flags =~ /\B\\Deleted\b/x ? 1 : 0 ; + unless ( $isdel ) { + $debug and print "msg $h2_fold/$h2_msg candidate for deletion on host2 [$m_id]\n" ; + $uid_candidate_for_deletion{ $h2_fold }{ $h2_msg }++ ; + } + }else{ + $debug and print "msg $h2_fold/$h2_msg will cancel deletion on host2 [$m_id]\n" ; + $uid_candidate_no_deletion{ $h2_fold }{ $h2_msg }++ ; + } + } + foreach my $h2_msg ( @h2_msgs_delete2_not_in_cache ) { + print "msg $h2_fold/$h2_msg candidate for deletion [not in cache] on host2\n"; + $uid_candidate_for_deletion{ $h2_fold }{ $h2_msg }++ ; + } + + foreach my $h2_msg ( @h2_msgs_in_cache ) { + print "msg $h2_fold/$h2_msg will cancel deletion [in cache] on host2\n"; + $uid_candidate_no_deletion{ $h2_fold }{ $h2_msg }++ ; + } + + + if ( 0 == $h2_folders_from_1_several{ $h2_fold } ) { + # last host1 folder going to $h2_fold + print "Last host1 folder going to $h2_fold\n" ; + foreach my $h2_msg ( keys %{ $uid_candidate_for_deletion{ $h2_fold } } ) { + $debug and print "msg $h2_fold/$h2_msg candidate for deletion on host2\n" ; + if ( exists( $uid_candidate_no_deletion{ $h2_fold }{ $h2_msg } ) ) { + $debug and print "msg $h2_fold/$h2_msg canceled deletion on host2\n" ; + }else{ + print "msg $h2_fold/$h2_msg marked \\Deleted on host2 $dry_message\n"; + push( @h2_expunge, $h2_msg ) if $uidexpunge2 ; + unless ( $dry ) { + $imap2->delete_message( $h2_msg ) ; + $h2_nb_msg_deleted += 1 ; + } + } + } + } + + my $cnt = scalar @h2_expunge ; + if( @h2_expunge ) { + print "uidexpunge $cnt message(s) $dry_message\n" ; + $imap2->uidexpunge( \@h2_expunge ) if ! $dry ; + } + if ( $expunge2 ) { + print "Expunging host2 folder $h2_fold $dry_message\n" ; + $imap2->expunge( ) if ! $dry ; + } + + $h2_folders_from_1_several{ $h2_fold }-- ; + } + + + my $h2_uidnext = $imap2->uidnext( $h2_fold ) ; + $debug and print "Host2 uidnext: $h2_uidnext\n" ; + $h2_uidguess = $h2_uidnext ; + MESS: foreach my $m_id (@h1_hash_keys_sorted_by_uid) { + last FOLDER if $imap1->IsUnconnected(); + last FOLDER if $imap2->IsUnconnected(); + #print "h1_nb_msg_processed: $h1_nb_msg_processed\n" ; + my $h1_size = $h1_hash{$m_id}{'s'}; + my $h1_msg = $h1_hash{$m_id}{'m'}; + my $h1_idate = $h1_hash{$m_id}{'D'}; + + unless (exists($h2_hash{$m_id})) { + # copy + my $h2_msg = copy_message( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) ; + if( $delete2 and exists( $h2_folders_from_1_several{ $h2_fold } ) and $h2_msg ) { + print "msg $h2_fold/$h2_msg will cancel deletion [fresh copy] on host2\n" ; + $uid_candidate_no_deletion{ $h2_fold }{ $h2_msg }++ ; + } + last FOLDER if total_bytes_max_reached( ) ; + next MESS; + } + else{ + # already on host2 + my $h2_msg = $h2_hash{$m_id}{'m'} ; + $debug and print "Host1 found msg $h1_fold/$h1_msg equals Host2 $h2_fold/$h2_msg\n" ; + $total_bytes_skipped += $h1_size ; + $nb_msg_skipped += 1 ; + $h1_nb_msg_processed +=1 ; + + if ( $usecache ) { + $debugcache and print "touch $cache_dir/${h1_msg}_$h2_msg\n" ; + touch( "$cache_dir/${h1_msg}_$h2_msg" ) + or croak( "Couldn't touch $cache_dir/${h1_msg}_$h2_msg" ) ; + } + } + + #$debug and print "MESSAGE $m_id\n"; + my $h2_msg = $h2_hash{$m_id}{'m'}; + + sync_flags_fir( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; + last FOLDER if $imap2->IsUnconnected() ; + # Good + my $h2_size = $h2_hash{$m_id}{'s'}; + $debug and print + "Host1 size msg $h1_fold/$h1_msg = $h1_size <> $h2_size = Host2 $h2_fold/$h2_msg\n"; + if( $delete ) { + my $expunge_message = '' ; + $expunge_message = "and expunged" if ( $expungeaftereach and ( $expunge or $expunge1 ) ) ; + print "Host1 msg $h1_fold/$h1_msg marked deleted $expunge_message $dry_message\n" ; + unless( $dry ) { + $imap1->delete_message( $h1_msg ) ; + $h1_nb_msg_deleted += 1 ; + $imap1->expunge() if ( $expungeaftereach and ( $expunge or $expunge1 ) ) ; + } + } + + } + # END MESS: loop + last FOLDER if $imap1->IsUnconnected(); + last FOLDER if $imap2->IsUnconnected(); + MESS_IN_CACHE: foreach my $h1_msg ( @h1_msgs_in_cache ) { + my $h2_msg = $cache_1_2_ref->{ $h1_msg } ; + $debugcache and print "cache messages update flags $h1_msg->$h2_msg\n"; + sync_flags_fir( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; + my $h1_size = $h1_fir_ref->{ $h1_msg }->{ 'RFC822.SIZE' } || 0 ; + $total_bytes_skipped += $h1_size; + $nb_msg_skipped += 1; + $h1_nb_msg_processed +=1 ; + last FOLDER if $imap2->IsUnconnected(); + } + + #print "Messages by uid: ", map { "$_ " } keys %h1_msgs_copy_by_uid, "\n" ; + MESS_BY_UID: foreach my $h1_msg ( sort { $a <=> $b } keys %h1_msgs_copy_by_uid ) { + # + $debug and print "Copy by uid $h1_fold/$h1_msg\n" ; + last FOLDER if $imap1->IsUnconnected(); + last FOLDER if $imap2->IsUnconnected(); + my $h2_msg = copy_message( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) ; + if( $delete2 and exists( $h2_folders_from_1_several{ $h2_fold } ) and $h2_msg ) { + print "msg $h2_fold/$h2_msg will cancel deletion [fresh copy] on host2\n" ; + $uid_candidate_no_deletion{ $h2_fold }{ $h2_msg }++ ; + } + last FOLDER if total_bytes_max_reached( ) ; + } + + if ($expunge or $expunge1){ + print "Expunging host1 folder $h1_fold $dry_message\n"; + unless($dry) { $imap1->expunge() }; + } + if ($expunge2){ + print "Expunging host2 folder $h2_fold $dry_message\n"; + unless($dry) { $imap2->expunge() }; + } + + $debug and print "Time: ", timenext(), " s\n"; +} + + +sub total_bytes_max_reached { + + return( 0 ) if not $exitwhenover ; + if ( $total_bytes_transferred >= $exitwhenover ) { + print "Maximum bytes transfered reached, $total_bytes_transferred >= $exitwhenover, ending sync\n" ; + return( 1 ) ; + } + +} + +print "++++ End looping on each folder\n"; +$debug and print "Time: ", timenext(), " s\n"; + +#print memory_consumption(); + + +if ( $foldersizesatend ) { + timenext() ; + ( $h1_nb_msg_end, $h1_bytes_end ) = foldersizes( "Host1", $imap1, $search1, @h1_folders_wanted ) ; + ( $h2_nb_msg_end, $h2_bytes_end ) = foldersizes( "Host2", $imap2, $search2, @h2_folders_from_1_wanted ) ; +} + +$imap1->logout( ) unless lost_connection($imap1, "for host1 [$host1]"); +$imap2->logout( ) unless lost_connection($imap2, "for host2 [$host2]"); + + +stats( ) ; +exit_clean( 1 ) if ( $nb_errors ) ; +exit_clean( 0 ) ; + +# END of main program + +# subroutines + + +sub size_filtered_flag { + my $h1_size = shift ; + + if (defined $maxsize and $h1_size >= $maxsize) { + return( 1 ) ; + } + if (defined $minsize and $h1_size <= $minsize) { + return( 1 ) ; + } + return( 0 ) ; +} + +sub sync_flags_fir { + my ( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) = @_ ; + + my $h1_size = $h1_fir_ref->{$h1_msg}->{"RFC822.SIZE"} ; + return( ) if size_filtered_flag( $h1_size ) ; + + # used cached flag values for efficiency + my $h1_flags = $h1_fir_ref->{ $h1_msg }->{ "FLAGS" } || '' ; + my $h2_flags = $h2_fir_ref->{ $h2_msg }->{ "FLAGS" } || '' ; + + sync_flags( $h1_fold, $h1_msg, $h1_flags, $h2_fold, $h2_msg, $h2_flags, $permanentflags2 ) ; + + return( ) ; +} + +sub sync_flags_after_copy { + my( $h1_fold, $h1_msg, $h1_flags, $h2_fold, $h2_msg, $permanentflags2 ) = @_ ; + + my @h2_flags = $imap2->flags( $h2_msg ) ; + my $h2_flags = "@h2_flags" ; + print "FLAGS $h2_msg: $h2_flags\n" ; + sync_flags( $h1_fold, $h1_msg, $h1_flags, $h2_fold, $h2_msg, $h2_flags, $permanentflags2 ) ; + return( ) ; +} + +sub sync_flags { + my( $h1_fold, $h1_msg, $h1_flags, $h2_fold, $h2_msg, $h2_flags, $permanentflags2 ) = @_ ; + + ( $debug or $debugflags ) and + print "Host1 flags init msg $h1_fold/$h1_msg flags( $h1_flags ) Host2 $h2_fold/$h2_msg flags( $h2_flags )\n" ; + + $h1_flags = flags_for_host2( $h1_flags, $permanentflags2 ) ; + + $h2_flags = flagsCase( $h2_flags ) ; + + ( $debug or $debugflags ) and + print "Host1 flags filt msg $h1_fold/$h1_msg flags( $h1_flags ) Host2 $h2_fold/$h2_msg flags( $h2_flags )\n" ; + + + # compare flags - set flags if there a difference + my @h1_flags = sort split(' ', $h1_flags ); + my @h2_flags = sort split(' ', $h2_flags ); + my $diff = compare_lists( \@h1_flags, \@h2_flags ); + + $diff and ( $debug or $debugflags ) + and print "Host2 flags msg $h2_fold/$h2_msg replacing h2 flags( $h2_flags ) with h1 flags( $h1_flags )\n"; + # This sets flags so flags can be removed with this + # When you remove a \Seen flag on host1 you want to it + # to be removed on host2. Just add flags is not what + # we need most of the time. + + if ( not $dry and $diff and not $imap2->store( $h2_msg, "FLAGS.SILENT (@h1_flags)" ) ) { + print "Host2 flags msg $h2_fold/$h2_msg could not add flags [@h1_flags]: ", + $imap2->LastError || '', "\n" ; + #$nb_errors++ ; + } + + return( ) ; +} + + + +sub _filter { + my $str = shift or return ""; + my $sz = 64; + my $len = length($str); + if ( not $debug and $len > $sz*2 ) { + my $beg = substr($str, 0, $sz); + my $end = substr($str, -$sz, $sz); + $str = $beg . "..." . $end; + } + $str =~ s/\012?\015$//x; + return "(len=$len) " . $str; +} + + + +sub lost_connection { + my($imap, $error_message) = @_; + if ( $imap->IsUnconnected() ) { + $nb_errors++; + my $lcomm = $imap->LastIMAPCommand || ""; + my $einfo = $imap->LastError || @{$imap->History}[-1] || ""; + + # if string is long try reduce to a more reasonable size + $lcomm = _filter($lcomm); + $einfo = _filter($einfo); + print("Failure: last command: $lcomm\n") if ($debug && $lcomm); + print("Failure: lost connection $error_message: ", $einfo, "\n"); + return(1); + } + else{ + return(0); + } +} + +sub max { + my @list = @_ ; + return( undef ) if ( 0 == scalar( @list ) ) ; + my @sorted = sort { $a <=> $b } @list ; + return( pop( @sorted ) ) ; +} + +sub tests_max { + ok( 0 == max(0), "max 0"); + ok( 1 == max(1), "max 1"); + ok( -1 == max(-1), "max -1"); + ok( not ( defined( max( ) ) ), "max no arg" ) ; + ok( 100 == max( 1, 100 ), "max 1 100" ) ; + ok( 100 == max( 100, 1 ), "max 100 1") ; + ok( 100 == max( 100, 42, 1 ), "max 100 42 1") ; + ok( 100 == max( 100, "42", 1 ), "max 100 42 1") ; + ok( 100 == max( "100", "42", 1 ), "max 100 42 1") ; + #ok( 100 == max( 100, "haha", 1 ), "max 100 42 1") ; + return( ) ; +} + +sub keyval { + my %hash = @_ ; + return( join( " ", map( { "$_ => " . $hash{ $_ } } keys %hash ) ) . "\n" ) ; +} + + + +sub check_lib_version { + $debug and print "IMAPClient $Mail::IMAPClient::VERSION\n"; + if ($Mail::IMAPClient::VERSION eq '2.2.9') { + print "imapsync no longer supports Mail::IMAPClient 2.2.9, upgrade it" ; + return( 0 ) ; + } + else{ + # 3.x.x is no longer buggy with imapsync. + return( 1 ) ; + } +} + +sub module_version_str { + my( $module_name, $module_version ) = @_ ; + my $str = sprintf( "%-20s %s\n", $module_name, $module_version ) ; + return( $str ) ; +} + +sub modules_VERSION { + + my @list_version; + + my $v ; + eval { require Mail::IMAPClient; $v = $Mail::IMAPClient::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'Mail::IMAPClient', $v ) ) ; + + eval { require IO::Socket; $v = $IO::Socket::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'IO::Socket', $v ) ) ; + + eval { require IO::Socket::IP; $v = $IO::Socket::IP::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'IO::Socket::IP', $v ) ) ; + + eval { require IO::Socket::INET; $v = $IO::Socket::INET::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'IO::Socket::INET', $v ) ) ; + + eval { require IO::Socket::SSL ; $v = $IO::Socket::SSL::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'IO::Socket::SSL ', $v ) ) ; + + eval { require Net::SSLeay ; $v = $Net::SSLeay::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'Net::SSLeay ', $v ) ) ; + + eval { require Digest::MD5; $v = $Digest::MD5::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'Digest::MD5', $v ) ) ; + + eval { require Digest::HMAC_MD5; $v = $Digest::HMAC_MD5::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'Digest::HMAC_MD5', $v ) ) ; + + eval { require Digest::HMAC_SHA1; $v = $Digest::HMAC_SHA1::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'Digest::HMAC_SHA1', $v ) ) ; + + eval { require Term::ReadKey; $v = $Term::ReadKey::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'Term::ReadKey', $v ) ) ; + + eval { require Authen::NTLM; $v = $Authen::NTLM::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'Authen::NTLM', $v ) ) ; + + eval { require File::Spec; $v = $File::Spec::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'File::Spec', $v ) ) ; + + eval { require Time::HiRes; $v = $Time::HiRes::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'Time::HiRes', $v ) ) ; + + eval { require URI::Escape; $v = $URI::Escape::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'URI::Escape', $v ) ) ; + + eval { require Data::Uniqid; $v = $Data::Uniqid::VERSION } or $v = "?" ; + push ( @list_version, module_version_str( 'Data::Uniqid', $v ) ) ; + + return( @list_version ) ; +} + + +# Construct a command line copy with passwords replaced by MASKED. +sub command_line_nopassword { + my @argv = @_; + my @argv_nopassword; + + return("@argv") if $showpasswords ; + while (@argv) { + my $arg = shift(@argv); # option name or value + if ($arg =~ m/-password[12]/x) { + shift(@argv); # password value + push(@argv_nopassword, $arg, "MASKED"); # option name and fake value + }else{ + push(@argv_nopassword, $arg); # same option or value + } + } + return("@argv_nopassword"); +} + +sub tests_command_line_nopassword { + + ok('' eq command_line_nopassword(), 'command_line_nopassword void'); + ok('--blabla' eq command_line_nopassword('--blabla'), 'command_line_nopassword --blabla'); + #print command_line_nopassword((qw{ --password1 secret1 })), "\n"; + ok('--password1 MASKED' eq command_line_nopassword(qw{ --password1 secret1}), 'command_line_nopassword --password1'); + ok('--blabla --password1 MASKED --blibli' + eq command_line_nopassword(qw{ --blabla --password1 secret1 --blibli }), 'command_line_nopassword --password1 --blibli'); + $showpasswords = 1 ; + ok('' eq command_line_nopassword(), 'command_line_nopassword void'); + ok('--blabla' eq command_line_nopassword('--blabla'), 'command_line_nopassword --blabla'); + #print command_line_nopassword((qw{ --password1 secret1 })), "\n"; + ok('--password1 secret1' eq command_line_nopassword(qw{ --password1 secret1}), 'command_line_nopassword --password1'); + ok('--blabla --password1 secret1 --blibli' + eq command_line_nopassword(qw{ --blabla --password1 secret1 --blibli }), 'command_line_nopassword --password1 --blibli'); + return( ) ; +} + +sub ask_for_password { + my ($user, $host) = @_; + print "What's the password for $user\@$host? "; + Term::ReadKey::ReadMode(2); + my $password = <>; + chomp $password; + printf "\n"; + Term::ReadKey::ReadMode(0); + return $password; +} + +sub catch_exit { + my $signame = shift ; + print "\nGot a SIG$signame!\n" ; + stats( ) ; + exit_clean( 6 ) ; + return( ) ; # fake, for perlcritic +} + +sub catch_continue { + my $signame = shift ; + print "\nGot a SIG$signame!\n" ; + return( ) ; +} + + + +sub connect_imap { + my( $host, $port, $mydebugimap, $ssl, $tls, $SSL_version ) = @_; + my $imap = Mail::IMAPClient->new(); + if ( $ssl ) { set_ssl( $imap, $ssl, $SSL_version ) } + $imap->Tls($tls) if ($tls); + $imap->Server($host); + $imap->Port($port); + $imap->Debug($mydebugimap); + $imap->connect() + or die_clean("Can not open imap connection on [$host]: $@\n"); + #myconnect($imap) + # or die_clean("Can not open imap connection on [$host]: $@\n"); + my $banner = $imap->Results()->[0] ; + $imap->Banner( $banner ) ; + $imap->starttls( ) if ( $imap->Tls( ) ) ; + return( $imap ) ; +} + +sub justconnect { + + $imap1 = connect_imap( $host1, $port1, $debugimap1, $ssl1, $tls1, $ssl1_SSL_version ) ; + print "Host1 software: ", server_banner( $imap1 ) ; + print "Host1 capability: ", join(" ", $imap1->capability( ) ), "\n" ; + $imap2 = connect_imap( $host2, $port2, $debugimap2, $ssl2, $tls2, $ssl2_SSL_version ) ; + print "Host2 software: ", server_banner( $imap2 ) ; + print "Host2 capability: ", join(" ", $imap2->capability( ) ), "\n" ; + $imap1->logout() ; + $imap2->logout() ; + return( ) ; +} + +sub relogin1 { + $imap1 = relogin_imap( + $imap1, + $host1, $port1, $user1, $domain1, $password1, + $debugimap1, $timeout, $fastio1, $ssl1, $tls1, + $authmech1, $authuser1, $reconnectretry1, + $proxyauth1, $uid1, $split1) ; + + $relogin1-- if ( $relogin1 ) ; + return( ) ; +} + +sub relogin2 { + $imap2 = relogin_imap( + $imap2, + $host2, $port2, $user2, $domain2, $password2, + $debugimap2, $timeout, $fastio2, $ssl2, $tls2, + $authmech2, $authuser2, $reconnectretry2, + $proxyauth2, $uid2, $split2) ; + + $relogin2-- if ( $relogin2 ) ; + return( ) ; +} + +sub relogin_imap { + my($imap, + $host, $port, $user, $domain, $password, + $mydebugimap, $mytimeout, $fastio, + $ssl, $tls, $authmech, $authuser, $reconnectretry, + $proxyauth, $uid, $split) = @_; + + my $folder_current = $imap->Folder ; + $imap->logout( ) ; + $imap = login_imap( + $host, $port, $user, $domain, $password, + $mydebugimap, $mytimeout, $fastio, + $ssl, $tls, $authmech, $authuser, $reconnectretry, + $proxyauth, $uid, $split + ) ; + $imap->select( $folder_current ) if defined( $folder_current ) ; + return( $imap ) ; +} + + +sub login_imap { + + my @allargs = @_ ; + my($host, $port, $user, $domain, $password, + $mydebugimap, $mytimeout, $fastio, + $ssl, $tls, $authmech, $authuser, $reconnectretry, + $proxyauth, $uid, $split, $Side, $SSL_version ) = @allargs ; + + my $side = lc( $Side ) ; + my $imap = init_imap( @allargs ) ; + + $imap->connect() + or die_clean("Failure: can not open imap connection on $side [$host] with user [$user]: $@\n"); + + my $banner = $imap->Results()->[0] ; + $imap->Banner( $banner ) ; + print "$Side: ", server_banner($imap); + + if ( $authmech eq 'PREAUTH' ) { + if ( $imap->IsAuthenticated( ) ) { + $imap->Socket ; + printf("%s: Assuming PREAUTH for %s\n", $Side, $imap->Server ) ; + }else{ + die_clean( "Failure: error login on $side [$host] with user [$user] auth [PREAUTH]" ) ; + } + } + + $imap->starttls( ) if ( $imap->Tls( ) ) ; + + authenticate_imap( $imap, @allargs ) ; + + print "$Side: success login on [$host] with user [$user] auth [$authmech]\n" ; + return( $imap ) ; +} + + +sub authenticate_imap { + + my($imap, + $host, $port, $user, $domain, $password, + $mydebugimap, $mytimeout, $fastio, + $ssl, $tls, $authmech, $authuser, $reconnectretry, + $proxyauth, $uid, $split, $Side ) = @_ ; + + check_capability( $imap, $authmech, $Side ) ; + + if ( $proxyauth ) { + $imap->Authmechanism("") ; + $imap->User($authuser) ; + } else { + $imap->Authmechanism( $authmech ) unless ( $authmech eq 'LOGIN' or $authmech eq 'PREAUTH' ) ; + $imap->User($user) ; + } + + $imap->Authcallback(\&xoauth) if $authmech eq "XOAUTH" ; + $imap->Authcallback(\&plainauth) if $authmech eq "PLAIN" || ($authmech eq "EXTERNAL") ; + +if ($proxyauth) { + $imap->User($authuser); + $imap->Domain($domain) if (defined($domain)); + $imap->Authuser($authuser); + if ($authmech eq "EXTERNAL") {$password = "NULL"}; + $imap->Password($password); + } else { + $imap->User($user); + $imap->Domain($domain) if (defined($domain)); + $imap->Authuser($authuser); + if ($authmech eq "EXTERNAL") {$password = "NULL"}; + $imap->Password($password); + } + + + +# $imap->Domain($domain) if (defined($domain)) ; +# $imap->Authuser($authuser) ; +# $imap->Password($password) ; + + unless ( $authmech eq 'PREAUTH' or $imap->login( ) ) { + my $info = "Failure: error login on [$host] with user [$user] auth" ; + my $einfo = $imap->LastError || @{$imap->History}[-1] ; + chomp( $einfo ) ; + my $error = "$info [$authmech]: $einfo\n" ; + if ( $authmech eq 'LOGIN' or $imap->IsUnconnected( ) or $authuser ) { + die_clean( $error ) ; + }else{ + print $error ; + } + print "Info: trying LOGIN Auth mechanism on [$host] with user [$user]\n" ; + $imap->Authmechanism("") ; + $imap->login() or + die_clean("$info [LOGIN]: ", $imap->LastError, "\n") ; + } + +# if ( $proxyauth ) { +# if ( ! $imap->proxyauth( $user ) ) { +# my $info = "Failure: error doing proxyauth as user [$user] on [$host] using proxy-login as [$authuser]" ; +# my $einfo = $imap->LastError || @{$imap->History}[-1] ; +# chomp( $einfo ) ; +# die_clean( "$info: $einfo\n" ) ; +# } +# } + + return( ) ; +} + +sub check_capability { + + my( $imap, $authmech, $Side ) = @_ ; + + if ($imap->has_capability("AUTH=$authmech") + or $imap->has_capability($authmech) + ) { + printf("%s: %s says it has CAPABILITY for AUTHENTICATE %s\n", + $Side, $imap->Server, $authmech); + } + else { + printf("%s: %s says it has NO CAPABILITY for AUTHENTICATE %s\n", + $Side, $imap->Server, $authmech); + if ($authmech eq 'PLAIN') { + print "$Side: frequently PLAIN is only supported with SSL, ", + "try --ssl or --tls options\n"; + } + } + return( ) ; +} + +sub set_ssl { + my ( $imap, $ssl, $SSL_version ) = @_ ; + # SSL_version can be + # SSLv3 SSLv2 SSLv23 SSLv23:!SSLv2 (last one is the default in IO-Socket-SSL-1.953) + # + $SSL_version = $SSL_version || '' ; + #print "[$SSL_version]\n" ; + IO::Socket::SSL::set_ctx_defaults( + SSL_verify_mode => 'SSL_VERIFY_PEER', + SSL_verifycn_scheme => 'imap', + SSL_version => $SSL_version, + ) ; + $imap->Ssl( $ssl ) ; + return( ) ; +} + +sub init_imap { + my($host, $port, $user, $domain, $password, + $mydebugimap, $mytimeout, $fastio, + $ssl, $tls, $authmech, $authuser, $reconnectretry, + $proxyauth, $uid, $split, $Side, $SSL_version ) = @_ ; + + my ( $imap ) ; + + $imap = Mail::IMAPClient->new() ; + + if ( $ssl ) { set_ssl( $imap, $ssl, $SSL_version ) } + $imap->Tls($tls) if ($tls); + $imap->Clear(1); + $imap->Server($host); + $imap->Port($port); + $imap->Fast_io($fastio); + $imap->Buffer($buffersize || 4096); + $imap->Uid($uid); + #$imap->Uid(0); + $imap->Peek(1); + $imap->Debug($mydebugimap); + defined( $mytimeout ) and $imap->Timeout($mytimeout); + + $imap->Reconnectretry($reconnectretry) if ($reconnectretry); + $imap->Ignoresizeerrors( $allowsizemismatch ) ; + $split and $imap->Maxcommandlength( 10 * $split ) ; + + + return( $imap ) ; + +} + +sub plainauth { + my $code = shift; + my $imap = shift; + + my $string = sprintf("%s\x00%s\x00%s", $imap->User, + $imap->Authuser, $imap->Password); + return encode_base64("$string", ""); +} + +# xoauth() thanks to Eduardo Bortoluzzi Junior +sub xoauth { + require URI::Escape ; + require Data::Uniqid ; + + my $code = shift; + my $imap = shift; + + # The base information needed to construct the OAUTH authentication + my $method = "GET"; + my $URL = sprintf("https://mail.google.com/mail/b/%s/imap/", $imap->User); + my $URLparm = sprintf("xoauth_requestor_id=%s", URI::Escape::uri_escape($imap->User)); + + # For Google Apps, the consumer key is the primary domain + # TODO: create a command line argument to define the consumer key + my @user_parts = split(/@/x, $imap->User); + $debug and print "XOAUTH: consumer key: $user_parts[1]\n"; + + # All the parameters needed to be signed on the XOAUTH + my %hash = (); + $hash { 'xoauth_requestor_id' } = URI::Escape::uri_escape($imap->User); + $hash { 'oauth_consumer_key' } = $user_parts[1]; + $hash { 'oauth_nonce' } = md5_hex(Data::Uniqid::uniqid(rand(), 1==1)); + $hash { 'oauth_signature_method' } = 'HMAC-SHA1'; + $hash { 'oauth_timestamp' } = time(); + $hash { 'oauth_version' } = '1.0'; + + # Base will hold the string to be signed + my $base = "$method&" . URI::Escape::uri_escape($URL) . "&"; + + # The parameters must be in dictionary order before signing + my $baseparms = ""; + foreach my $key (sort keys %hash) { + if(length($baseparms)>0) { + $baseparms .= "&"; + } + + $baseparms .= "$key=$hash{$key}"; + } + + $base .= URI::Escape::uri_escape($baseparms); + $debug and print "XOAUTH: base request to sign: $base\n"; + # Sign it with the consumer secret, informed on the command line (password) + my $digest = hmac_sha1($base, URI::Escape::uri_escape($imap->Password) . "&"); + + # The parameters signed become a parameter and... + $hash { 'oauth_signature' } = URI::Escape::uri_escape(substr(encode_base64($digest),0,-1)); + + # ... we don't need the requestor_id anymore. + delete $hash{'xoauth_requestor_id'}; + + # Create the final authentication string + my $string = $method . " " . $URL . "?" . $URLparm ." "; + + # All the parameters must be sorted + $baseparms = ""; + foreach my $key (sort keys %hash) { + if(length($baseparms)>0) { + $baseparms .= ","; + } + + $baseparms .= "$key=\"$hash{$key}\""; + } + + $string .= $baseparms; + + $debug and print "XOAUTH: authentication string: $string\n"; + + # It must be base64 encoded + return encode_base64("$string", ""); +} + +sub server_banner { + my $imap = shift; + my $banner = $imap->Banner() || "No banner\n"; + return $banner; + } + + +sub banner_imapsync { + + my @argv = @_ ; + my $banner_imapsync = join("", + '$RCSfile: imapsync,v $ ', + '$Revision: 1.564 $ ', + '$Date: 2013/08/18 19:28:47 $ ', + "\n",localhost_info(), "\n", + "Command line used:\n", + "$0 ", command_line_nopassword( @argv ), "\n", + ) ; + return( $banner_imapsync ) ; +} + +sub is_valid_directory { + my $dir = shift; + return(1) if (-d $dir and -r _ and -w _) ; + # Trying to create it + mkpath( $dir ) or croak "Error creating tmpdir $tmpdir : $!" ; + croak "Error with tmpdir $tmpdir : $!" if not (-d $dir and -r _ and -w _) ; + return( 1 ) ; +} + + +sub write_pidfile { + my $pid_filename = shift ; + + print "PID file is $pid_filename\n" ; + if ( -e $pid_filename and $pidfilelocking ) { + print "$pid_filename already exists, another imapsync may be curently running. Aborting imapsync.\n" ; + exit( 8 ) ; + } + if ( -e $pid_filename ) { + print "$pid_filename already exists, overwriting it\n" ; + } + my $FILE_HANDLE ; + open( $FILE_HANDLE, '>', $pid_filename ) or do { + print "Could not open $pid_filename for writing" ; + return ; + } ; + + print $FILE_HANDLE $PROCESS_ID ; + close $FILE_HANDLE ; + + return( $PROCESS_ID ) ; +} + +sub exit_clean { + my $status = shift ; + $status = defined( $status ) ? $status : 1 ; + unlink( $pidfile ) ; + exit( $status ) ; +} + +sub die_clean { + my @messages = @_ ; + unlink( $pidfile ) ; + croak @messages ; +} + +sub missing_option { + my ($option) = @_; + die_clean("$option option must be used, run $0 --help for help\n"); + return( ) ; +} + + +sub fix_Inbox_INBOX_mapping { + my( $h1_all, $h2_all ) = @_ ; + + my $regex = '' ; + SWITCH: { + if ( exists( $h1_all->{INBOX} ) and exists( $h2_all->{INBOX} ) ) { $regex = '' ; last SWITCH ; } ; + if ( exists( $h1_all->{Inbox} ) and exists( $h2_all->{Inbox} ) ) { $regex = '' ; last SWITCH ; } ; + if ( exists( $h1_all->{INBOX} ) and exists( $h2_all->{Inbox} ) ) { $regex = 's/^INBOX$/Inbox/x' ; last SWITCH ; } ; + if ( exists( $h1_all->{Inbox} ) and exists( $h2_all->{INBOX} ) ) { $regex = 's/^Inbox$/INBOX/x' ; last SWITCH ; } ; + } ; + return( $regex ) ; +} + +sub tests_fix_Inbox_INBOX_mapping { + + my( $h1_all, $h2_all ) ; + + $h1_all = { 'INBOX' => '' } ; + $h2_all = { 'INBOX' => '' } ; + ok( '' eq fix_Inbox_INBOX_mapping( $h1_all, $h2_all ), 'fix_Inbox_INBOX_mapping: INBOX INBOX' ) ; + + $h1_all = { 'Inbox' => '' } ; + $h2_all = { 'Inbox' => '' } ; + ok( '' eq fix_Inbox_INBOX_mapping( $h1_all, $h2_all ), 'fix_Inbox_INBOX_mapping: Inbox Inbox' ) ; + + $h1_all = { 'INBOX' => '' } ; + $h2_all = { 'Inbox' => '' } ; + ok( 's/^INBOX$/Inbox/x' eq fix_Inbox_INBOX_mapping( $h1_all, $h2_all ), 'fix_Inbox_INBOX_mapping: INBOX Inbox' ) ; + + $h1_all = { 'Inbox' => '' } ; + $h2_all = { 'INBOX' => '' } ; + ok( 's/^Inbox$/INBOX/x' eq fix_Inbox_INBOX_mapping( $h1_all, $h2_all ), 'fix_Inbox_INBOX_mapping: Inbox INBOX' ) ; + + $h1_all = { 'INBOX' => '' } ; + $h2_all = { 'rrrrr' => '' } ; + ok( '' eq fix_Inbox_INBOX_mapping( $h1_all, $h2_all ), 'fix_Inbox_INBOX_mapping: INBOX rrrrrr' ) ; + + $h1_all = { 'rrrrr' => '' } ; + $h2_all = { 'Inbox' => '' } ; + ok( '' eq fix_Inbox_INBOX_mapping( $h1_all, $h2_all ), 'fix_Inbox_INBOX_mapping: rrrrr Inbox' ) ; + + return( ) ; +} + +sub select_folder { + my ( $imap, $folder, $hostside ) = @_ ; + if ( ! $imap->select( $folder ) ) { + print + "$hostside folder $folder: Could not select: ", + $imap->LastError, "\n" ; + $nb_errors++ ; + return( 0 ) ; + }else{ + # ok select succeeded + return( 1 ) ; + } +} + +sub examine_folder { + my ( $imap, $folder, $hostside ) = @_ ; + if ( ! $imap->examine( $folder ) ) { + print + "$hostside folder $folder: Could not examine: ", + $imap->LastError, "\n" ; + $nb_errors++ ; + return( 0 ) ; + }else{ + # ok examine succeeded + return( 1 ) ; + } +} + + +sub create_folder { + my( $imap, $h2_fold, $h1_fold ) = @_ ; + + print "Creating folder [$h2_fold] on host2\n"; + if ( ( 'INBOX' eq uc( $h2_fold) ) + and ( $imap->exists( $h2_fold ) ) ) { + print "Folder [$h2_fold] already exists\n" ; + return( 1 ) ; + } + if ( ! $dry ){ + if ( ! $imap->create( $h2_fold ) ) { + print( "Couldn't create folder [$h2_fold] from [$h1_fold]: ", + $imap->LastError( ), "\n" ); + $nb_errors++; + # success if folder exists ("already exists" error) + return( 1 ) if $imap->exists( $h2_fold ) ; + # failure since create failed + return( 0 ); + }else{ + #create succeeded + return( 1 ); + } + }else{ + # dry mode, no folder so many imap will fail, assuming failure + return( 0 ); + } +} + + + +sub tests_folder_routines { + ok( !is_requested_folder('folder_foo'), 'is_requested_folder folder_foo 1' ); + ok( add_to_requested_folders('folder_foo'), 'add_to_requested_folders folder_foo' ); + ok( is_requested_folder('folder_foo'), 'is_requested_folder folder_foo 2' ); + ok( !is_requested_folder('folder_NO_EXIST'), 'is_requested_folder folder_NO_EXIST' ); + ok( !remove_from_requested_folders('folder_foo'), 'removed folder_foo' ); + ok( !is_requested_folder('folder_foo'), 'is_requested_folder folder_foo 3' ); + my @f ; + ok( @f = add_to_requested_folders('folder_bar', 'folder_toto'), "add result: @f" ); + ok( is_requested_folder('folder_bar'), 'is_requested_folder 4' ); + ok( is_requested_folder('folder_toto'), 'is_requested_folder 5' ); + ok( remove_from_requested_folders('folder_toto'), 'remove_from_requested_folders' ); + ok( !is_requested_folder('folder_toto'), 'is_requested_folder 6' ); + return( ) ; +} + + +sub is_requested_folder { + my ( $folder ) = @_; + + return( defined( $requested_folder{ $folder } ) ) ; +} + + +sub add_to_requested_folders { + my @wanted_folders = @_ ; + + foreach my $folder ( @wanted_folders ) { + ++$requested_folder{ $folder } ; + } + return( keys( %requested_folder ) ) ; +} + +sub remove_from_requested_folders { + my @wanted_folders = @_ ; + + foreach my $folder (@wanted_folders) { + delete $requested_folder{$folder} ; + } + return( keys( %requested_folder ) ) ; +} + +sub compare_lists { + my ($list_1_ref, $list_2_ref) = @_; + + return(-1) if ((not defined($list_1_ref)) and defined($list_2_ref)); + return(0) if ((not defined($list_1_ref)) and not defined($list_2_ref)); # end if no list + return(1) if (not defined($list_2_ref)); # end if only one list + + if (not ref($list_1_ref)) {$list_1_ref = [$list_1_ref]}; + if (not ref($list_2_ref)) {$list_2_ref = [$list_2_ref]}; + + + my $last_used_indice = -1; + #print "\$#$list_1_ref:", $#$list_1_ref, "\n"; + #print "\$#$list_2_ref:", $#$list_2_ref, "\n"; + ELEMENT: + foreach my $indice ( 0 .. $#$list_1_ref ) { + $last_used_indice = $indice; + + # End of list_2 + return 1 if ($indice > $#$list_2_ref); + + my $element_list_1 = $list_1_ref->[$indice]; + my $element_list_2 = $list_2_ref->[$indice]; + my $balance = $element_list_1 cmp $element_list_2 ; + next ELEMENT if ($balance == 0) ; + return $balance; + } + # each element equal until last indice of list_1 + return -1 if ($last_used_indice < $#$list_2_ref) ; + + # same size, each element equal + return 0 ; +} + +sub tests_compare_lists { + + + my $empty_list_ref = []; + + ok( 0 == compare_lists() , 'compare_lists, no args'); + ok( 0 == compare_lists(undef) , 'compare_lists, undef = nothing'); + ok( 0 == compare_lists(undef, undef) , 'compare_lists, undef = undef'); + ok(-1 == compare_lists(undef , []) , 'compare_lists, undef < []'); + ok(-1 == compare_lists(undef , [1]) , 'compare_lists, undef < [1]'); + ok(-1 == compare_lists(undef , [0]) , 'compare_lists, undef < [0]'); + ok(+1 == compare_lists([]) , 'compare_lists, [] > nothing'); + ok(+1 == compare_lists([], undef) , 'compare_lists, [] > undef'); + ok( 0 == compare_lists([] , []) , 'compare_lists, [] = []'); + + ok(-1 == compare_lists([] , [1]) , 'compare_lists, [] < [1]'); + ok(+1 == compare_lists([1] , []) , 'compare_lists, [1] > []'); + + + ok( 0 == compare_lists([1], 1 ) , "compare_lists, [1] = 1 ") ; + ok( 0 == compare_lists( 1 , [1]) , "compare_lists, 1 = [1]") ; + ok( 0 == compare_lists( 1 , 1 ) , "compare_lists, 1 = 1 ") ; + ok(-1 == compare_lists( 0 , 1 ) , "compare_lists, 0 < 1 ") ; + ok(-1 == compare_lists(-1 , 0 ) , "compare_lists, -1 < 0 ") ; + ok(-1 == compare_lists( 1 , 2 ) , "compare_lists, 1 < 2 ") ; + ok(+1 == compare_lists( 2 , 1 ) , "compare_lists, 2 > 1 ") ; + + + ok( 0 == compare_lists([1,2], [1,2]) , "compare_lists, [1,2] = [1,2]") ; + ok(-1 == compare_lists([1], [1,2]) , "compare_lists, [1] < [1,2]") ; + ok(+1 == compare_lists([2], [1,2]) , "compare_lists, [2] > [1,2]") ; + ok(-1 == compare_lists([1], [1,1]) , "compare_lists, [1] < [1,1]") ; + ok(+1 == compare_lists([1, 1], [1]) , "compare_lists, [1, 1] > [1]") ; + ok( 0 == compare_lists([1 .. 20_000] , [1 .. 20_000]) + , "compare_lists, [1..20_000] = [1..20_000]") ; + ok(-1 == compare_lists([1], [3]) , 'compare_lists, [1] < [3]') ; + ok( 0 == compare_lists([2], [2]) , 'compare_lists, [0] = [2]') ; + ok(+1 == compare_lists([3], [1]) , 'compare_lists, [3] > [1]') ; + + ok(-1 == compare_lists(["a"], ["b"]) , 'compare_lists, ["a"] < ["b"]') ; + ok( 0 == compare_lists(["a"], ["a"]) , 'compare_lists, ["a"] = ["a"]') ; + ok( 0 == compare_lists(["ab"], ["ab"]) , 'compare_lists, ["ab"] = ["ab"]') ; + ok(+1 == compare_lists(["b"], ["a"]) , 'compare_lists, ["b"] > ["a"]') ; + ok(-1 == compare_lists(["a"], ["aa"]) , 'compare_lists, ["a"] < ["aa"]') ; + ok(-1 == compare_lists(["a"], ["a", "a"]), 'compare_lists, ["a"] < ["a", "a"]') ; + ok( 0 == compare_lists([split(" ", "a b")], ["a", "b"]), 'compare_lists, split') ; + ok( 0 == compare_lists([sort split(" ", "b a")], ["a", "b"]), 'compare_lists, sort split') ; + return( ) ; +} + + + +sub get_prefix { + my( $imap, $prefix_in, $prefix_opt ) = @_ ; + my( $prefix_out ) ; + + $debug and print "Getting prefix namespace\n" ; + if ( defined( $prefix_in ) ) { + print "Using [$prefix_in] given by $prefix_opt\n" ; + $prefix_out = $prefix_in ; + return( $prefix_out ) ; + } + $debug and print "Calling namespace capability\n" ; + if ( $imap->has_capability( "namespace" ) ) { + my $r_namespace = $imap->namespace( ) ; + $prefix_out = $r_namespace->[0][0][0] ; + return($prefix_out) ; + } + else{ + print + "No NAMESPACE capability in imap server ", + $imap->Server( ),"\n", + help_to_guess_prefix( $imap, $prefix_opt ) ; + exit_clean( 1 ) ; + } + return( ) ; +} + + +sub get_separator { + my($imap, $sep_in, $sep_opt) = @_; + my($sep_out); + + + if ( defined( $sep_in ) ) { + print "Using [$sep_in] given by $sep_opt\n" ; + $sep_out = $sep_in ; + return( $sep_out ) ; + } + $debug and print "Calling namespace capability\n" ; + if ($imap->has_capability( "namespace" ) ) { + $sep_out = $imap->separator( ) ; + return($sep_out) if defined $sep_out ; + print + "NAMESPACE request failed for ", + $imap->Server(), ": ", $imap->LastError, "\n", + help_to_guess_sep( $imap, $sep_opt ) ; + exit_clean( 1 ) ; + } + else{ + print + "No NAMESPACE capability in imap server ", + $imap->Server(),"\n", + help_to_guess_sep( $imap, $sep_opt ) ; + exit_clean( 1 ) ; + } + return( ) ; +} + +sub help_to_guess_sep { + my( $imap, $sep_opt ) = @_ ; + + my $help_to_guess_sep = "Give the separator character with the $sep_opt option,\n" + . "the folowing listing of folders may help you to find it:\n" + . folders_list_to_help($imap) + . "Most of the time it is character . or /\n" + . "so try $sep_opt . or $sep_opt /\n" ; + + return( $help_to_guess_sep ) ; +} + +sub help_to_guess_prefix { + my( $imap, $prefix_opt ) = @_ ; + + my $help_to_guess_prefix = "Give the prefix namespace with the $prefix_opt option,\n" + . "the folowing listing of folders may help you to find it:\n" + . folders_list_to_help( $imap ) + . "Most of the time it is INBOX. or an empty string\n" + . "so try $prefix_opt INBOX. or $prefix_opt" . '""' . "\n" ; + + return( $help_to_guess_prefix ) ; +} + + +sub folders_list_to_help { + my($imap) = @_ ; + + my @folders = $imap->folders ; + my $listing = join('', map { "[$_]\n" } @folders) ; + return( $listing ) ; +} + + +sub tests_separator_invert { + $fixslash2 = 0 ; + ok( not( defined( separator_invert( ) ) ), 'separator_invert: no args' ) ; + ok( not( defined( separator_invert( '' ) ) ), 'separator_invert: not enough args' ) ; + ok( not( defined( separator_invert( '', '' ) ) ), 'separator_invert: not enough args' ) ; + + ok( '' eq separator_invert( '', '', '' ), 'separator_invert: 3 empty strings' ) ; + ok( 'lalala' eq separator_invert( 'lalala', '', '' ), 'separator_invert: empty separator' ) ; + ok( 'lalala' eq separator_invert( 'lalala', '/', '/' ), 'separator_invert: same separator /' ) ; + ok( 'lal/ala' eq separator_invert( 'lal/ala', '/', '/' ), 'separator_invert: same separator / 2' ) ; + ok( 'lal.ala' eq separator_invert( 'lal/ala', '/', '.' ), 'separator_invert: separators /.' ) ; + ok( 'lal/ala' eq separator_invert( 'lal.ala', '.', '/' ), 'separator_invert: separators ./' ) ; + ok( 'la.l/ala' eq separator_invert( 'la/l.ala', '.', '/' ), 'separator_invert: separators ./' ) ; + + ok( 'l/al.ala' eq separator_invert( 'l.al/ala', '/', '.' ), 'separator_invert: separators /.' ) ; + $fixslash2 = 1 ; + ok( 'l_al.ala' eq separator_invert( 'l.al/ala', '/', '.' ), 'separator_invert: separators /.' ) ; + + return( ) ; +} + +sub separator_invert { + my( $h1_fold, $h1_separator, $h2_separator ) = @_ ; + + return( undef ) if ( not defined( $h1_fold ) or not defined( $h1_separator ) or not defined( $h2_separator ) ) ; + # The separator we hope we'll never encounter: 00000000 == 0x00 + my $o_sep="\000" ; + + my $h2_fold = $h1_fold ; + $h2_fold =~ s@\Q$h2_separator@$o_sep@xg ; + $h2_fold =~ s@\Q$h1_separator@$h2_separator@xg ; + $h2_fold =~ s@\Q$o_sep@$h1_separator@xg ; + $h2_fold =~ s,/,_,xg if( $fixslash2 and '/' ne $h2_separator and '/' eq $h1_separator ) ; + return( $h2_fold ) ; +} + + +sub tests_imap2_folder_name { + +$h1_prefix = $h2_prefix = ''; +$h1_sep = '/'; +$h2_sep = '.'; + +$debug and print <<"EOS" +prefix1: [$h1_prefix] +prefix2: [$h2_prefix] +sep1:[$h1_sep] +sep2:[$h2_sep] +EOS +; + +$fixslash2 = 0 ; +ok('' eq imap2_folder_name(''), 'imap2_folder_name: empty string'); +ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla'); +ok('spam.spam' eq imap2_folder_name('spam/spam'), 'imap2_folder_name: spam/spam'); +ok('spam/spam' eq imap2_folder_name('spam.spam'), 'imap2_folder_name: spam.spam'); +ok('spam.spam/spam' eq imap2_folder_name('spam/spam.spam'), 'imap2_folder_name: spam/spam.spam'); +ok('s pam.spam/sp am' eq imap2_folder_name('s pam/spam.sp am'), 'imap2_folder_name: s pam/spam.sp am'); +@regextrans2 = ('s,/,X,g'); +ok('' eq imap2_folder_name(''), 'imap2_folder_name: empty string [s,/,X,g]'); +ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla [s,/,X,g]'); +ok('spam.spam' eq imap2_folder_name('spam/spam'), 'imap2_folder_name: spam/spam [s,/,X,g]'); +ok('spamXspam' eq imap2_folder_name('spam.spam'), 'imap2_folder_name: spam.spam [s,/,X,g]'); +ok('spam.spamXspam' eq imap2_folder_name('spam/spam.spam'), 'imap2_folder_name: spam/spam.spam [s,/,X,g]'); + +@regextrans2 = ('s, ,_,g'); +ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla [s, ,_,g]'); +ok('bla_bla' eq imap2_folder_name('bla bla'), 'imap2_folder_name: blabla [s, ,_,g]'); + +@regextrans2 = ('s,(.*),\U$1,'); +ok('BLABLA' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla [s,\U(.*)\E,$1,]'); + +$fixslash2 = 1 ; +@regextrans2 = ( ) ; +ok('' eq imap2_folder_name(''), 'imap2_folder_name: empty string'); +ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla'); +ok('spam.spam' eq imap2_folder_name('spam/spam'), 'imap2_folder_name: spam/spam -> spam.spam'); +ok('spam_spam' eq imap2_folder_name('spam.spam'), 'imap2_folder_name: spam.spam -> spam_spam'); +ok('spam.spam_spam' eq imap2_folder_name('spam/spam.spam'), 'imap2_folder_name: spam/spam.spam -> spam.spam_spam'); +ok('s pam.spam_spa m' eq imap2_folder_name('s pam/spam.spa m'), 'imap2_folder_name: s pam/spam.spa m -> s pam.spam_spa m'); + +$h1_sep = '.'; +$h2_sep = '/'; +ok('' eq imap2_folder_name(''), 'imap2_folder_name: empty string'); +ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla'); +ok('spam.spam' eq imap2_folder_name('spam/spam'), 'imap2_folder_name: spam/spam -> spam.spam'); +ok('spam/spam' eq imap2_folder_name('spam.spam'), 'imap2_folder_name: spam.spam -> spam/spam'); +ok('spam.spam/spam' eq imap2_folder_name('spam/spam.spam'), 'imap2_folder_name: spam/spam.spam -> spam.spam/spam'); + +$fixslash2 = 0 ; +$h1_prefix = ' '; + +ok('spam.spam/spam' eq imap2_folder_name('spam/spam.spam'), 'imap2_folder_name: spam/spam.spam -> spam.spam/spam'); +ok('spam.spam/spam' eq imap2_folder_name(' spam/spam.spam'), 'imap2_folder_name: spam/spam.spam -> spam.spam/spam'); + + +return( ) ; + +} + +sub imap2_folder_name { + my ( $x_fold ) = @_ ; + my ( $h2_fold ) ; + # first we remove the prefix + $x_fold =~ s/^\Q$h1_prefix\E//x ; + $debug and print "removed host1 prefix: [$x_fold]\n"; + $h2_fold = separator_invert($x_fold,$h1_sep, $h2_sep); + $debug and print "inverted separators: [$h2_fold]\n"; + # Adding the prefix supplied by namespace or the --prefix2 option + $h2_fold = $h2_prefix . $h2_fold + unless(($h2_prefix eq "INBOX" . $h2_sep) and ($h2_fold =~ m/^INBOX$/xi)); + $debug and print "added host2 prefix: [$h2_fold]\n"; + + # Transforming the folder name by the --regextrans2 option(s) + foreach my $regextrans2 (@regextrans2) { + my $h2_fold_before = $h2_fold; + my $ret = eval( "\$h2_fold =~ $regextrans2 ; 1 ") ; + $debug and print "[$h2_fold_before] -> [$h2_fold] using re [$regextrans2]\n" ; + if ( not ( defined( $ret ) ) or $@ ) { + die_clean("error: eval regextrans2 '$regextrans2': $@\n") ; + } + } + return($h2_fold); +} + +sub tests_decompose_regex { + ok( 1, 'decompose_regex 1' ) ; + ok( 0 == compare_lists( [ '', '' ], [ decompose_regex( '' ) ] ), 'decompose_regex empty string' ) ; + ok( 0 == compare_lists( [ '.*', 'lala' ], [ decompose_regex( 's/.*/lala/' ) ] ), 'decompose_regex s/.*/lala/' ) ; + return( ) ; +} + +sub decompose_regex { + my $regex = shift ; + my( $left_part, $right_part ) ; + + ( $left_part, $right_part ) = $regex =~ m{^s/((?:[^/]|\\/)+)/((?:[^/]|\\/)+)/}x; + return( '', '' ) if not $left_part ; + return( $left_part, $right_part ) ; +} + + +sub foldersizes { + + my ( $side, $imap, $search_cmd, @folders ) = @_ ; + my $total_size = 0 ; + my $total_nb = 0 ; + my $biggest_in_all = 0 ; + + print "++++ Calculating sizes on $side\n" ; + foreach my $folder ( @folders ) { + my $stot = 0 ; + my $nb_msgs = 0 ; + printf( "$side folder %-35s", "[$folder]" ) ; + if ( 'Host2' eq $side and not exists( $h2_folders_all{ $folder } ) ) { + print(" does not exist yet\n") ; + next ; + } + if ( 'Host1' eq $side and not exists( $h1_folders_all{ $folder } ) ) { + print( " does not exist\n" ) ; + next ; + } + + unless ( $imap->examine( $folder ) ) { + print + "$side Folder $folder: Could not examine: ", + $imap->LastError, "\n" ; + $nb_errors++ ; + next ; + } + + my $hash_ref = { } ; + my @msgs = select_msgs( $imap, undef, $search_cmd, $folder ) ; + $nb_msgs = scalar( @msgs ) ; + my $biggest_in_folder = 0 ; + @$hash_ref{ @msgs } = ( undef ) if @msgs ; + if ( $nb_msgs > 0 and @msgs ) { + if ( $abletosearch ) { + $imap->fetch_hash( \@msgs, "RFC822.SIZE", $hash_ref) or die_clean("$@" ) ; + }else{ + my $uidnext = $imap->uidnext( $folder ) || $uidnext_default ; + $imap->fetch_hash( "1:$uidnext", "RFC822.SIZE", $hash_ref ) or die_clean( "$@" ) ; + } + for ( keys %$hash_ref ) { + my $size = $hash_ref->{ $_ }->{ "RFC822.SIZE" } ; + $stot += $size ; + $biggest_in_folder = max( $biggest_in_folder, $size ) ; + } + } + + printf( " Size: %9s", $stot ) ; + printf( " Messages: %5s", $nb_msgs ) ; + printf( " Biggest: %9s\n", $biggest_in_folder ) ; + $total_size += $stot ; + $total_nb += $nb_msgs ; + $biggest_in_all = max( $biggest_in_all, $biggest_in_folder ) ; + } + printf ( "%s Nb messages: %11s messages\n", $side, $total_nb ) ; + printf ( "%s Total size: %11s bytes (%s)\n", $side, $total_size, bytes_display_string( $total_size ) ) ; + printf ( "%s Biggest message: %11s bytes (%s)\n", $side, $biggest_in_all, bytes_display_string( $biggest_in_all ) ) ; + printf ( "%s Time spent: %11.1f seconds\n", $side, timenext( ) ) ; + return( $total_nb, $total_size ) ; +} + +sub timenext { + my ( $timenow, $timediff ) ; + # $timebefore is global, beurk ! + $timenow = time ; + $timediff = $timenow - $timebefore ; + $timebefore = $timenow ; + return( $timediff ) ; +} + +sub timesince { + my $timeinit = shift ; + my ( $timenow, $timediff ) ; + $timenow = time ; + $timediff = $timenow - $timeinit ; + return( $timediff ) ; +} + + + + +sub tests_flags_regex { + + + ok('' eq flags_regex(''), "flags_regex, null string ''"); + ok('\Seen NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, nothing to do'); + + @regexflag = ('I am BAD' ) ; + ok( not ( defined( flags_regex( '' ) ) ), 'flags_regex, bad regex' ) ; + + @regexflag = ('s/NonJunk//g'); + ok('\Seen $Spam' eq flags_regex('\Seen NonJunk $Spam'), "flags_regex, remove NonJunk: 's/NonJunk//g'"); + @regexflag = ('s/\$Spam//g'); + ok('\Seen NonJunk ' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, remove $Spam: '."'s/\$Spam//g'"); + + @regexflag = ('s/\\\\Seen//g'); + + ok(' NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, remove \Seen: '. "'s/\\\\\\\\Seen//g'"); + + @regexflag = ('s/(\s|^)[^\\\\]\w+//g'); + ok('\Seen \Middle \End' eq flags_regex('\Seen NonJunk \Middle $Spam \End'), 'flags_regex, only \word [' . flags_regex('\Seen NonJunk \Middle $Spam \End'.']')); + ok(' \Seen \Middle \End1' eq flags_regex('Begin \Seen NonJunk \Middle $Spam \End1 End'), 'flags_regex, only \word [' . flags_regex('Begin \Seen NonJunk \Middle $Spam \End1 End'.']')); + + @regexflag = ('s/.*?(Keep1|Keep2|Keep3)/$1 /g'); + ok('Keep1 Keep2 ReB' eq flags_regex('ReA Keep1 REM Keep2 ReB'), "Keep only regex"); + #ok('Keep1 Keep2' eq flags_regex('Keep1 Keep2 Remove1'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('REM REM Keep1 Keep2'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('Keep1 REM REM Keep2'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM REM Keep2'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('Keep1 Keep2'), "Keep only regex"); + ok('Keep1 ' eq flags_regex('REM Keep1'), "Keep only regex"); + + @regexflag = ('s/(Keep1|Keep2|Keep3) (?!(Keep1|Keep2|Keep3)).*/$1 /g'); + ok('Keep1 Keep2 ' eq flags_regex('Keep1 Keep2 ReB'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('Keep1 Keep2 REM REM REM'), "Keep only regex"); + ok('Keep2 ' eq flags_regex('Keep2 REM REM REM'), "Keep only regex"); + #ok('' eq flags_regex('REM REM'), "Keep only regex"); + + @regexflag = ('s/.*?(Keep1|Keep2|Keep3)/$1 /g', + 's/(Keep1|Keep2|Keep3) (?!(Keep1|Keep2|Keep3)).*/$1 /g'); + ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2 REM'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('Keep1 REM Keep2 REM'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 Keep2 REM'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2'), "Keep only regex"); + ok('Keep1 Keep2 Keep3 ' eq flags_regex('REM Keep1 REM Keep2 REM REM Keep3 REM'), "Keep only regex"); + ok('Keep1 ' eq flags_regex('REM REM Keep1 REM REM REM '), "Keep only regex"); + ok('Keep1 Keep3 ' eq flags_regex('RE1 Keep1 RE2 Keep3 RE3 RE4 RE5 '), "Keep only regex"); + + @regexflag = ('s/(.*)/$1 jrdH8u/'); + ok('REM REM REM REM REM jrdH8u' eq flags_regex('REM REM REM REM REM'), "Keep only regex 's/(.*)/\$1 jrdH8u/'") ; + @regexflag = ('s/jrdH8u *//'); + ok('REM REM REM REM REM ' eq flags_regex('REM REM REM REM REM jrdH8u'), "Keep only regex s/jrdH8u *//") ; + + @regexflag = ( + 's/(.*)/$1 jrdH8u/', + 's/.*?(Keep1|Keep2|Keep3|jrdH8u)/$1 /g', + 's/(Keep1|Keep2|Keep3|jrdH8u) (?!(Keep1|Keep2|Keep3|jrdH8u)).*/$1 /g', + 's/jrdH8u *//' + ); + + ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2 REM'), "Keep only regex 'REM Keep1 REM Keep2 REM'"); + ok('Keep1 Keep2 ' eq flags_regex('Keep1 REM Keep2 REM'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 Keep2 REM'), "Keep only regex"); + ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2'), "Keep only regex"); + ok('Keep1 Keep2 Keep3 ' eq flags_regex('REM Keep1 REM Keep2 REM REM Keep3 REM'), "Keep only regex"); + ok('Keep1 ' eq flags_regex('REM REM Keep1 REM REM REM '), "Keep only regex"); + ok('Keep1 Keep3 ' eq flags_regex('RE1 Keep1 RE2 Keep3 RE3 RE4 RE5 '), "Keep only regex"); + ok('' eq flags_regex('REM REM REM REM REM'), "Keep only regex"); + + @regexflag = ( + 's/(.*)/$1 jrdH8u/', + 's/.*?(\\\\Seen|\\\\Answered|\\\\Flagged|\\\\Deleted|\\\\Draft|jrdH8u)/$1 /g', + 's/(\\\\Seen|\\\\Answered|\\\\Flagged|\\\\Deleted|\\\\Draft|jrdH8u) (?!(\\\\Seen|\\\\Answered|\\\\Flagged|\\\\Deleted|\\\\Draft|jrdH8u)).*/$1 /g', + 's/jrdH8u *//' + ); + + ok('\\Deleted \\Answered ' + eq flags_regex('Blabla $Junk \\Deleted machin \\Answered truc'), "Keep only regex: Exchange case"); + ok('' eq flags_regex(''), "Keep only regex: Exchange case, null string"); + ok('' + eq flags_regex('Blabla $Junk machin truc'), "Keep only regex: Exchange case, no accepted flags "); + ok('\\Deleted \\Answered \\Draft \\Flagged ' + eq flags_regex('\\Deleted \\Answered \\Draft \\Flagged '), "Keep only regex: Exchange case"); + + + @regexflag = ( + 's/.*?(?:(\\\\(?:Answered|Flagged|Deleted|Seen|Draft)\s?)|$)/defined($1)?$1:q()/eg' + ); + + ok('\\Deleted \\Answered ' + eq flags_regex('Blabla \$Junk \\Deleted machin \\Answered truc'), + "Keep only regex: Exchange case (Phil)"); + + ok('' eq flags_regex(''), "Keep only regex: Exchange case, null string (Phil)"); + + ok('' + eq flags_regex('Blabla $Junk machin truc'), + "Keep only regex: Exchange case, no accepted flags (Phil)"); + + ok('\\Deleted \\Answered \\Draft \\Flagged ' + eq flags_regex('\\Deleted \\Answered \\Draft \\Flagged '), + "Keep only regex: Exchange case (Phil)"); + + return( ) ; +} + +sub flags_regex { + my ( $h1_flags ) = @_ ; + foreach my $regexflag ( @regexflag ) { + my $h1_flags_orig = $h1_flags ; + $debugflags and print "eval \$h1_flags =~ $regexflag\n" ; + my $ret = eval( "\$h1_flags =~ $regexflag ; 1 " ) ; + $debugflags and print "regexflag $regexflag [$h1_flags_orig] -> [$h1_flags]\n" ; + if( not ( defined $ret ) or $@ ) { + print "Error: eval regexflag '$regexflag': $@\n" ; + return( undef ) ; + } + } + return( $h1_flags ) ; +} + +sub acls_sync { + my($h1_fold, $h2_fold) = @_ ; + if ( $syncacls ) { + my $h1_hash = $imap1->getacl($h1_fold) + or print "Could not getacl for $h1_fold: $@\n"; + my $h2_hash = $imap2->getacl($h2_fold) + or print "Could not getacl for $h2_fold: $@\n"; + my %users = map({ ($_, 1) } (keys(%$h1_hash), keys(%$h2_hash))); + foreach my $user (sort(keys(%users))) { + my $acl = $h1_hash->{$user} || "none"; + print "acl $user: [$acl]\n"; + next if ($h1_hash->{$user} && $h2_hash->{$user} && + $h1_hash->{$user} eq $h2_hash->{$user}); + unless ($dry) { + print "setting acl $h2_fold $user $acl\n"; + $imap2->setacl($h2_fold, $user, $acl) + or print "Could not set acl: $@\n"; + } + } + } + return( ) ; +} + + +sub tests_permanentflags { + + my $string; + ok('' eq permanentflags(' * OK [PERMANENTFLAGS (\* \Draft \Answered)] Limited'), + 'permanentflags \*'); + ok('\Draft \Answered' eq permanentflags(' * OK [PERMANENTFLAGS (\Draft \Answered)] Limited'), + 'permanentflags \Draft \Answered'); + ok('\Draft \Answered' + eq permanentflags('Blabla', + ' * OK [PERMANENTFLAGS (\Draft \Answered)] Limited', + 'Blabla'), + 'permanentflags \Draft \Answered' + ); + ok('' eq permanentflags('Blabla'), 'permanentflags nothing'); + return( ) ; +} + +sub permanentflags { + my @lines = @_ ; + + foreach my $line (@lines) { + if ( $line =~ m{\[PERMANENTFLAGS\s\(([^)]+?)\)\]}x ) { + ( $debugflags or $debug ) and print "permanentflags: $line" ; + my $permanentflags = $1 ; + if ( $permanentflags =~ m{\\\*}x ) { + $permanentflags = '' ; + } + return($permanentflags) ; + } ; + } + return( '' ) ; +} + +sub tests_flags_filter { + + ok( '\Seen' eq flags_filter('\Seen', '\Draft \Seen \Answered'), 'flags_filter ' ); + ok( '' eq flags_filter('\Seen', '\Draft \Answered'), 'flags_filter ' ); + ok( '\Seen' eq flags_filter('\Seen', '\Seen'), 'flags_filter ' ); + ok( '\Seen' eq flags_filter('\Seen', ' \Seen '), 'flags_filter ' ); + ok( '\Seen \Draft' + eq flags_filter('\Seen \Draft', '\Draft \Seen \Answered'), 'flags_filter ' ); + ok( '\Seen \Draft' + eq flags_filter('\Seen \Draft', ' \Draft \Seen \Answered '), 'flags_filter ' ); + return( ) ; +} + +sub flags_filter { + my( $flags, $allowed_flags ) = @_ ; + + my @flags = split( /\s+/x, $flags ) ; + my %allowed_flags = map { $_ => 1 } split(' ', $allowed_flags ) ; + my @flags_out = map { exists $allowed_flags{$_} ? $_ : () } @flags ; + + my $flags_out = join( ' ', @flags_out ) ; + #print "%%%$flags_out%%%\n" ; + return( $flags_out ) ; +} + +sub flagsCase { + my $flags = shift ; + + my @flags = split( /\s+/x, $flags ); + my %rfc_flags = map { $_ => 1 } split(' ', '\Answered \Flagged \Deleted \Seen \Draft' ); + my @flags_out = map { exists $rfc_flags{ ucsecond( lc( $_ ) ) } ? ucsecond( lc( $_ ) ) : $_ } @flags ; + + my $flags_out = join( ' ', @flags_out ) ; + #print "%%%$flags_out%%%\n" ; + return( $flags_out ) ; +} + +sub tests_flagsCase { + ok( '\Seen' eq flagsCase( '\Seen' ), 'flagsCase: \Seen -> \Seen' ) ; + ok( '\Seen' eq flagsCase( '\SEEN' ), 'flagsCase: \SEEN -> \Seen' ) ; + + ok( '\Seen \Draft' eq flagsCase( '\SEEN \DRAFT' ), 'flagsCase: \SEEN \DRAFT -> \Seen \Draft' ) ; + ok( '\Draft \Seen' eq flagsCase( '\DRAFT \SEEN' ), 'flagsCase: \DRAFT \SEEN -> \Draft \Seen' ) ; + + ok( '\Draft LALA \Seen' eq flagsCase( '\DRAFT LALA \SEEN' ), 'flagsCase: \DRAFT LALA \SEEN -> \Draft LALA \Seen' ) ; + ok( '\Draft lala \Seen' eq flagsCase( '\DRAFT lala \SEEN' ), 'flagsCase: \DRAFT lala \SEEN -> \Draft lala \Seen' ) ; + return( ) ; +} + +sub ucsecond { + my $string = shift ; + my $output ; + + return( $string ) if ( 1 >= length( $string ) ) ; + $output = substr( $string, 0, 1) . uc( substr( $string, 1, 1 ) ) if ( 2 == length( $string ) ) ; + $output = substr( $string, 0, 1) . uc( substr( $string, 1, 1 ) ) . substr( $string, 2 ); + #print "UUU $string -> $output\n" ; + return( $output ) ; +} + + +sub tests_ucsecond { + ok( 'aBcde' eq ucsecond( 'abcde' ), 'ucsecond: abcde -> aBcde' ) ; + ok( 'ABCDE' eq ucsecond( 'ABCDE' ), 'ucsecond: ABCDE -> ABCDE' ) ; + ok( 'ABCDE' eq ucsecond( 'AbCDE' ), 'ucsecond: AbCDE -> ABCDE' ) ; + ok( 'ABCde' eq ucsecond( 'AbCde' ), 'ucsecond: AbCde -> ABCde' ) ; + ok( 'A' eq ucsecond( 'A' ), 'ucsecond: A -> A' ) ; + ok( 'AB' eq ucsecond( 'Ab' ), 'ucsecond: Ab -> AB' ) ; + ok( '\B' eq ucsecond( '\b' ), 'ucsecond: \b -> \B' ) ; + ok( '\Bcde' eq ucsecond( '\bcde' ), 'ucsecond: \bcde -> \Bcde' ) ; + return( ) ; +} + + +sub select_msgs { + my ( $imap, $msgs_all_hash_ref, $search_cmd, $folder ) = @_ ; + my ( @msgs ) ; + + if ( $abletosearch ) { + @msgs = select_msgs_by_search( $imap, $msgs_all_hash_ref, $search_cmd, $folder ) ; + }else{ + @msgs = select_msgs_by_fetch( $imap, $msgs_all_hash_ref, $search_cmd, $folder ) ; + } + +} + +sub select_msgs_by_search { + my ( $imap, $msgs_all_hash_ref, $search_cmd, $folder ) = @_ ; + my ( @msgs, @msgs_all ) ; + + # Need to have the whole list in msgs_all_hash_ref + # without calling messages() several times. + # Need all messages list to avoid deleting useful cache part + # in case of --search or --minage or --maxage + + if ( ( defined( $msgs_all_hash_ref ) and $usecache ) + or ( not defined( $maxage ) and not defined( $minage ) and not defined( $search_cmd ) ) + ) { + + $debugdev and print "Calling messages()\n" ; + @msgs_all = $imap->messages() ; + + return if ( $#msgs_all == 0 && !defined( $msgs_all[0] ) ) ; + + if ( defined( $msgs_all_hash_ref ) ) { + @{ $msgs_all_hash_ref }{ @msgs_all } = () ; + } + # return all messages + if ( not defined( $maxage ) and not defined( $minage ) and not defined( $search_cmd ) ) { + return( @msgs_all ) ; + } + } + + if ( defined( $search_cmd ) ) { + @msgs = $imap->search( $search_cmd ) ; + return( @msgs ) ; + } + + # we are here only if $maxage or $minage is defined + @msgs = select_msgs_by_age( $imap ) ; + return( @msgs ); +} + + +sub select_msgs_by_fetch { + my ( $imap, $msgs_all_hash_ref, $search_cmd, $folder ) = @_ ; + my ( @msgs, @msgs_all, %fetch ) ; + + # Need to have the whole list in msgs_all_hash_ref + # without calling messages() several times. + # Need all messages list to avoid deleting useful cache part + # in case of --search or --minage or --maxage + + + $debugdev and print "Calling fetch_hash()\n" ; + my $uidnext = $imap->uidnext( $folder ) or return( ) ; + %fetch = %{$imap->fetch_hash( "1:$uidnext", "INTERNALDATE") } ; + @msgs_all = sort { $a <=> $b } keys( %fetch ) ; + $debugdev and print "Done fetch_hash()\n" ; + + return( ) if ( $#msgs_all == 0 && !defined( $msgs_all[0] ) ) ; + + if ( defined( $msgs_all_hash_ref ) ) { + @{ $msgs_all_hash_ref }{ @msgs_all } = () ; + } + # return all messages + if ( not defined( $maxage ) and not defined( $minage ) and not defined( $search_cmd ) ) { + return( @msgs_all ) ; + } + + if ( defined( $search_cmd ) ) { + print "Warning: strange to see --search with --noabletosearch, an error can happen\n" ; + @msgs = $imap->search( $search_cmd ) ; + return( @msgs ) ; + } + + # we are here only if $maxage or $minage is defined + my( @max, @min, $maxage_epoch, $minage_epoch ) ; + if ( defined( $maxage ) ) { $maxage_epoch = $timestart_int - 86400 * $maxage ; } + if ( defined( $minage ) ) { $minage_epoch = $timestart_int - 86400 * $minage ; } + foreach my $msg ( @msgs_all ) { + my $idate = $fetch{ $msg }->{'INTERNALDATE'} ; + #print "$idate\n" ; + if ( defined( $maxage ) and ( epoch( $idate ) >= $maxage_epoch ) ) { + push( @max, $msg ) ; + } + if ( defined( $minage ) and ( epoch( $idate ) <= $minage_epoch ) ) { + push( @min, $msg ) ; + } + } + @msgs = msgs_from_maxmin( \@max, \@min ) ; + return( @msgs ) ; +} + +sub select_msgs_by_age { + my( $imap ) = @_ ; + + my( @max, @min, @msgs, @inter, @union ) ; + + if ( defined( $maxage ) ) { + @max = $imap->sentsince( $timestart_int - 86400 * $maxage ) ; + } + if ( defined( $minage ) ) { + @min = $imap->sentbefore( $timestart_int - 86400 * $minage ) ; + } + + @msgs = msgs_from_maxmin( \@max, \@min ) ; + return( @msgs ) ; +} + +sub msgs_from_maxmin { + my( $max_ref, $min_ref ) = @_ ; + my( @max, @min, @msgs, @inter, @union ) ; + + @max = @$max_ref ; + @min = @$min_ref ; + + SWITCH: { + unless( defined( $minage ) ) { @msgs = @max ; last SWITCH } ; + unless( defined( $maxage ) ) { @msgs = @min ; last SWITCH } ; + my ( %union, %inter ) ; + foreach my $m ( @min, @max ) { $union{ $m }++ && $inter{ $m }++ } + @inter = sort { $a <=> $b } keys( %inter ) ; + @union = sort { $a <=> $b } keys( %union ) ; + # normal case + if ( $minage <= $maxage ) { @msgs = @inter ; last SWITCH } ; + # just exclude messages between + if ( $minage > $maxage ) { @msgs = @union ; last SWITCH } ; + + } + return( @msgs ); +} + +sub tests_msgs_from_maxmin { + my @msgs ; + $maxage = 200 ; + @msgs = msgs_from_maxmin( [ '1', '2' ], [ '2', '3' ] ) ; + ok( 0 == compare_lists( [ '1', '2' ], \@msgs ), 'msgs_from_maxmin: maxage++' ) ; + $minage = 100 ; + @msgs = msgs_from_maxmin( [ '1', '2' ], [ '2', '3' ] ) ; + ok( 0 == compare_lists( [ '2' ], \@msgs ), 'msgs_from_maxmin: -maxage++minage-' ) ; + $minage = 300 ; + @msgs = msgs_from_maxmin( [ '1', '2' ], [ '2', '3' ] ) ; + ok( 0 == compare_lists( [ '1', '2', '3' ], \@msgs ), 'msgs_from_maxmin: ++maxage-minage++' ) ; + $maxage = undef ; + @msgs = msgs_from_maxmin( [ '1', '2' ], [ '2', '3' ] ) ; + ok( 0 == compare_lists( [ '2', '3' ], \@msgs ), 'msgs_from_maxmin: ++minage-' ) ; +} + + +sub lastuid { + my $imap = shift ; + my $folder = shift ; + my $lastuid_guess = shift ; + my $lastuid ; + + # rfc3501: The only reliable way to identify recent messages is to + # look at message flags to see which have the \Recent flag + # set, or to do a SEARCH RECENT. + # SEARCH RECENT doesn't work this way on courrier. + + my @recent_messages ; + # SEARCH RECENT for each transfer can be expensive with a big folder + # Call commented for now + #@recent_messages = $imap->recent( ) ; + #print "Recent: @recent_messages\n"; + + my $max_recent ; + $max_recent = max( @recent_messages ) ; + + if ( defined( $max_recent ) and ($lastuid_guess <= $max_recent ) ) { + $lastuid = $max_recent ; + }else{ + $lastuid = $lastuid_guess + } + return( $lastuid ) ; +} + +sub size_filtered { + my( $h1_size, $h1_msg, $h1_fold, $h2_fold ) = @_ ; + + $h1_size = 0 if ( ! $h1_size ) ; # null if empty or undef + if (defined $maxsize and $h1_size > $maxsize) { + print "msg $h1_fold/$h1_msg skipped ($h1_size exceeds maxsize limit $maxsize bytes)\n"; + $total_bytes_skipped += $h1_size; + $nb_msg_skipped += 1; + return( 1 ) ; + } + if (defined $minsize and $h1_size <= $minsize) { + print "msg $h1_fold/$h1_msg skipped ($h1_size smaller than minsize $minsize bytes)\n"; + $total_bytes_skipped += $h1_size; + $nb_msg_skipped += 1; + return( 1 ) ; + } + return( 0 ) ; +} + +sub message_exists { + + my( $imap, $msg ) = @_ ; + return( 1 ) if not $imap->Uid( ) ; + + my $search_uid ; + ( $search_uid ) = $imap->search( "UID $msg" ) ; + #print "$search ? $msg\n" ; + return( 1 ) if ( $search_uid eq $msg ) ; + return( 0 ) ; + +} + +sub copy_message { + # copy + + my ( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) = @_ ; + ( $debug or $dry) and print "msg $h1_fold/$h1_msg copying to $h2_fold $dry_message\n"; + + my $h1_size = $h1_fir_ref->{$h1_msg}->{"RFC822.SIZE"} || '' ; + my $h1_flags = $h1_fir_ref->{$h1_msg}->{"FLAGS"} || '' ; + my $h1_idate = $h1_fir_ref->{$h1_msg}->{"INTERNALDATE"} || '' ; + + + if ( size_filtered( $h1_size, $h1_msg, $h1_fold, $h2_fold ) ) { + $h1_nb_msg_processed +=1 ; + return( ) ; + } + + do { print "SLEEP 5\n" and sleep 5 ; } if ( $debugsleep ) ; + print "- msg $h1_fold/$h1_msg S[$h1_size] F[$h1_flags] I[$h1_idate] has RFC822.SIZE null!\n" if ( ! $h1_size ) ; + + + if ( $checkmessageexists and not message_exists( $imap1, $h1_msg ) ) { + $h1_nb_msg_processed +=1 ; + return( ) ; + } + + my ( $string, $string_len ) ; + ( $string, $string_len ) = message_for_host2( $h1_msg, $h1_fold, $h1_size, $h1_flags, $h1_idate, $h1_fir_ref ) ; + + # Lines two long => do no copy + if ( ( defined ( $maxlinelength ) ) + and ( max_line_length( $string ) > $maxlinelength ) ) { + my $subject = subject( $string ) ; + #print "[$subject]\n" ; + print "- msg $h1_fold/$h1_msg skipped S[$h1_size] F[$h1_flags] I[$h1_idate] " + . "(Subject:[$subject]) (line length exceeds maxlinelength $maxlinelength bytes)\n" ; + return( ) ; + } + + my $h1_date = date_for_host2( $h1_msg, $h1_idate ) ; + + ( $debug or $debugflags ) and + print "Host1 flags init msg $h1_fold/$h1_msg date [$h1_date] flags [$h1_flags] size [$h1_size]\n" ; + + $h1_flags = flags_for_host2( $h1_flags, $permanentflags2 ) ; + + ( $debug or $debugflags ) and + print "Host1 flags filt msg $h1_fold/$h1_msg date [$h1_date] flags [$h1_flags] size [$h1_size]\n" ; + + $h1_date = undef if ($h1_date eq ""); + + my $new_id = append_message_on_host2( $string, $h1_fold, $h1_msg, $string_len, $h2_fold, $h1_size, $h1_flags, $h1_date, $cache_dir ) ; + + if ( $new_id and $syncflagsaftercopy ) { + sync_flags_after_copy( $h1_fold, $h1_msg, $h1_flags, $h2_fold, $new_id, $permanentflags2 ) ; + } + + + return( $new_id ) ; +} + +sub message_for_host2 { + my ( $h1_msg, $h1_fold, $h1_size, $h1_flags, $h1_idate, $h1_fir_ref ) = @_ ; + + my $string = $imap1->message_string( $h1_msg ) ; + + my $string_len = defined( $string ) ? length( $string ) : '' ; # length or empty string + #print "- msg $h1_fold/$h1_msg {$string_len}\n" ; + unless ( defined( $string ) and $string_len ) { # undef or 0 length + print + "- msg $h1_fold/$h1_msg {$string_len} S[$h1_size] F[$h1_flags] I[$h1_idate] could not be fetched: ", + $imap1->LastError || '', "\n" ; + $nb_errors++ ; + $total_bytes_error += $h1_size if ( $h1_size ) ; + #relogin1( ) if ( $relogin1 ) ; + $h1_nb_msg_processed +=1 ; + return( ) ; + } + + if ( @regexmess ) { + $string = regexmess( $string ) ; + # string undef means the eval regex was bad. + if ( not ( defined( $string ) ) ) { + print + "- msg $h1_fold/$h1_msg {$string_len} S[$h1_size] F[$h1_flags] I[$h1_idate]" + . " could not be transformed by --regexmess option\n" ; + return( ) ; + } + } + + if ( $addheader and defined $h1_fir_ref->{$h1_msg}->{"NO_HEADER"} ) { + my $header = add_header( $h1_msg ) ; + $debug and print "msg $h1_fold/$h1_msg adding custom header [$header]\n" ; + $string = $header . "\r\n" . $string ; + } + + + $debugcontent and print + "=" x80, "\n", + "F message content begin next line\n", + $string, + "F message content ended on previous line\n", "=" x 80, "\n"; + + return( $string, $string_len ) ; +} + +sub date_for_host2 { + my( $h1_msg, $h1_idate ) = @_ ; + + my $h1_date = "" ; + + if ( $syncinternaldates ) { + $h1_date = $h1_idate ; + $debug and print "internal date from host1: [$h1_date]\n" ; + $h1_date = good_date( $h1_date ) ; + $debug and print "internal date from host1: [$h1_date] (fixed)\n" ; + } + + if ( $idatefromheader ) { + $h1_date = $imap1->get_header($h1_msg,"Date") ; + $debug and print "header date from host1: [$h1_date]\n" ; + $h1_date = good_date( $h1_date ) ; + $debug and print "header date from host1: [$h1_date] (fixed)\n" ; + } + + return( $h1_date ) ; +} + +sub flags_for_host2 { + my( $h1_flags, $permanentflags2 ) = @_ ; + # RFC 2060: This flag can not be altered by any client + $h1_flags =~ s@\\Recent\s?@@xgi ; + my $h1_flags_re ; + if ( @regexflag and defined( $h1_flags_re = flags_regex( $h1_flags ) ) ) { + $h1_flags = $h1_flags_re ; + } + $h1_flags = flagsCase( $h1_flags ) if $flagsCase ; + $h1_flags = flags_filter( $h1_flags, $permanentflags2) if ( $permanentflags2 and $filterflags ) ; + + return( $h1_flags ) ; +} + +sub subject { + my $string = shift ; + my $subject = '' ; + + my $header = extract_header( $string ) ; + + if( $header =~ m/^Subject:\s*([^\n\r]*)\r?$/msx ) { + #print "MMM[$1]\n" ; + $subject = $1 ; + } + return( $subject ) ; +} + +sub tests_subject { + ok( '' eq subject( '' ), 'subject: null') ; + ok( 'toto le hero' eq subject( 'Subject: toto le hero' ), 'subject: toto le hero') ; + ok( 'toto le hero' eq subject( 'Subject:toto le hero' ), 'subject: toto le hero blank') ; + ok( 'toto le hero' eq subject( "Subject:toto le hero\r\n" ), 'subject: toto le hero\r\n') ; + + my $MESS ; + $MESS = <<'EOF'; +From: lalala +Subject: toto le hero +Date: zzzzzz + +Boogie boogie +EOF + ok( 'toto le hero' eq subject( $MESS ), 'subject: toto le hero 2') ; + + $MESS = <<'EOF'; +Subject: toto le hero +From: lalala +Date: zzzzzz + +Boogie boogie +EOF + ok( 'toto le hero' eq subject( $MESS ), 'subject: toto le hero 3') ; + + + $MESS = <<'EOF'; +From: lalala +Subject: cuicui +Date: zzzzzz + +Subject: toto le hero +EOF + ok( 'cuicui' eq subject( $MESS ), 'subject: cuicui') ; + + $MESS = <<'EOF'; +From: lalala +Date: zzzzzz + +Subject: toto le hero +EOF + ok( '' eq subject( $MESS ), 'subject: null but body could') ; + + +} + + +# GlobVar +# $dry +# $max_msg_size_in_bytes +# $imap2 +# $imap1 +# $nb_errors +# $total_bytes_error +# $h1_nb_msg_processed +# $h2_uidguess +# $total_bytes_transferred +# $nb_msg_transferred +# $begin_transfer_time +# $time_spent +# ... +# +# +sub append_message_on_host2 { + my( $string, $h1_fold, $h1_msg, $string_len, $h2_fold, $h1_size, $h1_flags, $h1_date, $cache_dir ) = @_ ; + + my $new_id ; + if ( ! $dry ) { + $max_msg_size_in_bytes = max( $h1_size, $max_msg_size_in_bytes ) ; + $new_id = $imap2->append_string( $h2_fold, $string, $h1_flags, $h1_date ) ; + if ( ! $new_id){ + my $subject = subject( $string ) ; + my $error = $imap2->LastError || '' ; + print "- msg $h1_fold/$h1_msg {$string_len} couldn't append (Subject:[$subject]) to folder $h2_fold: $error\n" ; + + $nb_errors++; + $total_bytes_error += $h1_size; + $h1_nb_msg_processed +=1 ; + return( ) ; + } + else{ + # good + # $new_id is an id if the IMAP server has the + # UIDPLUS capability else just a ref + if ( $new_id !~ m{^\d+$}x ) { + $new_id = lastuid( $imap2, $h2_fold, $h2_uidguess ) ; + } + $h2_uidguess += 1 ; + $total_bytes_transferred += $h1_size ; + $nb_msg_transferred += 1 ; + $h1_nb_msg_processed +=1 ; + + my $time_spent = timesince( $begin_transfer_time ) ; + my $rate = bytes_display_string( $total_bytes_transferred / $time_spent ) ; + my $eta = eta( $time_spent, $h1_nb_msg_processed, $h1_nb_msg_at_start, $nb_msg_transferred ) ; + + printf( "msg %s/%-19s copied to %s/%-10s %.2f msgs/s %s/s %s\n", + $h1_fold, "$h1_msg {$string_len}", $h2_fold, $new_id, $nb_msg_transferred/$time_spent, $rate, $eta ); + + if ( $usecache and $cacheaftercopy and $new_id =~ m{^\d+$}x ) { + $debugcache and print "touch $cache_dir/${h1_msg}_$new_id\n" ; + touch( "$cache_dir/${h1_msg}_$new_id" ) + or croak( "Couldn't touch $cache_dir/${h1_msg}_$new_id" ) ; + } + if ( $delete ) { + delete_message_on_host1( $h1_msg, $h1_fold ) ; + } + #print "PRESS ENTER" and my $a = <> ; + return( $new_id ) ; + } + } + else{ + $nb_msg_skipped_dry_mode += 1; + $h1_nb_msg_processed +=1 ; + } + + return( ) ; +} + + + +# 6 GlobVar: $dry_message $dry $imap1 $h1_nb_msg_deleted $expunge $expunge1 +sub delete_message_on_host1 { + my( $h1_msg, $h1_fold ) = @_ ; + print "msg $h1_fold/$h1_msg deleted on host1 $dry_message\n"; + if ( ! $dry ) { + $imap1->delete_message( $h1_msg ) ; + $h1_nb_msg_deleted += 1 ; + $imap1->expunge() if ( $expunge or $expunge1 ) ; + } + return( ) ; +} + + +sub eta { + my( $my_time_spent, $h1_nb_processed, $h1_nb_msg_start, $nb_transferred ) = @_ ; + return( '' ) if not $foldersizes ; + + my $time_remaining = time_remaining( $my_time_spent, $h1_nb_processed, $h1_nb_msg_start, $nb_transferred ) ; + my $nb_msg_remaining = $h1_nb_msg_start - $h1_nb_processed ; + my $eta_date = localtime( time + $time_remaining ) ; + return( sprintf( "ETA: %s %1.0f s %s msgs left", $eta_date, $time_remaining, $nb_msg_remaining ) ) ; +} + +sub time_remaining { + + my( $my_time_spent, $h1_nb_processed, $h1_nb_msg_start, $nb_transferred ) = @_ ; + + my $time_remaining = ( $my_time_spent / $nb_transferred ) * ( $h1_nb_msg_start - $h1_nb_processed ) ; + return( $time_remaining ) ; +} + + +sub tests_time_remaining { + + ok( 1 == time_remaining( 1, 1, 2, 1 ), "time_remaining: 1, 1, 2, 1 -> 1") ; + ok( 1 == time_remaining( 9, 9, 10, 9 ), "time_remaining: 9, 9, 10, 9 -> 1") ; + ok( 9 == time_remaining( 1, 1, 10, 1 ), "time_remaining: 1, 1, 10, 1 -> 1") ; + return( ) ; +} + + +sub cache_map { + my ( $cache_files_ref, $h1_msgs_ref, $h2_msgs_ref ) = @_; + my ( %map1_2, %map2_1, %done2 ) ; + + my $h1_msgs_hash_ref = { } ; + my $h2_msgs_hash_ref = { } ; + + @$h1_msgs_hash_ref{ @$h1_msgs_ref } = ( ) ; + @$h2_msgs_hash_ref{ @$h2_msgs_ref } = ( ) ; + + foreach my $file ( sort @$cache_files_ref ) { + $debugcache and print "C12: $file\n" ; + ( $uid1, $uid2 ) = match_a_cache_file( $file ) ; + + if ( exists( $h1_msgs_hash_ref->{ defined( $uid1 ) ? $uid1 : q{} } ) + and exists( $h2_msgs_hash_ref->{ defined( $uid2 ) ? $uid2 : q{} } ) ) { + # keep only the greatest uid2 + # 130_2301 and + # 130_231 => keep only 130 -> 2301 + + # keep only the greatest uid1 + # 1601_260 and + # 161_260 => keep only 1601 -> 260 + my $max_uid2 = max( $uid2, $map1_2{ $uid1 } || -1 ) ; + if ( exists( $done2{ $max_uid2 } ) ) { + if ( $done2{ $max_uid2 } < $uid1 ) { + $map1_2{ $uid1 } = $max_uid2 ; + delete( $map1_2{ $done2{ $max_uid2 } } ) ; + $done2{ $max_uid2 } = $uid1 ; + } + }else{ + $map1_2{ $uid1 } = $max_uid2 ; + $done2{ $max_uid2 } = $uid1 ; + } + }; + + } + %map2_1 = reverse( %map1_2 ) ; + return( \%map1_2, \%map2_1) ; +} + +sub tests_cache_map { + #$debugcache = 1 ; + my @cache_files = qw ( + 100_200 + 101_201 + 120_220 + 142_242 + 143_243 + 177_277 + 177_278 + 177_279 + 155_255 + 180_280 + 181_280 + 182_280 + 130_231 + 130_2301 + 161_260 + 1601_260 + ) ; + + my $msgs_1 = [120, 142, 143, 144, 161, 1601, 177, 182, 130 ]; + my $msgs_2 = [ 242, 243, 260, 299, 377, 279, 255, 280, 231, 2301 ]; + + my( $c12, $c21 ) ; + ok( ( $c12, $c21 ) = cache_map( \@cache_files, $msgs_1, $msgs_2 ), 'cache_map: 02' ); + my $a1 = [ sort { $a <=> $b } keys %$c12 ] ; + my $a2 = [ sort { $a <=> $b } keys %$c21 ] ; + ok( 0 == compare_lists( [ 130, 142, 143, 177, 182, 1601 ], $a1 ), 'cache_map: 03' ); + ok( 0 == compare_lists( [ 242, 243, 260, 279, 280, 2301 ], $a2 ), 'cache_map: 04' ); + ok( ! $c12->{161}, 'cache_map: ! 161 -> 260' ); + ok( 260 == $c12->{1601}, 'cache_map: 1601 -> 260' ); + ok( 2301 == $c12->{130}, 'cache_map: 130 -> 2301' ); + #print $c12->{1601}, "\n"; + return( ) ; + +} + +sub cache_dir_fix { + my $cache_dir = shift ; + $cache_dir =~ s/([;<>\*\|`&\$!#\(\)\[\]\{\}:'"\\])/\\$1/xg ; + #print "cache_dir_fix: $cache_dir\n" ; + return( $cache_dir ) ; +} + +sub tests_cache_dir_fix { + ok( 'lalala' eq cache_dir_fix('lalala'), 'cache_dir_fix: lalala -> lalala' ); + ok( 'ii\\\\ii' eq cache_dir_fix('ii\ii'), 'cache_dir_fix: ii\ii -> ii\\\\ii' ); + ok( 'ii@ii' eq cache_dir_fix('ii@ii'), 'cache_dir_fix: ii@ii -> ii@ii' ); + ok( 'ii@ii\\:ii' eq cache_dir_fix('ii@ii:ii'), 'cache_dir_fix: ii@ii:ii -> ii@ii\\:ii' ); + ok( 'i\\\\i\\\\ii' eq cache_dir_fix('i\i\ii'), 'cache_dir_fix: i\i\ii -> i\\\\i\\\\ii' ); + ok( 'i\\\\ii' eq cache_dir_fix('i\\ii'), 'cache_dir_fix: i\\ii -> i\\\\\\\\ii' ); + ok( '\\\\ ' eq cache_dir_fix('\\ '), 'cache_dir_fix: \\ -> \\\\\ ' ); + ok( '\\\\ ' eq cache_dir_fix('\ '), 'cache_dir_fix: \ -> \\\\\ ' ); + return( ) ; + +} + +sub get_cache { + my ( $cache_dir, $h1_msgs_ref, $h2_msgs_ref, $h1_msgs_all_hash_ref, $h2_msgs_all_hash_ref ) = @_; + + $debugcache and print "Entering get_cache\n"; + + -d $cache_dir or return( undef ); # exit if cache directory doesn't exist + $debugcache and print "cache_dir : $cache_dir\n"; + + #$cache_dir =~ s{\\}{\\\\}g; + $cache_dir = cache_dir_fix( $cache_dir ) if ( 'MSWin32' ne $OSNAME ) ; + + $debugcache and print "cache_dir_fix: $cache_dir\n" ; + + my @cache_files = bsd_glob( "$cache_dir/*" ) ; + #$debugcache and print "cache_files: [@cache_files]\n" ; + + $debugcache and print( "cache_files: ", scalar( @cache_files ), " files found\n" ) ; + + my( $cache_1_2_ref, $cache_2_1_ref ) + = cache_map( \@cache_files, $h1_msgs_ref, $h2_msgs_ref ) ; + + clean_cache( \@cache_files, $cache_1_2_ref, $h1_msgs_all_hash_ref, $h2_msgs_all_hash_ref ) ; + + #print "\n", map { "c12 $_ -> $cache_1_2_ref->{ $_ }\n" } keys %$cache_1_2_ref ; + #print "\n", map { "c21 $_ -> $cache_2_1_ref->{ $_ }\n" } keys %$cache_2_1_ref ; + + $debugcache and print "Exiting get_cache\n"; + return ( $cache_1_2_ref, $cache_2_1_ref ) ; +} + + +sub tests_get_cache { + + ok( not( get_cache('/cache_no_exist') ), 'get_cache: /cache_no_exist' ); + ok( ( not -d 'W/tmp/cache/F1/F2' or rmtree( 'W/tmp/cache/F1/F2' )), 'get_cache: rmtree W/tmp/cache/F1/F2' ) ; + ok( mkpath( 'W/tmp/cache/F1/F2' ), 'get_cache: mkpath W/tmp/cache/F1/F2' ) ; + + my @test_files_cache = ( qw( + W/tmp/cache/F1/F2/100_200 + W/tmp/cache/F1/F2/101_201 + W/tmp/cache/F1/F2/120_220 + W/tmp/cache/F1/F2/142_242 + W/tmp/cache/F1/F2/143_243 + W/tmp/cache/F1/F2/177_277 + W/tmp/cache/F1/F2/177_377 + W/tmp/cache/F1/F2/177_777 + W/tmp/cache/F1/F2/155_255 + ) ) ; + ok( touch( @test_files_cache ), 'get_cache: touch W/tmp/cache/F1/F2/...' ) ; + + + # on cache: 100_200 101_201 142_242 143_243 177_277 177_377 177_777 155_255 + # on live: + my $msgs_1 = [120, 142, 143, 144, 177 ]; + my $msgs_2 = [ 242, 243, 299, 377, 777, 255 ]; + + my $msgs_all_1 = { 120 => '', 142 => '', 143 => '', 144 => '', 177 => '' } ; + my $msgs_all_2 = { 242 => '', 243 => '', 299 => '', 377 => '', 777 => '', 255 => '' } ; + + my( $c12, $c21 ) ; + ok( ( $c12, $c21 ) = get_cache( 'W/tmp/cache/F1/F2', $msgs_1, $msgs_2, $msgs_all_1, $msgs_all_2 ), 'get_cache: 02' ); + my $a1 = [ sort { $a <=> $b } keys %$c12 ] ; + my $a2 = [ sort { $a <=> $b } keys %$c21 ] ; + ok( 0 == compare_lists( [ 142, 143, 177 ], $a1 ), 'get_cache: 03' ); + ok( 0 == compare_lists( [ 242, 243, 777 ], $a2 ), 'get_cache: 04' ); + ok( -f 'W/tmp/cache/F1/F2/142_242', 'get_cache: file kept 142_242'); + ok( -f 'W/tmp/cache/F1/F2/142_242', 'get_cache: file kept 143_243'); + ok( ! -f 'W/tmp/cache/F1/F2/100_200', 'get_cache: file removed 100_200'); + ok( ! -f 'W/tmp/cache/F1/F2/101_201', 'get_cache: file removed 101_201'); + + # test clean_cache executed + $maxage = 2 ; + ok( touch(@test_files_cache), 'get_cache: touch W/tmp/cache/F1/F2/...' ) ; + ok( ( $c12, $c21 ) = get_cache('W/tmp/cache/F1/F2', $msgs_1, $msgs_2, $msgs_all_1, $msgs_all_2 ), 'get_cache: 02' ); + ok( -f 'W/tmp/cache/F1/F2/142_242', 'get_cache: file kept 142_242'); + ok( -f 'W/tmp/cache/F1/F2/142_242', 'get_cache: file kept 143_243'); + ok( ! -f 'W/tmp/cache/F1/F2/100_200', 'get_cache: file NOT removed 100_200'); + ok( ! -f 'W/tmp/cache/F1/F2/101_201', 'get_cache: file NOT removed 101_201'); + + + # strange files + #$debugcache = 1 ; + $maxage = undef ; + ok( ( not -d 'W/tmp/cache/rr\uee' or rmtree( 'W/tmp/cache/rr\uee' )), 'get_cache: rmtree W/tmp/cache/rr\uee' ) ; + ok( mkpath( 'W/tmp/cache/rr\uee' ), 'get_cache: mkpath W/tmp/cache/rr\uee' ) ; + + @test_files_cache = ( qw( + W/tmp/cache/rr\uee/100_200 + W/tmp/cache/rr\uee/101_201 + W/tmp/cache/rr\uee/120_220 + W/tmp/cache/rr\uee/142_242 + W/tmp/cache/rr\uee/143_243 + W/tmp/cache/rr\uee/177_277 + W/tmp/cache/rr\uee/177_377 + W/tmp/cache/rr\uee/177_777 + W/tmp/cache/rr\uee/155_255 + ) ) ; + ok( touch(@test_files_cache), 'get_cache: touch strange W/tmp/cache/...' ) ; + + # on cache: 100_200 101_201 142_242 143_243 177_277 177_377 177_777 155_255 + # on live: + $msgs_1 = [120, 142, 143, 144, 177 ] ; + $msgs_2 = [ 242, 243, 299, 377, 777, 255 ] ; + + $msgs_all_1 = { 120 => '', 142 => '', 143 => '', 144 => '', 177 => '' } ; + $msgs_all_2 = { 242 => '', 243 => '', 299 => '', 377 => '', 777 => '', 255 => '' } ; + + ok( ( $c12, $c21 ) = get_cache('W/tmp/cache/rr\uee', $msgs_1, $msgs_2, $msgs_all_1, $msgs_all_2), 'get_cache: strange path 02' ); + $a1 = [ sort { $a <=> $b } keys %$c12 ] ; + $a2 = [ sort { $a <=> $b } keys %$c21 ] ; + ok( 0 == compare_lists( [ 142, 143, 177 ], $a1 ), 'get_cache: strange path 03' ); + ok( 0 == compare_lists( [ 242, 243, 777 ], $a2 ), 'get_cache: strange path 04' ); + ok( -f 'W/tmp/cache/rr\uee/142_242', 'get_cache: strange path file kept 142_242'); + ok( -f 'W/tmp/cache/rr\uee/142_242', 'get_cache: strange path file kept 143_243'); + ok( ! -f 'W/tmp/cache/rr\uee/100_200', 'get_cache: strange path file removed 100_200'); + ok( ! -f 'W/tmp/cache/rr\uee/101_201', 'get_cache: strange path file removed 101_201'); + return( ) ; +} + +sub match_a_cache_file { + my $file = shift ; + my ( $cache_uid1, $cache_uid2 ) ; + + return( ( undef, undef ) ) if ( ! $file ) ; + if ( $file =~ m{(?:^|/)(\d+)_(\d+)$}x ) { + $cache_uid1 = $1 ; + $cache_uid2 = $2 ; + } + return( $cache_uid1, $cache_uid2 ) ; +} + +sub tests_match_a_cache_file { + my ( $tuid1, $tuid2 ) ; + ok( ( $tuid1, $tuid2 ) = match_a_cache_file( ), 'match_a_cache_file: no arg' ) ; + ok( ! defined( $tuid1 ), 'match_a_cache_file: no arg 1' ) ; + ok( ! defined( $tuid2 ), 'match_a_cache_file: no arg 2' ) ; + + ok( ( $tuid1, $tuid2 ) = match_a_cache_file( '' ), 'match_a_cache_file: empty arg' ) ; + ok( ! defined( $tuid1 ), 'match_a_cache_file: empty arg 1' ) ; + ok( ! defined( $tuid2 ), 'match_a_cache_file: empty arg 2' ) ; + + ok( ( $tuid1, $tuid2 ) = match_a_cache_file( '000_000' ), 'match_a_cache_file: 000_000' ) ; + ok( '000' eq $tuid1, 'match_a_cache_file: 000_000 1' ) ; + ok( '000' eq $tuid2, 'match_a_cache_file: 000_000 2' ) ; + + ok( ( $tuid1, $tuid2 ) = match_a_cache_file( '123_456' ), 'match_a_cache_file: 123_456' ) ; + ok( '123' eq $tuid1, 'match_a_cache_file: 123_456 1' ) ; + ok( '456' eq $tuid2, 'match_a_cache_file: 123_456 2' ) ; + + ok( ( $tuid1, $tuid2 ) = match_a_cache_file( '/tmp/truc/123_456' ), 'match_a_cache_file: /tmp/truc/123_456' ) ; + ok( '123' eq $tuid1, 'match_a_cache_file: /tmp/truc/123_456 1' ) ; + ok( '456' eq $tuid2, 'match_a_cache_file: /tmp/truc/123_456 2' ) ; + + ok( ( $tuid1, $tuid2 ) = match_a_cache_file( '/lala123_456' ), 'match_a_cache_file: NO /lala123_456' ) ; + ok( ! $tuid1, 'match_a_cache_file: /lala123_456 1' ) ; + ok( ! $tuid2, 'match_a_cache_file: /lala123_456 2' ) ; + + ok( ( $tuid1, $tuid2 ) = match_a_cache_file( 'la123_456' ), 'match_a_cache_file: NO la123_456' ) ; + ok( ! $tuid1, 'match_a_cache_file: la123_456 1' ) ; + ok( ! $tuid2, 'match_a_cache_file: la123_456 2' ) ; + + return( ) ; +} + +sub clean_cache { + my ( $cache_files_ref, $cache_1_2_ref, $h1_msgs_all_hash_ref, $h2_msgs_all_hash_ref ) = @_ ; + + $debugcache and print "Entering clean_cache\n"; + + $debugcache and print map { "$_ -> " . $cache_1_2_ref->{ $_ } . "\n" } keys %$cache_1_2_ref ; + foreach my $file ( @$cache_files_ref ) { + $debugcache and print "$file\n" ; + my ( $cache_uid1, $cache_uid2 ) = match_a_cache_file( $file ) ; + $debugcache and print( "u1: $cache_uid1 u2: $cache_uid2 c12: ", $cache_1_2_ref->{ $cache_uid1 } || '', "\n") ; +# or ( ! exists( $cache_1_2_ref->{ $cache_uid1 } ) ) +# or ( ! ( $cache_uid2 == $cache_1_2_ref->{ $cache_uid1 } ) ) + if ( ( not defined( $cache_uid1 ) ) + or ( not defined( $cache_uid2 ) ) + or ( not exists( $h1_msgs_all_hash_ref->{ $cache_uid1 } ) ) + or ( not exists( $h2_msgs_all_hash_ref->{ $cache_uid2 } ) ) + ) { + $debugcache and print "remove $file\n" ; + unlink( $file ) or print "$!" ; + } + } + + $debugcache and print "Exiting clean_cache\n"; + return( 1 ) ; +} + +sub tests_clean_cache { + + ok( ( not -d 'W/tmp/cache/G1/G2' or rmtree( 'W/tmp/cache/G1/G2' )), 'clean_cache: rmtree W/tmp/cache/G1/G2' ) ; + ok( mkpath( 'W/tmp/cache/G1/G2' ), 'clean_cache: mkpath W/tmp/cache/G1/G2' ) ; + + my @test_files_cache = ( qw( + W/tmp/cache/G1/G2/100_200 + W/tmp/cache/G1/G2/101_201 + W/tmp/cache/G1/G2/120_220 + W/tmp/cache/G1/G2/142_242 + W/tmp/cache/G1/G2/143_243 + W/tmp/cache/G1/G2/177_277 + W/tmp/cache/G1/G2/177_377 + W/tmp/cache/G1/G2/177_777 + W/tmp/cache/G1/G2/155_255 + ) ) ; + ok( touch(@test_files_cache), 'clean_cache: touch W/tmp/cache/G1/G2/...' ) ; + + ok( -f 'W/tmp/cache/G1/G2/100_200', 'clean_cache: 100_200 before' ); + ok( -f 'W/tmp/cache/G1/G2/142_242', 'clean_cache: 142_242 before' ); + ok( -f 'W/tmp/cache/G1/G2/177_277', 'clean_cache: 177_277 before' ); + ok( -f 'W/tmp/cache/G1/G2/177_377', 'clean_cache: 177_377 before' ); + ok( -f 'W/tmp/cache/G1/G2/177_777', 'clean_cache: 177_777 before' ); + ok( -f 'W/tmp/cache/G1/G2/155_255', 'clean_cache: 155_255 before' ); + + my $cache = { + 142 => 242, + 177 => 777, + } ; + + my $all_1 = { + 142 => '', + 177 => '', + } ; + + my $all_2 = { + 200 => '', + 242 => '', + 777 => '', + } ; + ok( clean_cache( \@test_files_cache, $cache, $all_1, $all_2 ), 'clean_cache: ' ) ; + + ok( ! -f 'W/tmp/cache/G1/G2/100_200', 'clean_cache: 100_200 after' ); + ok( -f 'W/tmp/cache/G1/G2/142_242', 'clean_cache: 142_242 after' ); + ok( ! -f 'W/tmp/cache/G1/G2/177_277', 'clean_cache: 177_277 after' ); + ok( ! -f 'W/tmp/cache/G1/G2/177_377', 'clean_cache: 177_377 after' ); + ok( -f 'W/tmp/cache/G1/G2/177_777', 'clean_cache: 177_777 after' ); + ok( ! -f 'W/tmp/cache/G1/G2/155_255', 'clean_cache: 155_255 after' ); + return( ) ; +} + +sub tests_clean_cache_2 { + + ok( ( not -d 'W/tmp/cache/G1/G2' or rmtree( 'W/tmp/cache/G1/G2' )), 'clean_cache_2: rmtree W/tmp/cache/G1/G2' ) ; + ok( mkpath( 'W/tmp/cache/G1/G2' ), 'clean_cache_2: mkpath W/tmp/cache/G1/G2' ) ; + + my @test_files_cache = ( qw( + W/tmp/cache/G1/G2/100_200 + W/tmp/cache/G1/G2/101_201 + W/tmp/cache/G1/G2/120_220 + W/tmp/cache/G1/G2/142_242 + W/tmp/cache/G1/G2/143_243 + W/tmp/cache/G1/G2/177_277 + W/tmp/cache/G1/G2/177_377 + W/tmp/cache/G1/G2/177_777 + W/tmp/cache/G1/G2/155_255 + ) ) ; + ok( touch(@test_files_cache), 'clean_cache_2: touch W/tmp/cache/G1/G2/...' ) ; + + ok( -f 'W/tmp/cache/G1/G2/100_200', 'clean_cache_2: 100_200 before' ); + ok( -f 'W/tmp/cache/G1/G2/142_242', 'clean_cache_2: 142_242 before' ); + ok( -f 'W/tmp/cache/G1/G2/177_277', 'clean_cache_2: 177_277 before' ); + ok( -f 'W/tmp/cache/G1/G2/177_377', 'clean_cache_2: 177_377 before' ); + ok( -f 'W/tmp/cache/G1/G2/177_777', 'clean_cache_2: 177_777 before' ); + ok( -f 'W/tmp/cache/G1/G2/155_255', 'clean_cache_2: 155_255 before' ); + + my $cache = { + 142 => 242, + 177 => 777, + } ; + + my $all_1 = { + 100 => '', + 142 => '', + 177 => '', + } ; + + my $all_2 = { + 200 => '', + 242 => '', + 777 => '', + } ; + + + + ok( clean_cache( \@test_files_cache, $cache, $all_1, $all_2 ), 'clean_cache_2: ' ) ; + + ok( -f 'W/tmp/cache/G1/G2/100_200', 'clean_cache_2: 100_200 after' ); + ok( -f 'W/tmp/cache/G1/G2/142_242', 'clean_cache_2: 142_242 after' ); + ok( ! -f 'W/tmp/cache/G1/G2/177_277', 'clean_cache_2: 177_277 after' ); + ok( ! -f 'W/tmp/cache/G1/G2/177_377', 'clean_cache_2: 177_377 after' ); + ok( -f 'W/tmp/cache/G1/G2/177_777', 'clean_cache_2: 177_777 after' ); + ok( ! -f 'W/tmp/cache/G1/G2/155_255', 'clean_cache_2: 155_255 after' ); + return( ) ; +} + + + +sub tests_mkpath { + + my $long_path = "123456789/" x 30 ; + ok( (-d "W/tmp/tests/long/$long_path" or mkpath( "W/tmp/tests/long/$long_path" )), 'tests_mkpath: mkpath > 300 char' ) ; + ok( (-d "W/tmp/tests/long/$long_path" and rmtree( "W/tmp/tests/long/" )), 'tests_mkpath: rmtree > 300 char' ) ; + ok( 1 == 1, 'tests_mkpath: 1 == 1' ) ; + return( ) ; +} + +sub tests_touch { + + ok( (-d 'W/tmp/tests/' or mkpath( 'W/tmp/tests/' )), 'tests_touch: mkpath W/tmp/tests/' ) ; + ok( 1 == touch( 'W/tmp/tests/lala'), 'tests_touch: W/tmp/tests/lala') ; + ok( 1 == touch( 'W/tmp/tests/\y'), 'tests_touch: W/tmp/tests/\y') ; + ok( 0 == touch( '/aaa'), 'tests_touch: not /aaa') ; + ok( 1 == touch( 'W/tmp/tests/lili', 'W/tmp/tests/lolo'), 'tests_touch: 2 files') ; + ok( 0 == touch( 'W/tmp/tests/\y', '/aaa'), 'tests_touch: 2 files, 1 fails' ) ; + return( ) ; +} + + +sub touch { + my @files = @_ ; + my $failures = 0 ; + + foreach my $file ( @files ) { + my $fh = IO::File->new ; + if ( $fh->open(">> $file" ) ) { + $fh->close ; + }else{ + print "Could not open file $file in write/append mode\n" ; + $failures++ ; + } + } + return( ! $failures ); +} + +sub tests_cache_folder { + + ok( '/path/fold1/fold2' eq cache_folder( '/path', 'fold1', 'fold2'), 'cache_folder: /path, fold1, fold2 -> /path/fold1/fold2' ) ; + ok( '/pa_th/fold1/fold2' eq cache_folder( '/pa*th', 'fold1', 'fold2'), 'cache_folder: /pa*th, fold1, fold2 -> /path/fold1/fold2' ) ; + ok( '/_p_a__th/fol_d1/fold2' eq cache_folder( '/>pp /path/fol_d1/fold2' ) ; + return( ) ; +} + +sub cache_folder { + my( $cache_dir, $h1_fold, $h2_fold ) = @_ ; + + my $sep_1 = $h1_sep || '/'; + my $sep_2 = $h2_sep || '/'; + + #print "$cache_dir h1_fold $h1_fold sep1 $sep_1 h2_fold $h2_fold sep2 $sep_2\n"; + $h1_fold = convert_sep_to_slash( $h1_fold, $sep_1 ) ; + $h2_fold = convert_sep_to_slash( $h2_fold, $sep_2 ) ; + + my $cache_folder = "$cache_dir/$h1_fold/$h2_fold" ; + $cache_folder = filter_forbidden_characters( $cache_folder ) ; + #print "cache_folder [$cache_folder]\n" ; + return( $cache_folder ) ; +} + +sub filter_forbidden_characters { + my $string = shift ; + + $string =~ s{[\Q*|?:"<>\E]}{_}xg ; + return ( $string ) ; +} + +sub tests_filter_forbidden_characters { + + ok( 'a_b' eq filter_forbidden_characters( 'a_b' ), 'filter_forbidden_characters: a_b -> a_b' ) ; + ok( 'a_b' eq filter_forbidden_characters( 'a*b' ), 'filter_forbidden_characters: a*b -> a_b' ); + ok( 'a_b' eq filter_forbidden_characters( 'a|b' ), 'filter_forbidden_characters: a|b -> a_b' ); + ok( 'a_b' eq filter_forbidden_characters( 'a?b' ), 'filter_forbidden_characters: a?*b -> a_b' ); + ok( 'a_______b' eq filter_forbidden_characters( 'a*|?:"<>b' ), 'filter_forbidden_characters: a*|?:"<>b -> a_______b' ); + return( ) ; +} + +sub convert_sep_to_slash { + my ( $folder, $sep ) = @_ ; + + $folder =~ s{\Q$sep\E}{/}xg ; + return( $folder ) ; +} + +sub tests_convert_sep_to_slash { + + ok('' eq convert_sep_to_slash('', '/'), 'convert_sep_to_slash: no folder'); + ok('INBOX' eq convert_sep_to_slash('INBOX', '/'), 'convert_sep_to_slash: INBOX'); + ok('INBOX/foo' eq convert_sep_to_slash('INBOX/foo', '/'), 'convert_sep_to_slash: INBOX/foo'); + ok('INBOX/foo' eq convert_sep_to_slash('INBOX_foo', '_'), 'convert_sep_to_slash: INBOX_foo'); + ok('INBOX/foo/zob' eq convert_sep_to_slash('INBOX_foo_zob', '_'), 'convert_sep_to_slash: INBOX_foo_zob'); + ok('INBOX/foo' eq convert_sep_to_slash('INBOX.foo', '.'), 'convert_sep_to_slash: INBOX.foo'); + ok('INBOX/foo/hi' eq convert_sep_to_slash('INBOX.foo.hi', '.'), 'convert_sep_to_slash: INBOX.foo.hi'); + return( ) ; +} + + +sub tests_regexmess { + + ok("blabla" eq regexmess("blabla"), "regexmess, no regexmess, nothing to do"); + + @regexmess = ('lalala') ; + ok( not( defined( regexmess("popopo") ) ), "regexmess, bad regex lalala") ; + + @regexmess = ('s/p/Z/g'); + ok("ZoZoZo" eq regexmess("popopo"), "regexmess, s/p/Z/g"); + + @regexmess = 's{c}{C}gxms'; + ok("H1: abC\nH2: Cde\n\nBody abC" + eq regexmess("H1: abc\nH2: cde\n\nBody abc"), + "regexmess, c->C"); + + @regexmess = 's{\AFrom\ }{From:}gxms'; + ok( '' + eq regexmess(''), + 'From mbox 1 add colon blank'); + + ok( 'From:' + eq regexmess('From '), + 'From mbox 2 add colo'); + + ok( "\n" . 'From ' + eq regexmess("\n" . 'From '), + 'From mbox 3 add colo'); + + ok( "From: zzz\n" . 'From ' + eq regexmess("From zzz\n" . 'From '), + 'From mbox 4 add colo'); + + @regexmess = 's{\AFrom\ [^\n]*(\n)?}{}gxms'; + ok( '' + eq regexmess(''), + 'From mbox 1 remove, blank'); + + ok( '' + eq regexmess('From '), + 'From mbox 2 remove'); + + ok( "\n" . 'From ' + eq regexmess("\n" . 'From '), + 'From mbox 3 remove'); + + #print "[", regexmess("From zzz\n" . 'From '), "]"; + ok( "" . 'From ' + eq regexmess("From zzz\n" . 'From '), + 'From mbox 4 remove'); + + + ok( +<<'EOM' +Date: Sat, 10 Jul 2010 05:34:45 -0700 +From: + +Hello, +Bye. +EOM + eq regexmess( +<<'EOM' +From zzz +Date: Sat, 10 Jul 2010 05:34:45 -0700 +From: + +Hello, +Bye. +EOM +), 'From mbox 5 remove'); + + +@regexmess = 's{\A(.*?(?! ^$))(^Disposition-Notification-To:.*?\n)}{$1}gxms'; + + ok( +<<'EOM' +Date: Sat, 10 Jul 2010 05:34:45 -0700 +From: + +Hello, +Bye. +EOM + eq regexmess( +<<'EOM' +Date: Sat, 10 Jul 2010 05:34:45 -0700 +Disposition-Notification-To: Gilles LAMIRAL +From: + +Hello, +Bye. +EOM + ), + 'regexmess: 1 Delete header Disposition-Notification-To:'); + + ok( +<<'EOM' +Date: Sat, 10 Jul 2010 05:34:45 -0700 +From: + +Hello, +Bye. +EOM + eq regexmess( +<<'EOM' +Date: Sat, 10 Jul 2010 05:34:45 -0700 +From: +Disposition-Notification-To: Gilles LAMIRAL + +Hello, +Bye. +EOM +), + 'regexmess: 2 Delete header Disposition-Notification-To:'); + + ok( +<<'EOM' +Date: Sat, 10 Jul 2010 05:34:45 -0700 +From: + +Hello, +Bye. +EOM + eq regexmess( +<<'EOM' +Disposition-Notification-To: Gilles LAMIRAL +Date: Sat, 10 Jul 2010 05:34:45 -0700 +From: + +Hello, +Bye. +EOM +), + 'regexmess: 3 Delete header Disposition-Notification-To:'); + + ok( +<<'EOM' +Date: Sat, 10 Jul 2010 05:34:45 -0700 +From: + +Disposition-Notification-To: Gilles LAMIRAL +Bye. +EOM + eq regexmess( +<<'EOM' +Disposition-Notification-To: Gilles LAMIRAL +Date: Sat, 10 Jul 2010 05:34:45 -0700 +From: + +Disposition-Notification-To: Gilles LAMIRAL +Bye. +EOM +), + 'regexmess: 4 Delete header Disposition-Notification-To:'); + + + +return( ) ; + +} + +sub regexmess { + my ($string) = @_ ; + foreach my $regexmess ( @regexmess ) { + $debug and print "eval \$string =~ $regexmess\n" ; + my $ret = eval( "\$string =~ $regexmess ; 1" ) ; + #print "eval [$ret]\n" ; + if ( ( not $ret ) or $@ ) { + print "Error: eval regexmess '$regexmess': $@" ; + return( undef ) ; + } + } + return( $string ) ; +} + + +sub tests_bytes_display_string { + + ok( '0.000 KiB' eq bytes_display_string( 0 ), 'bytes_display_string: 0' ) ; + ok( '0.001 KiB' eq bytes_display_string( 1 ), 'bytes_display_string: 1' ) ; + ok( '0.010 KiB' eq bytes_display_string( 10 ), 'bytes_display_string: 10' ) ; + ok( '1.000 MiB' eq bytes_display_string( 1048575 ), 'bytes_display_string: 1048575' ) ; + ok( '1.000 MiB' eq bytes_display_string( 1048576 ), 'bytes_display_string: 1048576' ) ; + + ok( '1.000 GiB' eq bytes_display_string( 1073741823 ), 'bytes_display_string: 1073741823 ' ) ; + ok( '1.000 GiB' eq bytes_display_string( 1073741824 ), 'bytes_display_string: 1073741824 ' ) ; + + ok( '1.000 TiB' eq bytes_display_string( 1099511627775 ), 'bytes_display_string: 1099511627775' ) ; + ok( '1.000 TiB' eq bytes_display_string( 1099511627776 ), 'bytes_display_string: 1099511627776' ) ; + + ok( '1.000 PiB' eq bytes_display_string( 1125899906842623 ), 'bytes_display_string: 1125899906842623' ) ; + ok( '1.000 PiB' eq bytes_display_string( 1125899906842624 ), 'bytes_display_string: 1125899906842624' ) ; + + ok( '1024.000 PiB' eq bytes_display_string( 1152921504606846975 ), 'bytes_display_string: 1152921504606846975' ) ; + ok( '1024.000 PiB' eq bytes_display_string( 1152921504606846976 ), 'bytes_display_string: 1152921504606846976' ) ; + + ok( '1048576.000 PiB' eq bytes_display_string( 1180591620717411303424 ), 'bytes_display_string: 1180591620717411303424' ) ; + + #print bytes_display_string( 1180591620717411303424 ), "\n" ; + return( ) ; +} + +sub bytes_display_string { + my ( $bytes ) = @_ ; + + my $readable_value = '' ; + + SWITCH: { + if ( abs( $bytes ) < ( 1000 * 1024 ) ) { + $readable_value = sprintf( "%.3f KiB", $bytes / 1024) ; + last SWITCH ; + } + if ( abs( $bytes ) < ( 1000 * 1024 * 1024 ) ) { + $readable_value = sprintf( "%.3f MiB", $bytes / (1024 * 1024) ) ; + last SWITCH ; + } + if ( abs( $bytes ) < ( 1000 * 1024 * 1024 * 1024) ) { + $readable_value = sprintf("%.3f GiB", $bytes / (1024 * 1024 * 1024) ) ; + last SWITCH ; + } + if ( abs( $bytes ) < ( 1000 * 1024 * 1024 * 1024 * 1024) ) { + $readable_value = sprintf( "%.3f TiB", $bytes / (1024 * 1024 * 1024 * 1024) ) ; + last SWITCH ; + } else { + $readable_value = sprintf( "%.3f PiB", $bytes / (1024 * 1024 * 1024 * 1024 * 1024) ) ; + } + # if you have exabytes (EiB) of email to transfer, you have too much email + } + #print "$bytes = $readable_value\n" ; + return( $readable_value ) ; +} + +sub stats { + $timeend = time( ); + my $timediff = $timeend - $timestart ; + + my $timeend_str = localtime( $timeend ) ; + + my $memory_consumption = memory_consumption( ) || 0 ; + my $memory_ratio = ($max_msg_size_in_bytes) ? + sprintf('%.1f', $memory_consumption / $max_msg_size_in_bytes) : "NA" ; + + my $host1_reconnect_count = $imap1->Reconnect_counter() || 0 ; + my $host2_reconnect_count = $imap2->Reconnect_counter() || 0 ; + + print "++++ Statistics\n" ; + print "Transfer started on : $timestart_str\n"; + print "Transfer ended on : $timeend_str\n"; + printf( "Transfer time : %.1f sec\n", $timediff ) ; + print "Messages transferred : $nb_msg_transferred "; + print "(could be $nb_msg_skipped_dry_mode without dry mode)" if ($dry); + print "\n"; + print "Messages skipped : $nb_msg_skipped\n"; + print "Messages found duplicate on host1 : $h1_nb_msg_duplicate\n"; + print "Messages found duplicate on host2 : $h2_nb_msg_duplicate\n"; + print "Messages void (noheader) on host1 : $h1_nb_msg_noheader\n"; + print "Messages void (noheader) on host2 : $h2_nb_msg_noheader\n"; + print "Messages deleted on host1 : $h1_nb_msg_deleted\n"; + print "Messages deleted on host2 : $h2_nb_msg_deleted\n"; + printf( "Total bytes transferred : %d (%s)\n", + $total_bytes_transferred, + bytes_display_string($total_bytes_transferred)); + printf( "Total bytes duplicate host1 : %d (%s)\n", + $h1_total_bytes_duplicate, + bytes_display_string($h1_total_bytes_duplicate)); + printf( "Total bytes duplicate host2 : %d (%s)\n", + $h2_total_bytes_duplicate, + bytes_display_string($h2_total_bytes_duplicate)); + printf( "Total bytes skipped : %d (%s)\n", + $total_bytes_skipped, + bytes_display_string($total_bytes_skipped)); + printf( "Total bytes error : %d (%s)\n", + $total_bytes_error, + bytes_display_string($total_bytes_error)); + $timediff ||= 1; # No division per 0 + printf ("Message rate : %.1f messages/s\n", $nb_msg_transferred / $timediff); + printf ("Average bandwidth rate : %.1f KiB/s\n", $total_bytes_transferred / 1024 / $timediff); + print "Reconnections to host1 : $host1_reconnect_count\n"; + print "Reconnections to host2 : $host2_reconnect_count\n"; + printf ("Memory consumption : %.1f MiB\n", $memory_consumption / 1024 / 1024); + print "Biggest message : $max_msg_size_in_bytes bytes\n"; +# print "Memory/biggest message ratio : $memory_ratio\n"; + if ( $foldersizesatend and $foldersizes ) { + printf("Initial difference host2 - host1 : %s messages, %s bytes (%s)\n", $h2_nb_msg_start - $h1_nb_msg_at_start, + $h2_bytes_start - $h1_bytes_start, + bytes_display_string( $h2_bytes_start - $h1_bytes_start ) ) ; + printf("Final difference host2 - host1 : %s messages, %s bytes (%s)\n", $h2_nb_msg_end - $h1_nb_msg_end, + $h2_bytes_end - $h1_bytes_end, + bytes_display_string( $h2_bytes_end - $h1_bytes_end ) ) ; + } + print "Detected $nb_errors errors\n\n" ; + + print $warn_release, "\n" ; + print thank_author(); + return( ) ; +} + +sub thank_author { + return("Homepage: http://imapsync.lamiral.info/\n"); +} + + +sub load_modules { + + if ( $ssl1 or $ssl2 or $tls1 or $tls2 ) { + require IO::Socket::SSL ; + #$IO::Socket::SSL::DEBUG = 4 ; + } + + require Term::ReadKey if ( + ((not($password1 or $passfile1)) + or (not($password2 or $passfile2))) + and (not $help)); + + #require Data::Dumper if ($debug); + return( ) ; +} + + + +sub parse_header_msg { + my ($imap, $m_uid, $s_heads, $s_fir, $side, $s_hash) = @_; + + my $head = $s_heads->{$m_uid}; + my $headnum = scalar(keys(%$head)); + $debug and print "$side uid $m_uid head nb pass one: ", $headnum, "\n"; + + if ( ( ! $headnum ) and ( $wholeheaderifneeded ) ){ + print "$side uid $m_uid no header by parse_headers so taking whole header with BODY.PEEK[HEADER]\n" ; + $imap->fetch($m_uid, "BODY.PEEK[HEADER]"); + my $whole_header = $imap->_transaction_literals; + + #print $whole_header; + $head = decompose_header( $whole_header ) ; + + $headnum = scalar( keys( %$head ) ) ; + $debug and print "$side uid $m_uid head nb pass two: ", $headnum, "\n"; + } + + #require Data::Dumper ; + #print Data::Dumper->Dump( [ $head, \%useheader ] ) ; + + my $headstr ; + + $headstr = header_construct( $head, $side, $m_uid ) ; + + if ( ( ! $headstr) and ( $addheader ) and ( $side eq "Host1" )){ + my $header = add_header( $m_uid ) ; + print "Host1 uid $m_uid no header found so adding our own [$header]\n"; + $headstr .= uc( $header ) ; + $s_fir->{$m_uid}->{"NO_HEADER"} = 1; + } + + return( ) if ( ! $headstr ) ; + + my $size = $s_fir->{$m_uid}->{"RFC822.SIZE"}; + my $flags = $s_fir->{$m_uid}->{"FLAGS"}; + my $idate = $s_fir->{$m_uid}->{"INTERNALDATE"}; + $size = length( $headstr ) unless ( $size ) ; + my $m_md5 = md5_base64( $headstr ) ; + $debug and print "$side uid $m_uid sig $m_md5 size $size idate $idate\n"; + my $key; + if ($skipsize) { + $key = "$m_md5"; + } + else { + $key = "$m_md5:$size"; + } + # 0 return code is used to identify duplicate message hash + return 0 if exists $s_hash->{"$key"}; + $s_hash->{"$key"}{'5'} = $m_md5; + $s_hash->{"$key"}{'s'} = $size; + $s_hash->{"$key"}{'D'} = $idate; + $s_hash->{"$key"}{'F'} = $flags; + $s_hash->{"$key"}{'m'} = $m_uid; + + return( 1 ) ; +} + +sub header_construct { + + my( $head, $side, $m_uid ) = @_ ; + + my $headstr ; + foreach my $h ( sort keys( %$head ) ) { + next if ( not exists( $useheader{ uc( $h ) } ) + and not exists( $useheader{ 'ALL' } ) + ) ; + foreach my $val ( sort @{$head->{$h}} ) { + + my $H = header_line_normalize( $h, $val ) ; + + # show stuff in debug mode + $debug and print "$side uid $m_uid header [$H]", "\n" ; + + if ($skipheader and $H =~ m/$skipheader/xi) { + $debug and print "$side uid $m_uid skipping header [$H]\n" ; + next ; + } + $headstr .= "$H" ; + } + } + return( $headstr ) ; +} + + +sub header_line_normalize { + my( $header_key, $header_val ) = @_ ; + + # no 8-bit data in headers ! + $header_val =~ s/[\x80-\xff]/X/xog; + + # change tabulations to space (Gmail bug on with "Received:" on multilines) + $header_val =~ s/\t/\ /xg ; + + # remove the first blanks ( dbmail bug? ) + $header_val =~ s/^\s*//xo; + + # remove successive blanks ( Mailenable does it ) + $header_val =~ s/\s+/ /gxo; + + # remove Message-Id value domain part ( Mailenable changes it ) + if ( ( $messageidnodomain ) and ( 'MESSAGE-ID' eq uc( $header_key ) ) ) { $header_val =~ s/^([^@]+).*$/$1/xo ; } + + # and uppercase header line + # (dbmail and dovecot) + + my $header_line = uc("$header_key: $header_val") ; + + return( $header_line ) ; + +} + +sub tests_header_line_normalize { + + ok( ': ' eq header_line_normalize( '', '' ), 'header_line_normalize: empty args' ) ; + ok( 'HHH: VVV' eq header_line_normalize( 'hhh', 'vvv' ), 'header_line_normalize: hhh vvv ' ) ; + ok( 'HHH: VVV' eq header_line_normalize( 'hhh', ' vvv' ), 'header_line_normalize: remove first blancs' ) ; + ok( 'HHH: AA BB CCC ' eq header_line_normalize( 'hhh', 'aa bb ccc ' ), 'header_line_normalize: remove succesive blancs' ) ; + ok( 'HHH: VVV XX YY' eq header_line_normalize( 'hhh', "vvv\t\txx\tyy" ), 'header_line_normalize: tabs' ) ; + ok( 'HHH: XABX' eq header_line_normalize( 'hhh', "\x80AB\xff" ), 'header_line_normalize: 8bit' ) ; + + return( ) ; +} + + +sub firstline { + # extract the first line of a file (without \n) + + my($file) = @_ ; + my $line = "" ; + + open( my $FILE, '<', $file ) or die_clean( "error [$file]: $! " ) ; + chomp( $line = <$FILE> ) ; + close $FILE ; + $line = ( $line ) ? $line: "error !EMPTY! [$file]" ; + return $line ; +} + + +sub file_to_string { + my( $file ) = @_ ; + my @string ; + open( my $FILE, '<', $file ) or die_clean( "error [$file]: $! " ) ; + @string = <$FILE> ; + close $FILE ; + return join('', @string) ; +} + + +sub string_to_file { + my($string, $file) = @_; + sysopen(FILE, $file,O_WRONLY|O_TRUNC|O_CREAT, 0600) or die_clean("$! $file"); + print FILE $string; + close FILE; + return( ) ; +} + +sub tests_is_a_release_number { + ok(is_a_release_number(1.351), 'is_a_release_number 1.351'); + ok(is_a_release_number(42.4242), 'is_a_release_number 42.4242'); + ok(is_a_release_number(imapsync_version()), 'is_a_release_number imapsync_version()'); + ok(! is_a_release_number('blabla' ), '! is_a_release_number blabla'); + return( ) ; +} + +sub is_a_release_number { + my $number = shift; + + return( $number =~ m{\d\.\d+}xo ) ; +} + +sub check_last_release { + + my $public_release = not_long_imapsync_version_public( ) ; + #print "check_last_release: [$public_release]\n" ; + return('unknown') if ($public_release eq 'unknown'); + return('timeout') if ($public_release eq 'timeout'); + return('unknown') if (! is_a_release_number($public_release)); + + my $imapsync_here = imapsync_version(); + + if ($public_release > $imapsync_here) { + return("New imapsync release $public_release available"); + }else{ + return("This current imapsync is up to date"); + } +} + +sub imapsync_version { + my $rcs_imapsync = '$Id: imapsync,v 1.564 2013/08/18 19:28:47 gilles Exp gilles $ ' ; + my $imapsync_version ; + + if ( $rcs_imapsync =~ m{,v\s+(\d+\.\d+)}xo ) { + $imapsync_version = $1 + } else { + $imapsync_version = "UNKNOWN" ; + } + return( $imapsync_version ) ; +} + +sub tests_imapsync_basename { + + ok('imapsync' eq imapsync_basename(), 'imapsync_basename: imapsync'); + ok('blabla' ne imapsync_basename(), '! imapsync_basename: blabla'); + return( ) ; +} + +sub imapsync_basename { + + return basename($0); + +} + +sub imapsync_version_public { + + my $local_version = imapsync_version(); + my $imapsync_basename = imapsync_basename(); + my $agent_info = "$OSNAME system, perl " + . sprintf("%vd", $PERL_VERSION) + . ", Mail::IMAPClient $Mail::IMAPClient::VERSION" + . " $imapsync_basename"; + my $sock = IO::Socket::INET->new( + PeerAddr => 'imapsync.lamiral.info', + PeerPort => '80', + Proto => 'tcp' + ) ; + return( 'unknown' ) if not $sock ; + print $sock + "GET /prj/imapsync/VERSION HTTP/1.0\n", + "User-Agent: imapsync/$local_version ($agent_info)\n", + "Host: ks.lamiral.info\n\n"; + my @line = <$sock>; + close($sock); + my $last_release = $line[-1]; + chomp($last_release); + return($last_release); +} + +sub not_long_imapsync_version_public { + #print "Entering not_long_imapsync_version_public\n"; + + my $val; + + # Doesn't work with gethostbyname (see perlipc) + #local $SIG{ALRM} = sub { die "alarm\n" }; + + if ('MSWin32' eq $OSNAME) { + local $SIG{ALRM} = sub { die "alarm\n" }; + }else{ + + POSIX::sigaction(SIGALRM, + POSIX::SigAction->new(sub { croak "alarm" })) + or print "Error setting SIGALRM handler: $!\n"; + } + + my $ret = eval { + alarm(3) ; + { + $val = imapsync_version_public( ) ; + #sleep 4 ; + #print "End of imapsync_version_public\n" ; + } + alarm(0) ; + 1 ; + } ; + #print "eval [$ret]\n" ; + if ( ( not $ret ) or $@ ) { + #print "$@"; + if ($@ =~ /alarm/) { + # timed out + return('timeout'); + }else{ + alarm(0); + return('unknown'); # propagate unexpected errors + } + }else { + # Good! + return($val); + } +} + +sub localhost_info { + + my($infos) = join("", + "Here is a [$OSNAME] system (", + join(" ", + uname(), + ), + ")\n", + "With perl ", + sprintf("%vd", $PERL_VERSION), + " Mail::IMAPClient $Mail::IMAPClient::VERSION", + ) ; + return($infos); +} + +sub memory_consumption { + # memory consumed by imapsync until now in bytes + return( ( memory_consumption_of_pids( ) )[0] ); +} + +sub memory_consumption_of_pids { + + my @pid = @_; + @pid = (@pid) ? @pid : ($PROCESS_ID) ; + + #print "PIDs: @PID\n"; + my @val; + if ('MSWin32' eq $OSNAME) { + @val = memory_consumption_of_pids_win32(@pid); + }else{ + # Unix + #my @ps = qx{ ps -o vsz -p @pid }; + my @ps = backtick( "ps -o vsz -p @pid" ) ; + shift @ps; # First line is column name "VSZ" + chomp @ps; + # convert to + @val = map { $_ * 1024 } @ps; + } + return( @val ) ; +} + +sub memory_consumption_of_pids_win32 { + # Windows + my @PID = @_; + my %PID; + # hash of pids as key values + map { $PID{$_}++ } @PID; + + # Does not work but should reading the tasklist documentation + #@ps = qx{ tasklist /FI "PID eq @PID" }; + + #my @ps = qx{ tasklist /NH /FO CSV } ; + my @ps = backtick( 'tasklist /NH /FO CSV' ) ; + #print "-" x 80, "\n", @ps, "-" x 80, "\n"; + my @val; + foreach my $line (@ps) { + my($name, $pid, $mem) = (split(',', $line))[0,1,4]; + next if (! $pid); + #print "[$name][$pid][$mem]"; + if ($PID{remove_qq($pid)}) { + #print "MATCH !\n"; + chomp($mem); + $mem = remove_qq($mem); + $mem = remove_Ko($mem); + $mem = remove_not_num($mem); + #print "[$mem]\n"; + push(@val, $mem * 1024); + } + } + return(@val); +} + +sub backtick { + my $command = shift ; + my ($writer, $reader, $err); + open3( $writer, $reader, $err, $command ) ; + my @output = <$reader>; #Output here + #my @errors = <$err>; #Errors here, instead of the console + $debugdev and print @output ; + return( @output ) ; +} + +sub tests_backtick { + + my @output ; + @output = backtick( "echo Hello World!" ) ; + ok( "Hello World!\n" eq $output[0], 'backtick: echo Hello World!' ) ; + + @output = backtick( "echo Hello\necho World!" ) ; + ok( "Hello\n" eq $output[0], 'backtick: echo Hello; echo World!' ) ; + ok( "World!\n" eq $output[1], 'backtick: echo Hello; echo World!' ) ; + #print @output ; + if ('MSWin32' ne $OSNAME) { + my @output_1 = backtick( 'ls /' ) ; + #my @output_2 = `ls /` ; + #ok( 0 == compare_lists( \@output_1, \@output_2 ), 'backtick: ls /' ) ; + } + return( ) ; +} + +sub remove_not_num { + + my $string = shift; + $string =~ tr/0-9//cd; + #print "tr [$string]\n"; + return($string); +} + +sub tests_remove_not_num { + + ok('123' eq remove_not_num(123), 'remove_not_num( 123 )'); + ok('123' eq remove_not_num('123'), "remove_not_num( '123' )"); + ok('123' eq remove_not_num('12 3'), "remove_not_num( '12 3' )"); + ok('123' eq remove_not_num('a 12 3 Ko'), "remove_not_num( 'a 12 3 Ko' )"); + return( ) ; +} + +sub remove_Ko { + my $string = shift; + if ($string =~ /^(.*)\sKo$/xo) { + return($1); + }else{ + return($string); + } +} + +sub remove_qq { + my $string = shift; + if ($string =~ /^"(.*)"$/xo) { + return($1); + }else{ + return($string); + } +} + +sub memory_consumption_ratio { + + my ($base) = @_; + $base ||= 1; + my $consu = memory_consumption(); + return($consu / $base); +} + +sub tests_memory_consumption { + + ok(print join("\n", memory_consumption_of_pids()), " memory_consumption_of_pids\n"); + ok(print join("\n", memory_consumption_of_pids('1')), " memory_consumption_of_pids 1\n"); + ok(print join("\n", memory_consumption_of_pids('1', $PROCESS_ID)), " memory_consumption_of_pids 1 $PROCESS_ID\n"); + + ok(print memory_consumption_ratio(), " memory_consumption_ratio \n"); + ok(print memory_consumption_ratio(1), " memory_consumption_ratio 1\n"); + ok(print memory_consumption_ratio(10), " memory_consumption_ratio 10\n"); + + ok(print memory_consumption(), " memory_consumption\n"); + return( ) ; +} + +sub good_date { + # two incoming formats: + # header Tue, 24 Aug 2010 16:00:00 +0200 + # internal 24-Aug-2010 16:00:00 +0200 + + # outgoing format: internal date format + # 24-Aug-2010 16:00:00 +0200 + + my $d = shift ; + return ('') if not defined($d); + + SWITCH: { + if ( $d =~ m{(\d?)(\d-...-\d{4})(\s\d{2}:\d{2}:\d{2})(\s(?:\+|-)\d{4})?}xo ) { + #print "internal: [$1][$2][$3][$4]\n" ; + my ($day_1, $date_rest, $hour, $zone) = ($1,$2,$3,$4) ; + $day_1 = '0' if ($day_1 eq '') ; + $zone = ' +0000' if not defined($zone) ; + $d = $day_1 . $date_rest . $hour . $zone ; + last SWITCH ; + } + + if ($d =~ m{(?:\w{3,},\s)?(\d{1,2}),?\s+(\w{3,})\s+(\d{2,4})\s+(\d{1,2})(?::|\.)(\d{1,2})(?:(?::|\.)(\d{1,2}))?\s*((?:\+|-)\d{4})?}xo ) { + # Handles any combination of following formats + # Tue, 24 Aug 2010 16:00:00 +0200 -- Standard + # 24 Aug 2010 16:00:00 +0200 -- Missing Day of Week + # Tue, 24 Aug 97 16:00:00 +0200 -- Two digit year + # Tue, 24 Aug 1997 16.00.00 +0200 -- Periods instead of colons + # Tue, 24 Aug 1997 16:00:00 +0200 -- Extra whitespace between year and hour + # Tue, 24 Aug 1997 6:5:2 +0200 -- Single digit hour, min, or second + # Tue, 24, Aug 1997 16:00:00 +0200 -- Extra comma + + #print "header: [$1][$2][$3][$4][$5][$6][$7][$8]\n"; + my ($day, $month, $year, $hour, $min, $sec, $zone) = ($1,$2,$3,$4,$5,$6,$7,$8); + $year = '19' . $year if length($year) == 2 && $year =~ m/^[789]/xo; + $year = '20' . $year if length($year) == 2; + + $month = substr $month, 0, 3 if length($month) > 4; + $day = sprintf("%02d", $day); + $hour = sprintf("%02d", $hour); + $min = sprintf("%02d", $min); + $sec = '00' if not defined($sec); + $sec = sprintf("%02d", $sec); + $zone = '+0000' if not defined($zone); + $d = "$day-$month-$year $hour:$min:$sec $zone"; + last SWITCH ; + } + + if ($d =~ m{(?:.{3})\s(...)\s+(\d{1,2})\s(\d{1,2}):(\d{1,2}):(\d{1,2})\s(?:\w{3})?\s?(\d{4})}xo ) { + # Handles any combination of following formats + # Sun Aug 20 11:55:09 2006 + # Wed Jan 24 11:58:38 MST 2007 + # Wed Jan 2 08:40:57 2008 + + #print "header: [$1][$2][$3][$4][$5][$6]\n"; + my ($month, $day, $hour, $min, $sec, $year) = ($1,$2,$3,$4,$5,$6); + $day = sprintf("%02d", $day); + $hour = sprintf("%02d", $hour); + $min = sprintf("%02d", $min); + $sec = sprintf("%02d", $sec); + $d = "$day-$month-$year $hour:$min:$sec +0000"; + last SWITCH ; + } + + if ($d =~ m{(\d{2})/(\d{2})/(\d{2})\s(\d{2}):(\d{2}):(\d{2})}xo ) { + # Handles the following format + # 02/06/09 22:18:08 -- Generated by AVTECH TemPageR devices + + #print "header: [$1][$2][$3][$4][$5][$6]\n"; + my ($month, $day, $year, $hour, $min, $sec) = ($1,$2,$3,$4,$5,$6); + $year = '20' . $year; + my %num2mon = qw(01 Jan 02 Feb 03 Mar 04 Apr 05 May 06 Jun 07 Jul 08 Aug 09 Sep 10 Oct 11 Nov 12 Dec); + $month = $num2mon{$month}; + $d = "$day-$month-$year $hour:$min:$sec +0000"; + last SWITCH ; + } + + if ($d =~ m{\w{6,},\s(\w{3})\w+\s+(\d{1,2}),\s(\d{4})\s(\d{2}):(\d{2})\s(AM|PM)}xo ) { + # Handles the following format + # Saturday, December 14, 2002 05:00 PM - KBtoys.com order confirmations + + my ($month, $day, $year, $hour, $min, $apm) = ($1,$2,$3,$4,$5,$6); + + $hour += 12 if $apm eq 'PM'; + $day = sprintf("%02d", $day); + $d = "$day-$month-$year $hour:$min:00 +0000"; + last SWITCH ; + } + + if ($d =~ m{(\w{3})\s(\d{1,2})\s(\d{4})\s(\d{2}):(\d{2}):(\d{2})\s((?:\+|-)\d{4})}xo ) { + # Handles the following format + # Saturday, December 14, 2002 05:00 PM - jr.com order confirmations + + my ($month, $day, $year, $hour, $min, $sec, $zone) = ($1,$2,$3,$4,$5,$6,$7); + + $day = sprintf("%02d", $day); + $d = "$day-$month-$year $hour:$min:$sec $zone"; + last SWITCH ; + } + + if ($d =~ m{(\d{1,2})-(\w{3})-(\d{4})}xo ) { + # Handles the following format + # 21-Jun-2001 - register.com domain transfer email circa 2001 + + my ($day, $month, $year) = ($1,$2,$3); + $day = sprintf("%02d", $day); + $d = "$day-$month-$year 11:11:11 +0000"; + last SWITCH ; + } + + # unknown or unmatch => return same string + return($d); + } + + $d = qq("$d") ; + return( $d ) ; +} + + +sub tests_good_date { + + ok('' eq good_date(), 'good_date no arg'); + ok('"24-Aug-2010 16:00:00 +0200"' eq good_date('24-Aug-2010 16:00:00 +0200'), 'good_date internal 2digit zone'); + ok('"24-Aug-2010 16:00:00 +0000"' eq good_date('24-Aug-2010 16:00:00'), 'good_date internal 2digit no zone'); + ok('"01-Sep-2010 16:00:00 +0200"' eq good_date( '1-Sep-2010 16:00:00 +0200'), 'good_date internal SP 1digit'); + ok('"24-Aug-2010 16:00:00 +0200"' eq good_date('Tue, 24 Aug 2010 16:00:00 +0200'), 'good_date header 2digit zone'); + ok('"01-Sep-2010 16:00:00 +0000"' eq good_date('Wed, 1 Sep 2010 16:00:00'), 'good_date header SP 1digit zone'); + ok('"01-Sep-2010 16:00:00 +0200"' eq good_date('Wed, 1 Sep 2010 16:00:00 +0200'), 'good_date header SP 1digit zone'); + ok('"01-Sep-2010 16:00:00 +0200"' eq good_date('Wed, 1 Sep 2010 16:00:00 +0200 (CEST)'), 'good_date header SP 1digit zone'); + ok('"06-Feb-2009 22:18:08 +0000"' eq good_date('02/06/09 22:18:08'), 'good_date header TemPageR'); + ok('"02-Jan-2008 08:40:57 +0000"' eq good_date('Wed Jan 2 08:40:57 2008'), 'good_date header dice.com support 1digit day'); + ok('"20-Aug-2006 11:55:09 +0000"' eq good_date('Sun Aug 20 11:55:09 2006'), 'good_date header dice.com support 2digit day'); + ok('"24-Jan-2007 11:58:38 +0000"' eq good_date('Wed Jan 24 11:58:38 MST 2007'), 'good_date header status-now.com'); + ok('"24-Aug-2010 16:00:00 +0200"' eq good_date('24 Aug 2010 16:00:00 +0200'), 'good_date header missing date of week'); + ok('"24-Aug-2067 16:00:00 +0200"' eq good_date('Tue, 24 Aug 67 16:00:00 +0200'), 'good_date header 2digit year'); + ok('"24-Aug-1977 16:00:00 +0200"' eq good_date('Tue, 24 Aug 77 16:00:00 +0200'), 'good_date header 2digit year'); + ok('"24-Aug-1987 16:00:00 +0200"' eq good_date('Tue, 24 Aug 87 16:00:00 +0200'), 'good_date header 2digit year'); + ok('"24-Aug-1997 16:00:00 +0200"' eq good_date('Tue, 24 Aug 97 16:00:00 +0200'), 'good_date header 2digit year'); + ok('"24-Aug-2004 16:00:00 +0200"' eq good_date('Tue, 24 Aug 04 16:00:00 +0200'), 'good_date header 2digit year'); + ok('"24-Aug-1997 16:00:00 +0200"' eq good_date('Tue, 24 Aug 1997 16.00.00 +0200'), 'good_date header period time sep'); + ok('"24-Aug-1997 16:00:00 +0200"' eq good_date('Tue, 24 Aug 1997 16:00:00 +0200'), 'good_date header extra white space type1'); + ok('"24-Aug-1997 05:06:02 +0200"' eq good_date('Tue, 24 Aug 1997 5:6:2 +0200'), 'good_date header 1digit time vals'); + ok('"24-Aug-1997 05:06:02 +0200"' eq good_date('Tue, 24, Aug 1997 05:06:02 +0200'), 'good_date header extra commas'); + ok('"01-Oct-2003 12:45:24 +0000"' eq good_date('Wednesday, 01 October 2003 12:45:24 CDT'), 'good_date header no abbrev'); + ok('"11-Jan-2005 17:58:27 -0500"' eq good_date('Tue, 11 Jan 2005 17:58:27 -0500'), 'good_date extra white space'); + ok('"18-Dec-2002 15:07:00 +0000"' eq good_date('Wednesday, December 18, 2002 03:07 PM'), 'good_date kbtoys.com orders'); + ok('"16-Dec-2004 02:01:49 -0500"' eq good_date('Dec 16 2004 02:01:49 -0500'), 'good_date jr.com orders'); + ok('"21-Jun-2001 11:11:11 +0000"' eq good_date('21-Jun-2001'), 'good_date register.com domain transfer'); + + return( ) ; +} + + +sub tests_list_keys_in_2_not_in_1 { + + my @list; + ok( ! list_keys_in_2_not_in_1( {}, {}), 'list_keys_in_2_not_in_1: {} {}'); + ok( 0 == compare_lists( [], [ list_keys_in_2_not_in_1( {}, {} ) ] ), 'list_keys_in_2_not_in_1: {} {}'); + ok( 0 == compare_lists( ['a','b'], [ list_keys_in_2_not_in_1( {}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {} {a, b}'); + ok( 0 == compare_lists( ['b'], [ list_keys_in_2_not_in_1( {'a' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a} {a, b}'); + ok( 0 == compare_lists( [], [ list_keys_in_2_not_in_1( {'a' => 1, 'b' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a, b} {a, b}'); + ok( 0 == compare_lists( [], [ list_keys_in_2_not_in_1( {'a' => 1, 'b' => 1, 'c' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a, b, c} {a, b}'); + ok( 0 == compare_lists( ['b'], [ list_keys_in_2_not_in_1( {'a' => 1, 'c' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a, b, c} {a, b}'); + + return( ) ; +} + +sub list_keys_in_2_not_in_1 { + + my $folders1_ref = shift; + my $folders2_ref = shift; + my @list; + + foreach my $folder ( sort keys %$folders2_ref ) { + next if exists($folders1_ref->{$folder}); + push(@list, $folder); + } + return(@list); +} + + +sub list_folders_in_2_not_in_1 { + + my (@h2_folders_not_in_h1, %h2_folders_not_in_h1) ; + @h2_folders_not_in_h1 = list_keys_in_2_not_in_1( \%h1_folders_all, \%h2_folders_all) ; + map { $h2_folders_not_in_h1{$_} = 1} @h2_folders_not_in_h1 ; + @h2_folders_not_in_h1 = list_keys_in_2_not_in_1( \%h2_folders_from_1_all, \%h2_folders_not_in_h1) ; + + return( reverse @h2_folders_not_in_h1 ); +} + +sub delete_folders_in_2_not_in_1 { + + foreach my $folder (@h2_folders_not_in_1) { + if ( defined( $delete2foldersonly ) and eval( "\$folder !~ $delete2foldersonly" ) ) { + print "Not deleting $folder because of --delete2foldersonly $delete2foldersonly\n"; + next; + } + if ( defined( $delete2foldersbutnot ) and eval( "\$folder =~ $delete2foldersbutnot" ) ) { + print "Not deleting $folder because of --delete2foldersbutnot $delete2foldersbutnot\n"; + next; + } + my $res = $dry ; # always success in dry mode! + $imap2->unsubscribe( $folder ) if ( ! $dry ) ; + $res = $imap2->delete( $folder ) if ( ! $dry ) ; + if ( $res ) { + print "Delete $folder", "$dry_message", "\n" ; + }else{ + print "Delete $folder failure", "\n" ; + } + } + return( ) ; +} + + +sub extract_header { + my $string = shift ; + + my ( $header ) = split( /\n\n/x, $string ) ; + if ( ! $header ) { return( '' ) ; } + #print "[$header]\n" ; + return( $header ) ; +} + +sub tests_extract_header { + + +my $h = <<'EOM'; +Message-Id: <20100428101817.A66CB162474E@plume.est.belle> +Date: Wed, 28 Apr 2010 12:18:17 +0200 (CEST) +From: gilles@louloutte.dyndns.org (Gilles LAMIRAL) +EOM +chomp( $h ) ; +ok( $h eq extract_header( +<<'EOM' +Message-Id: <20100428101817.A66CB162474E@plume.est.belle> +Date: Wed, 28 Apr 2010 12:18:17 +0200 (CEST) +From: gilles@louloutte.dyndns.org (Gilles LAMIRAL) + +body +lalala +EOM +), 'extract_header: 1') ; + + + + return( ) ; +} + +sub decompose_header{ + my $string = shift ; + + # a hash, for a keyword header KEY value are list of strings [VAL1, VAL1_other, etc] + # Think of multiple "Received:" header lines. + my $header = { } ; + + my ($key, $val ) ; + my @line = split( /\n|\r\n/x, $string ) ; + foreach my $line ( @line ) { + #print "DDD $line\n" ; + # End of header + last if ( $line =~ m{^$}xo ) ; + # Key: value + if ( $line =~ m/(^[^:]+):\s(.*)/xo ) { + $key = $1 ; + $val = $2 ; + $debugdev and print "DDD KV [$key] [$val]\n" ; + push( @{ $header->{ $key } }, $val ) ; + # blanc and value => value from previous line continues + }elsif( $line =~ m/^(\s+)(.*)/xo ) { + $val = $2 ; + $debugdev and print "DDD V [$val]\n" ; + @{ $header->{ $key } }[ -1 ] .= " $val" if $key ; + # dirty line? + }else{ + next ; + } + } + #require Data::Dumper ; + #print Data::Dumper->Dump( [ $header ] ) ; + + return( $header ) ; +} + + +sub tests_decompose_header{ + + my $header_dec ; + + $header_dec = decompose_header( +<<'EOH' +KEY_1: VAL_1 +KEY_2: VAL_2 + VAL_2_+ + VAL_2_++ +KEY_3: VAL_3 +KEY_1: VAL_1_other +KEY_4: VAL_4 + VAL_4_+ +KEY_5 BLANC: VAL_5 + +KEY_6_BAD_BODY: VAL_6 +EOH + ) ; + + ok( 'VAL_3' + eq $header_dec->{ 'KEY_3' }[0], 'decompose_header: VAL_3' ) ; + + ok( 'VAL_1' + eq $header_dec->{ 'KEY_1' }[0], 'decompose_header: VAL_1' ) ; + + ok( 'VAL_1_other' + eq $header_dec->{ 'KEY_1' }[1], 'decompose_header: VAL_1_other' ) ; + + ok( 'VAL_2 VAL_2_+ VAL_2_++' + eq $header_dec->{ 'KEY_2' }[0], 'decompose_header: VAL_2 VAL_2_+ VAL_2_++' ) ; + + ok( 'VAL_4 VAL_4_+' + eq $header_dec->{ 'KEY_4' }[0], 'decompose_header: VAL_4 VAL_4_+' ) ; + + ok( ' VAL_5' + eq $header_dec->{ 'KEY_5 BLANC' }[0], 'decompose_header: KEY_5 BLANC' ) ; + + ok( not( defined( $header_dec->{ 'KEY_6_BAD_BODY' }[0] ) ), 'decompose_header: KEY_6_BAD_BODY' ) ; + + + $header_dec = decompose_header( +<<'EOH' +Message-Id: <20100428101817.A66CB162474E@plume.est.belle> +Date: Wed, 28 Apr 2010 12:18:17 +0200 (CEST) +From: gilles@louloutte.dyndns.org (Gilles LAMIRAL) +EOH + ) ; + + ok( '<20100428101817.A66CB162474E@plume.est.belle>' + eq $header_dec->{ 'Message-Id' }[0], 'decompose_header: 1' ) ; + + $header_dec = decompose_header( +<<'EOH' +Return-Path: +Received: by plume.est.belle (Postfix, from userid 1000) + id 120A71624742; Wed, 28 Apr 2010 01:46:40 +0200 (CEST) +Subject: test:eekahceishukohpe +EOH +) ; + ok( +'by plume.est.belle (Postfix, from userid 1000) id 120A71624742; Wed, 28 Apr 2010 01:46:40 +0200 (CEST)' + eq $header_dec->{ 'Received' }[0], 'decompose_header: 2' ) ; + + $header_dec = decompose_header( +<<'EOH' +Received: from plume (localhost [127.0.0.1]) + by plume.est.belle (Postfix) with ESMTP id C6EB73F6C9 + for ; Mon, 26 Nov 2007 10:39:06 +0100 (CET) +Received: from plume [192.168.68.7] + by plume with POP3 (fetchmail-6.3.6) + for (single-drop); Mon, 26 Nov 2007 10:39:06 +0100 (CET) +EOH + ) ; + ok( + 'from plume (localhost [127.0.0.1]) by plume.est.belle (Postfix) with ESMTP id C6EB73F6C9 for ; Mon, 26 Nov 2007 10:39:06 +0100 (CET)' + eq $header_dec->{ 'Received' }[0], 'decompose_header: 3' ) ; + ok( + 'from plume [192.168.68.7] by plume with POP3 (fetchmail-6.3.6) for (single-drop); Mon, 26 Nov 2007 10:39:06 +0100 (CET)' + eq $header_dec->{ 'Received' }[1], 'decompose_header: 3' ) ; + +# Bad header beginning with a blank character + $header_dec = decompose_header( +<<'EOH' + KEY_1: VAL_1 +KEY_2: VAL_2 + VAL_2_+ + VAL_2_++ +KEY_3: VAL_3 +KEY_1: VAL_1_other +EOH + ) ; + + ok( 'VAL_3' + eq $header_dec->{ 'KEY_3' }[0], 'decompose_header: Bad header VAL_3' ) ; + + ok( 'VAL_1_other' + eq $header_dec->{ 'KEY_1' }[0], 'decompose_header: Bad header VAL_1_other' ) ; + + ok( 'VAL_2 VAL_2_+ VAL_2_++' + eq $header_dec->{ 'KEY_2' }[0], 'decompose_header: Bad header VAL_2 VAL_2_+ VAL_2_++' ) ; + + return( ) ; +} + +sub epoch { + # incoming format: + # internal date 24-Aug-2010 16:00:00 +0200 + + # outgoing format: epoch + + + my $d = shift ; + return ('') if not defined($d); + + my ( $mday, $month, $year, $hour, $min, $sec, $sign, $zone_h, $zone_m ) ; + my $time ; + + if ( $d =~ m{(\d{1,2})-([A-Z][a-z]{2})-(\d{4})\s(\d{2}):(\d{2}):(\d{2})\s((?:\+|-))(\d{2})(\d{2})}xo ) { + #print "internal: [$1][$2][$3][$4][$5][$6][$7][$8][$9]\n" ; + ( $mday, $month, $year, $hour, $min, $sec, $sign, $zone_h, $zone_m ) + = ( $1, $2, $3, $4, $5, $6, $7, $8, $9 ) ; + #print "( $mday, $month, $year, $hour, $min, $sec, $sign, $zone_h, $zone_m )\n" ; + + $sign = +1 if ( '+' eq $sign ) ; + $sign = -1 if ( '-' eq $sign ) ; + + $time = timegm( $sec, $min, $hour, $mday, $month_abrev{$month}, $year ) + - $sign * ( 3600 * $zone_h + 60 * $zone_m ) ; + + #print( "$time ", scalar(localtime($time)), "\n"); + } + return( $time ) ; +} + +sub tests_epoch { + ok( '1282658400' eq epoch( '24-Aug-2010 16:00:00 +0200' ), 'epoch 24-Aug-2010 16:00:00 +0200 -> 1282658400' ) ; + ok( '1282658400' eq epoch( '24-Aug-2010 14:00:00 +0000' ), 'epoch 24-Aug-2010 14:00:00 +0000 -> 1282658400' ) ; + ok( '1282658400' eq epoch( '24-Aug-2010 12:00:00 -0200' ), 'epoch 24-Aug-2010 12:00:00 -0200 -> 1282658400' ) ; + ok( '1282658400' eq epoch( '24-Aug-2010 16:01:00 +0201' ), 'epoch 24-Aug-2010 16:01:00 +0201 -> 1282658400' ) ; + ok( '1282658400' eq epoch( '24-Aug-2010 14:01:00 +0001' ), 'epoch 24-Aug-2010 14:01:00 +0001 -> 1282658400' ) ; + + ok( '1280671200' eq epoch( '1-Aug-2010 16:00:00 +0200' ), 'epoch 1-Aug-2010 16:00:00 +0200 -> 1280671200' ) ; + ok( '1280671200' eq epoch( '1-Aug-2010 14:00:00 +0000' ), 'epoch 1-Aug-2010 14:00:00 +0000 -> 1280671200' ) ; + ok( '1280671200' eq epoch( '1-Aug-2010 12:00:00 -0200' ), 'epoch 1-Aug-2010 12:00:00 -0200 -> 1280671200' ) ; + ok( '1280671200' eq epoch( '1-Aug-2010 16:01:00 +0201' ), 'epoch 1-Aug-2010 16:01:00 +0201 -> 1280671200' ) ; + ok( '1280671200' eq epoch( '1-Aug-2010 14:01:00 +0001' ), 'epoch 1-Aug-2010 14:01:00 +0001 -> 1280671200' ) ; + return( ) ; +} + +sub add_header { + my $header_uid = shift || 'mistake' ; + my $header_Message_Id = 'Message-Id: <' . $header_uid . '@imapsync>' ; + return( $header_Message_Id ) ; +} + +sub tests_add_header { + ok( 'Message-Id: ' eq add_header(), 'add_header no arg' ) ; + ok( 'Message-Id: <123456789@imapsync>' eq add_header(123456789), 'add_header 123456789' ) ; + + return( ) ; +} + +sub tests_Banner{ + + my $imap = Mail::IMAPClient->new( ) ; + ok( 'lalala' eq $imap->Banner('lalala'), "Banner set lalala" ) ; + ok( 'lalala' eq $imap->Banner(), "Banner get lalala" ) ; + return( ) ; +} + + + + +sub max_line_length { + my $string = shift ; + my $max = 0 ; + my $i ; + while ( $string =~ m/([^\n]*\n?)/msxg ) { + $max = max( $max, length( $1 ) ) ; + #++$i ; + #print "max $max $i\n" ; + } + #print "MAX $max $i\n\n" ; + return( $max ) ; +} + +sub tests_max_line_length { + ok( 0 == max_line_length( '' ), 'max_line_length: 0 == null string' ) ; + ok( 1 == max_line_length( "\n" ), 'max_line_length: 1 == \n' ) ; + ok( 1 == max_line_length( "\n\n" ), 'max_line_length: 1 == \n\n' ) ; + ok( 1 == max_line_length( "\n" x 500 ), 'max_line_length: 1 == 500 \n' ) ; + ok( 1 == max_line_length( "a" ), 'max_line_length: 1 == a' ) ; + ok( 2 == max_line_length( "a\na" ), 'max_line_length: 2 == a\na' ) ; + ok( 2 == max_line_length( "a\na\n" ), 'max_line_length: 2 == a\na\n' ) ; + ok( 3 == max_line_length( "a\nab\n" ), 'max_line_length: 3 == a\nab\n' ) ; + ok( 3 == max_line_length( "a\nab\n" x 10000 ), 'max_line_length: 3 == 10000 a\nab\n' ) ; + ok( 3 == max_line_length( "a\nab\nabc" ), 'max_line_length: 3 == a\nab\nabc' ) ; + + ok( 4 == max_line_length( "a\nab\nabc\n" ), 'max_line_length: 4 == a\nab\nabc\n' ) ; + ok( 5 == max_line_length( "a\nabcd\nabc\n" ), 'max_line_length: 5 == a\nabcd\nabc\n' ) ; + ok( 5 == max_line_length( "a\nabcd\nabc\n\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd" ), 'max_line_length: 5 == a\nabcd\nabc\n\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd' ) ; + return( ) ; +} + +sub usage { + my $localhost_info = localhost_info(); + my $thank = thank_author(); + my $imapsync_release = ''; + $imapsync_release = check_last_release() if (not defined($releasecheck)); + my $escape_char = ( 'MSWin32' eq $OSNAME ) ? '^' : '\\'; + print <<"EOF"; + +usage: $0 [options] + +Several options are mandatory. + +--dry : Makes imapsync doing nothing, just print what would + be done without --dry. + +--host1 : Source or "from" imap server. Mandatory. +--port1 : Port to connect on host1. Default is 143. +--user1 : User to login on host1. Mandatory. +--showpasswords : Shows passwords on output instead of "MASKED". + Useful to restart a complete run by just reading a log. +--password1 : Password for the user1. +--host2 : "destination" imap server. Mandatory. +--port2 : Port to connect on host2. Default is 143. +--user2 : User to login on host2. Mandatory. +--password2 : Password for the user2. + +--passfile1 : Password file for the user1. It must contain the + password on the first line. This option avoids to show + the password on the command line like --password1 does. +--passfile2 : Password file for the user2. Contains the password. +--domain1 : Domain on host1 (NTLM authentication). +--domain2 : Domain on host2 (NTLM authentication). +--authuser1 : User to auth with on host1 (admin user). + Avoid using --authmech1 SOMETHING with --authuser1. +--authuser2 : User to auth with on host2 (admin user). +--proxyauth1 : Use proxyauth on host1. Requires --authuser1. + Required by Sun/iPlanet/Netscape IMAP servers to + be able to use an administrative user. +--proxyauth2 : Use proxyauth on host2. Requires --authuser2. + Required by Sun/iPlanet/Netscape IMAP servers to + be able to use an administrative user + +--authmd51 : Use MD5 authentification for host1. +--authmd52 : Use MD5 authentification for host2. +--authmech1 : Auth mechanism to use with host1: + PLAIN, LOGIN, CRAM-MD5 etc. Use UPPERCASE. +--authmech2 : Auth mechanism to use with host2. See --authmech1 +--ssl1 : Use an SSL connection on host1. +--ssl2 : Use an SSL connection on host2. +--tls1 : Use an TLS connection on host1. +--tls2 : Use an TLS connection on host2. +--timeout : Connections timeout in seconds. Default is 120. + 0 means no timeout. + +--folder : Sync this folder. +--folder : and this one, etc. +--folderrec : Sync this folder recursively. +--folderrec : and this one, etc. +--include : Sync folders matching this regular expression + Blancs like in "foo bar" have to be written "foo\\ bar" +--include : or this one, etc. + in case both --include --exclude options are + use, include is done before. +--exclude : Skips folders matching this regular expression + Several folders to avoid: + --exclude 'fold1|fold2|f3' skips fold1, fold2 and f3. +--exclude : or this one, etc. +--regextrans2 : Apply the whole regex to each destination folders. +--regextrans2 : and this one. etc. + When you play with the --regextrans2 option, first + add also the safe options --dry --justfolders + Then, when happy, remove --dry, remove --justfolders. + Have in mind that --regextrans2 is applied after prefix + and separator inversion. + +--tmpdir : Where to store temporary files and subdirectories. + Will be created if it doesn't exist. + Default is system specific, Unix is /tmp but + it's often small and deleted at reboot. + --tmpdir /var/tmp should be better. +--pidfile : The file where imapsync pid is written. +--pidfilelocking : Abort if pidfile already exists. Usefull to avoid + concurrent transfers on the same mailbox. + +--prefix1 : Remove prefix to all destination folders + (usually INBOX. or INBOX/ or an empty string "") + you have to use --prefix1 if host1 imap server + does not have NAMESPACE capability, all other + cases are bad. +--prefix2 : Add prefix to all host2 folders. See --prefix1 +--sep1 : Host1 separator in case NAMESPACE is not supported. +--sep2 : Host2 separator in case NAMESPACE is not supported. + +--regexmess : Apply the whole regex to each message before transfer. + Example: 's/\\000/ /g' # to replace null by space. +--regexmess : and this one. +--regexmess : and this one, etc. +--regexflag : Apply the whole regex to each flags list. + Example: 's/\"Junk"//g' # to remove "Junk" flag. +--regexflag : and this one, etc. + +--delete : Deletes messages on host1 server after a successful + transfer. Option --delete has the following behavior: + it marks messages as deleted with the IMAP flag + \\Deleted, then messages are really deleted with an + EXPUNGE IMAP command. +--delete2 : Delete messages in host2 that are not in + host1 server. Useful for backup or pre-sync. +--delete2duplicates : Delete messages in host2 that are duplicates. + Works only without --useuid since duplicates are + detected with header part of each message. +--delete2folders : Delete folders in host2 that are not in host1 server. + For safety, first try it like this (it is safe): + --delete2folders --dry --justfolders --nofoldersizes +--delete2foldersonly : Deleted only folders matching regex. +--delete2foldersbutnot : Do not delete folders matching regex. + Example: --delete2foldersbutnot "/Tasks|Contacts|Foo/" +--noexpunge : Do not expunge messages on host1. + Expunge really deletes messages marked deleted. + Expunge is made at the beginning, on host1 only. + Newly transferred messages are also expunged if + option --delete is given. + No expunge is done on host2 account (unless --expunge2) +--expunge1 : Expunge messages on host1 after messages transfer. +--expunge2 : Expunge messages on host2 after messages transfer. +--uidexpunge2 : uidexpunge messages on the host2 account + that are not on the host1 account, requires --delete2 + +--syncinternaldates : Sets the internal dates on host2 same as host1. + Turned on by default. Internal date is the date + a message arrived on a host (mtime). +--idatefromheader : Sets the internal dates on host2 same as the + "Date:" headers. + +--maxsize : Skip messages larger (or equal) than bytes +--minsize : Skip messages smaller (or equal) than bytes +--maxage : Skip messages older than days. + final stats (skipped) don't count older messages + see also --minage +--minage : Skip messages newer than days. + final stats (skipped) don't count newer messages + You can do (+ are the messages selected): + past|----maxage+++++++++++++++>now + past|+++++++++++++++minage---->now + past|----maxage+++++minage---->now (intersection) + past|++++minage-----maxage++++>now (union) + +--search : Selects only messages returned by this IMAP SEARCH + command. Applied on both sides. +--search1 : Same as --search for selecting host1 messages only. +--search2 : Same as --search for selecting host2 messages only. + --search CRIT equals --search1 CRIT --search2 CRIT + +--exitwhenover : Stop syncing when total bytes transferred reached. + Gmail per day allows 2500000000 down 500000000 upload. + +--maxlinelength : skip messages with line length longer than bytes. + RFC 2822 says it must be no more than 1000 bytes. + +--useheader : Use this header to compare messages on both sides. + Ex: Message-ID or Subject or Date. +--useheader and this one, etc. + +--subscribed : Transfers subscribed folders. +--subscribe : Subscribe to the folders transferred on the + host2 that are subscribed on host1. On by default. +--subscribe_all : Subscribe to the folders transferred on the + host2 even if they are not subscribed on host1. + +--nofoldersizes : Do not calculate the size of each folder in bytes + and message counts. Default is to calculate them. +--nofoldersizesatend : Do not calculate the size of each folder in bytes + and message counts at the end. Default is on. +--justfoldersizes : Exit after having printed the folder sizes. + +--syncacls : Synchronises acls (Access Control Lists). +--nosyncacls : Does not synchronize acls. This is the default. + Acls in IMAP are not standardized, be careful. + +--usecache : Use cache to speedup. +--nousecache : Do not use cache. Caveat: --useuid --nousecache creates + duplicates on multiple runs. +--useuid : Use uid instead of header as a criterium to recognize + messages. Option --usecache is then implied unless + --nousecache is used. + +--debug : Debug mode. +--debugcontent : Debug content of the messages transfered. +--debugflags : Debug flags. +--debugimap1 : IMAP debug mode for host1. imap debug is very verbose. +--debugimap2 : IMAP debug mode for host2. +--debugimap : IMAP debug mode for host1 and host2. + +--version : Print software version. +--noreleasecheck : Do not check for new imapsync release (a http request). +--justconnect : Just connect to both servers and print useful + information. Need only --host1 and --host2 options. +--justlogin : Just login to both host1 and host2 with users + credentials, then exit. +--justfolders : Do only things about folders (ignore messages). + +--help : print this help. + +Example: to synchronize imap account "foo" on "imap.truc.org" + to imap account "bar" on "imap.trac.org" + with foo password "secret1" + and bar password "secret2" + +$0 $escape_char + --host1 imap.truc.org --user1 foo --password1 secret1 $escape_char + --host2 imap.trac.org --user2 bar --password2 secret2 + +$localhost_info +$rcs +$imapsync_release + +$thank +EOF + return( 1 ) ; +} + +sub usage_complete { + print <<'EOF' ; +--skipheader : Don't take into account header keyword + matching ex: --skipheader 'X.*' + +--skipsize : Don't take message size into account to compare + messages on both sides. On by default. + Use --no-skipsize for using size comparaison. +--allowsizemismatch : allow RFC822.SIZE != fetched msg size + consider also --skipsize to avoid duplicate messages + when running syncs more than one time per mailbox + +--reconnectretry1 : reconnect to host1 if connection is lost up to + times per imap command (default is 3) +--reconnectretry2 : same as --reconnectretry1 but for host2 +--split1 : split the requests in several parts on host1. + is the number of messages handled per request. + default is like --split1 500. +--split2 : same thing on host2. +EOF + return( ) ; +} + + + +sub get_options { + my $numopt = scalar(@ARGV); + my $argv = join("¤", @ARGV); + + $test_builder = Test::More->builder; + $test_builder->no_ending(1); + + if($argv =~ m/-delete¤2/x) { + print "May be you mean --delete2 instead of --delete 2\n"; + exit 1; + } + my $opt_ret = GetOptions( + "debug!" => \$debug, + "debugLIST!" => \$debugLIST, + "debugcontent!" => \$debugcontent, + "debugsleep!" => \$debugsleep, + "debugflags!" => \$debugflags, + "debugimap!" => \$debugimap, + "debugimap1!" => \$debugimap1, + "debugimap2!" => \$debugimap2, + "debugdev!" => \$debugdev, + "host1=s" => \$host1, + "host2=s" => \$host2, + "port1=i" => \$port1, + "port2=i" => \$port2, + "user1=s" => \$user1, + "user2=s" => \$user2, + "domain1=s" => \$domain1, + "domain2=s" => \$domain2, + "password1=s" => \$password1, + "password2=s" => \$password2, + "passfile1=s" => \$passfile1, + "passfile2=s" => \$passfile2, + "authmd5!" => \$authmd5, + "authmd51!" => \$authmd51, + "authmd52!" => \$authmd52, + "sep1=s" => \$sep1, + "sep2=s" => \$sep2, + "folder=s" => \@folder, + "folderrec=s" => \@folderrec, + "include=s" => \@include, + "exclude=s" => \@exclude, + "prefix1=s" => \$prefix1, + "prefix2=s" => \$prefix2, + "fixslash2!" => \$fixslash2, + "fixInboxINBOX!" => \$fixInboxINBOX, + "regextrans2=s" => \@regextrans2, + "regexmess=s" => \@regexmess, + "regexflag=s" => \@regexflag, + "filterflags!" => \$filterflags, + "flagsCase!" => \$flagsCase, + "syncflagsaftercopy!" => \$syncflagsaftercopy, + "delete|delete1!" => \$delete, + "delete2!" => \$delete2, + "delete2duplicates!" => \$delete2duplicates, + "delete2folders!" => \$delete2folders, + "delete2foldersonly=s" => \$delete2foldersonly, + "delete2foldersbutnot=s" => \$delete2foldersbutnot, + "syncinternaldates!" => \$syncinternaldates, + "idatefromheader!" => \$idatefromheader, + "syncacls!" => \$syncacls, + "maxsize=i" => \$maxsize, + "minsize=i" => \$minsize, + "maxage=i" => \$maxage, + "minage=i" => \$minage, + "search=s" => \$search, + "search1=s" => \$search1, + "search2=s" => \$search2, + "foldersizes!" => \$foldersizes, + "foldersizesatend!" => \$foldersizesatend, + "dry!" => \$dry, + "expunge!" => \$expunge, + "expunge1!" => \$expunge1, + "expunge2!" => \$expunge2, + "uidexpunge2!" => \$uidexpunge2, + "subscribed!" => \$subscribed, + "subscribe!" => \$subscribe, + "subscribe_all!" => \$subscribe_all, + "justbanner!" => \$justbanner, + "justconnect!"=> \$justconnect, + "justfolders!"=> \$justfolders, + "justfoldersizes!" => \$justfoldersizes, + "fast!" => \$fast, + "version" => \$version, + "help" => \$help, + "timeout=i" => \$timeout, + "skipheader=s" => \$skipheader, + "useheader=s" => \@useheader, + "wholeheaderifneeded!" => \$wholeheaderifneeded, + "messageidnodomain!" => \$messageidnodomain, + "skipsize!" => \$skipsize, + "allowsizemismatch!" => \$allowsizemismatch, + "fastio1!" => \$fastio1, + "fastio2!" => \$fastio2, + "ssl1!" => \$ssl1, + "ssl2!" => \$ssl2, + "ssl1_SSL_version=s" => \$ssl1_SSL_version, + "ssl2_SSL_version=s" => \$ssl2_SSL_version, + "tls1!" => \$tls1, + "tls2!" => \$tls2, + "uid1!" => \$uid1, + "uid2!" => \$uid2, + "authmech1=s" => \$authmech1, + "authmech2=s" => \$authmech2, + "authuser1=s" => \$authuser1, + "authuser2=s" => \$authuser2, + "proxyauth1" => \$proxyauth1, + "proxyauth2" => \$proxyauth2, + "split1=i" => \$split1, + "split2=i" => \$split2, + "buffersize=i" => \$buffersize, + "reconnectretry1=i" => \$reconnectretry1, + "reconnectretry2=i" => \$reconnectretry2, + "relogin1=i" => \$relogin1, + "relogin2=i" => \$relogin2, + "tests" => \$tests, + "tests_debug" => \$tests_debug, + "allow3xx!" => \$allow3xx, + "justlogin!" => \$justlogin, + "tmpdir=s" => \$tmpdir, + "pidfile=s" => \$pidfile, + "pidfilelocking!" => \$pidfilelocking, + "releasecheck!" => \$releasecheck, + "modules_version!" => \$modules_version, + "usecache!" => \$usecache, + "cacheaftercopy!" => \$cacheaftercopy, + "debugcache!" => \$debugcache, + "useuid!" => \$useuid, + "addheader!" => \$addheader, + "exitwhenover=i" => \$exitwhenover, + "checkselectable!" => \$checkselectable, + "checkmessageexists!" => \$checkmessageexists, + "expungeaftereach!" => \$expungeaftereach, + "abletosearch!" => \$abletosearch, + "showpasswords!" => \$showpasswords, + "maxlinelength=i" => \$maxlinelength, + ); + + $debug and print "get options: [$opt_ret]\n"; + + # just the version + print imapsync_version(), "\n" and exit if ($version) ; + + if ($tests) { + $test_builder->no_ending(0); + tests(); + exit; + } + if ($tests_debug) { + $test_builder->no_ending(0); + tests_debug(); + exit; + } + + $help = 1 if ! $numopt; + load_modules(); + + # exit with --help option or no option at all + usage( ) and exit( ) if ( $help or not $numopt ) ; + + # don't go on if options are not all known. + exit( EX_USAGE( ) ) unless ( $opt_ret ) ; + return( ) ; +} + + +sub tests_debug { + + SKIP: { + skip "No test in normal run" if ( not $tests_debug ); + tests_msgs_from_maxmin( ) ; + } + return( ) ; +} + +sub tests { + + SKIP: { + skip "No test in normal run" if (not $tests); + tests_folder_routines(); + tests_compare_lists(); + tests_regexmess(); + tests_flags_regex(); + tests_permanentflags(); + tests_flags_filter( ) ; + tests_separator_invert( ) ; + tests_imap2_folder_name(); + tests_command_line_nopassword(); + tests_good_date(); + tests_max(); + tests_remove_not_num(); + tests_memory_consumption(); + tests_is_a_release_number(); + tests_imapsync_basename(); + tests_list_keys_in_2_not_in_1(); + tests_convert_sep_to_slash( ) ; + tests_match_a_cache_file( ) ; + tests_cache_map( ) ; + tests_get_cache( ) ; + tests_clean_cache( ) ; + tests_clean_cache_2( ) ; + tests_touch( ) ; + tests_ucsecond( ) ; + tests_flagsCase( ) ; + tests_mkpath( ) ; + tests_extract_header( ) ; + tests_decompose_header( ) ; + tests_epoch( ) ; + tests_add_header( ) ; + tests_cache_dir_fix( ) ; + tests_filter_forbidden_characters( ) ; + tests_cache_folder( ) ; + tests_time_remaining( ) ; + tests_decompose_regex( ) ; + tests_Banner( ) ; + tests_backtick( ) ; + tests_bytes_display_string( ) ; + tests_header_line_normalize( ) ; + tests_fix_Inbox_INBOX_mapping( ) ; + tests_max_line_length( ) ; + tests_subject( ) ; + tests_msgs_from_maxmin( ) ; + } + return( ) ; +} + + + +# IMAPClient 3.xx ads + +package Mail::IMAPClient; + +sub Tls { + my $self = shift ; + my $value = shift ; + if ( defined( $value ) ) { $self->{TLS} = $value } + return $self->{TLS}; +} + +sub Reconnect_counter { + my $self = shift ; + my $value = shift ; + $self->{Reconnect_counter} = 0 if ( not defined( $self->{Reconnect_counter} ) ) ; + if ( defined( $value ) ) { $self->{Reconnect_counter} = $value } + return( $self->{Reconnect_counter} ) ; +} + + +sub Banner { + my $self = shift ; + my $value = shift ; + if ( defined( $value ) ) { $self->{ BANNER } = $value } + return $self->{ BANNER }; +} + +sub capability_update { + my $self = shift ; + + delete $self->{CAPABILITY} ; + return( $self->capability ) ; +} + diff --git a/W/paypal_reply/paypal_build_invoices b/W/paypal_reply/paypal_build_invoices index 9cf0810..31cd95f 100755 --- a/W/paypal_reply/paypal_build_invoices +++ b/W/paypal_reply/paypal_build_invoices @@ -1,6 +1,6 @@ #!/bin/sh -# $Id: paypal_build_invoices,v 1.55 2013/08/17 23:43:38 gilles Exp gilles $ +# $Id: paypal_build_invoices,v 1.56 2013/09/13 10:55:46 gilles Exp gilles $ # usage: sh paypal_build_invoices /g/var/paypal_invoices/???? @@ -40,7 +40,8 @@ cp /home/gilles/public_html/AGIL/factures/000/facture_imapsync-000.tex /g/var/pa #/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2572 /g/paypal/paypal_2013_05_complet.csv #/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2627 /g/paypal/paypal_2013_06_complet.csv #/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2682 /g/paypal/paypal_2013_07_complet.csv -/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2741 /g/paypal/paypal_2013_08_complet.csv +#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2741 /g/paypal/paypal_2013_08_complet.csv +/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 2820 /g/paypal/paypal_2013_09_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 147 /g/paypal/paypal_2010_11_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 214 /g/paypal/paypal_2010_12_complet.csv @@ -75,9 +76,10 @@ cp /home/gilles/public_html/AGIL/factures/000/facture_imapsync-000.tex /g/var/pa : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2572 /g/paypal/paypal_2013_05_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2627 /g/paypal/paypal_2013_06_complet.csv : /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2682 /g/paypal/paypal_2013_07_complet.csv +: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2741 /g/paypal/paypal_2013_08_complet.csv set -x -: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2741 /g/paypal/paypal_2013_08_complet.csv +: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 2820 /g/paypal/paypal_2013_09_complet.csv set +x # La totale diff --git a/W/paypal_reply/paypal_functions b/W/paypal_reply/paypal_functions index 06015ea..0bcfcd1 100755 --- a/W/paypal_reply/paypal_functions +++ b/W/paypal_reply/paypal_functions @@ -1,6 +1,6 @@ #!/bin/sh -# $Id: paypal_functions,v 1.20 2013/02/08 14:57:33 gilles Exp gilles $ +# $Id: paypal_functions,v 1.21 2013/08/21 21:46:16 gilles Exp gilles $ paypal_prerequisites() { perl -mMIME::Lite -e '' || echo 'sudo aptitude install libmime-lite-perl' @@ -178,7 +178,7 @@ send_reply() { #test X"--send" = X"$1" && touch "$d_sent/$b" test X"" = X"$1" && paypal_send "$f" done - mailq + #mailq } paypal_all() { diff --git a/W/paypal_reply/paypal_imapget b/W/paypal_reply/paypal_imapget index f499eba..39c59e5 100755 --- a/W/paypal_reply/paypal_imapget +++ b/W/paypal_reply/paypal_imapget @@ -1,6 +1,6 @@ #!/usr/bin/perl -w -# $Id: paypal_imapget,v 1.9 2013/03/20 23:59:41 gilles Exp gilles $ +# $Id: paypal_imapget,v 1.10 2013/08/21 22:19:35 gilles Exp gilles $ use Getopt::Long; use Mail::IMAPClient; @@ -58,7 +58,8 @@ print "@search\n" ; @search = ('TEXT', 'PP341') if not @search ; my @uids_01 = $imap->search('HEADER', 'Return-Path','', @search ); my @uids_02 = $imap->search('HEADER', 'Return-Path','', @search ); -my @uids = ( @uids_01, @uids_02 ) ; +my @uids_03 = $imap->search('HEADER', 'Return-Path','', @search ); +my @uids = ( @uids_01, @uids_02, @uids_03 ) ; print "Search: [@uids]\n"; foreach $msg (@uids) { diff --git a/W/paypal_reply/paypal_run_dev b/W/paypal_reply/paypal_run_dev index 3c4b314..50055e1 100755 --- a/W/paypal_reply/paypal_run_dev +++ b/W/paypal_reply/paypal_run_dev @@ -7,7 +7,7 @@ set -e # Add path to commands at home PATH=$PATH:/g/public_html/imapsync/W/paypal_reply -PERL5LIB=/g/public_html/imapsync/W/Mail-IMAPClient-3.32/lib +PERL5LIB=/g/public_html/imapsync/W/Mail-IMAPClient-3.33/lib export PERL5LIB test -f /g/public_html/imapsync/W/paypal_reply/paypal_functions \ diff --git a/W/test3.bat b/W/test3.bat index 9e9adf9..02fd284 100644 --- a/W/test3.bat +++ b/W/test3.bat @@ -1,18 +1,9 @@ -cd C:\msys\1.0\home\Admin\imapsync +cd /D %~dp0 -perl imapsync --host1 p --user1 toto --passfile1 secret.toto --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --folder INBOX -REM .\imapsync.exe --host1 p --user1 toto --passfile1 secret.toto --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --justconnect -REM PAUSE -REM cmail.cmich.edu has address 207.75.116.61 +.\imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --delete2 --folder INBOX --usecache --tmpdir "E:\\temp" -REM imapsync.exe --host1 cmail.cmich.edu --ssl1 --ssl1_SSL_version SSLv3 ^ -REM --host2 cmail.cmich.edu --ssl2 --ssl2_SSL_version SSLv3 ^ -REM --justconnect -PAUSE -REM .\imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --delete2 --folder INBOX -REM .\imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --delete2 --folder INBOX --usecache diff --git a/W/test3_boxon.bat b/W/test3_boxon.bat new file mode 100644 index 0000000..9c5a409 --- /dev/null +++ b/W/test3_boxon.bat @@ -0,0 +1,20 @@ + + +cd /D %~dp0 + +REM .\imapsync.exe --host1 winmail1.webcows.se --user1 monica@fractus.net --password1 yaa --host2 winmail1.webcows.se --user2 monica@fractus.net --password2 yaa +REM perl imapsync --host1 winmail1.webcows.se --user1 monica@fractus.net --password1 yaa --host2 winmail1.webcows.se --user2 monica@fractus.net --password2 yaa + +REM perl imapsync --host1 p --user1 toto --passfile1 secret.toto --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --folder INBOX +REM .\imapsync.exe --host1 p --user1 toto --passfile1 secret.toto --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --justconnect +REM PAUSE +REM cmail.cmich.edu has address 207.75.116.61 + +REM imapsync.exe --host1 cmail.cmich.edu --ssl1 --ssl1_SSL_version SSLv3 ^ +REM --host2 cmail.cmich.edu --ssl2 --ssl2_SSL_version SSLv3 ^ +REM --justconnect + + +REM .\imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --delete2 --folder INBOX +REM .\imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --delete2 --folder INBOX --usecache + diff --git a/build_exe.bat b/build_exe.bat index 8569da0..e3a87b3 100644 --- a/build_exe.bat +++ b/build_exe.bat @@ -1,5 +1,5 @@ -REM $Id: build_exe.bat,v 1.19 2013/08/03 12:42:36 gilles Exp gilles $ +REM $Id: build_exe.bat,v 1.20 2013/09/21 21:56:14 gilles Exp gilles $ @ECHO OFF ECHO Building imapsync.exe @@ -12,7 +12,7 @@ perl -mMail::IMAPClient -mIO::Socket -mIO::Socket::SSL -mIO::Socket::IP ^ -mDigest::MD5 -mDigest::HMAC_MD5 -mDigest::HMAC_SHA1 ^ -mTerm::ReadKey -mFile::Spec -mAuthen::NTLM ^ -mTime::Local -mURI::Escape -mData::Uniqid ^ - -e '' + -e '' cd @ECHO ON @@ -23,6 +23,7 @@ pp -o imapsync.exe ^ -M Digest::MD5 -M Digest::HMAC_MD5 -M Digest::HMAC_SHA1 ^ -M Term::ReadKey -M Authen::NTLM ^ -M Time::Local -M URI::Escape -M Data::Uniqid ^ + ^ imapsync echo Done building imapsync.exe diff --git a/examples/install_modules.bat b/examples/install_modules.bat index 3f8d055..1eff071 100644 --- a/examples/install_modules.bat +++ b/examples/install_modules.bat @@ -1,5 +1,5 @@ -REM $Id: install_modules.bat,v 1.7 2013/08/03 02:19:58 gilles Exp gilles $ +REM $Id: install_modules.bat,v 1.8 2013/09/19 10:34:33 gilles Exp gilles $ @ECHO OFF @@ -12,7 +12,8 @@ IF ERRORLEVEL 1 ECHO Perl needed. Install Strawberry Perl. Get it at http://stra REM perl is there -FOR %%M in ( IO::Socket::INET IO::Socket::INET6 IO::Socket::IP ^ +FOR %%M in ( Test::Pod ^ + IO::Socket::INET IO::Socket::INET6 IO::Socket::IP ^ Net::SSLeay ^ Crypt::SSLeay Net::SSL IO::Socket::SSL ^ Digest::MD5 Digest::HMAC_MD5 ^ diff --git a/imapsync b/imapsync index 7bc80e1..e73c65a 100755 --- a/imapsync +++ b/imapsync @@ -22,7 +22,7 @@ Synchronises mailboxes between two imap servers. Good at IMAP migration. More than 52 different IMAP server softwares supported with success, few failures. -$Revision: 1.564 $ +$Revision: 1.567 $ =head1 SYNOPSIS @@ -399,6 +399,7 @@ Success stories reported with the following 55 imap servers - Dovecot 0.99.10.4, 0.99.14, 0.99.14-8.fc4, 1.0-0.beta2.7, 1.0.0 [dest/source] (LGPL) (http://www.dovecot.org/) - Eudora WorldMail v2 + - Fusemail imap.fusemail.net:143 (https://www.fusemail.com/). - Gimap (Gmail imap) - GMX IMAP4 StreamProxy. - Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ. @@ -425,9 +426,11 @@ Success stories reported with the following 55 imap servers - Oracle Beehive [host1] - Qualcomm Worldmail (NT) - QQMail IMAP4Server [host1] [host2] https://en.mail.qq.com/ + - RackSpace hoster secure.emailsrvr.com:993 http://www.rackspace.com/ - Rockliffe Mailsite 5.3.11, 4.5.6 - Samsung Contact IMAP server 8.5.0 - Scalix v10.1, 10.0.1.3, 11.0.0.431, 11.4.6 + - Sendmail Mail Store IMAP4rev1 (5.5.6/mstore-5-5-build-1874 [host1]. - SmarterMail, Smarter Mail 5.0 Enterprise, Smarter Mail 5.5 [host1], SmarterMail Professional 10.2 [host1]. - Softalk Workgroup Mail 7.6.4 [host1]. - SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) @@ -536,7 +539,7 @@ Entries for imapsync: Feedback (good or bad) will often be welcome. -$Id: imapsync,v 1.564 2013/08/18 19:28:47 gilles Exp gilles $ +$Id: imapsync,v 1.567 2013/09/18 20:38:10 gilles Exp gilles $ =cut @@ -664,7 +667,7 @@ my( # global variables initialisation -$rcs = '$Id: imapsync,v 1.564 2013/08/18 19:28:47 gilles Exp gilles $ '; +$rcs = '$Id: imapsync,v 1.567 2013/09/18 20:38:10 gilles Exp gilles $ '; $total_bytes_transferred = 0; $total_bytes_skipped = 0; @@ -947,13 +950,13 @@ for ( @useheader ) { $useheader{ uc( $_ ) } = undef } ; print "Host1: IMAP server [$host1] port [$port1] user [$user1]\n"; print "Host2: IMAP server [$host2] port [$port2] user [$user2]\n"; -$password1 || $passfile1 || 'PREAUTH' eq $authmech1 || do { +$password1 || $passfile1 || 'PREAUTH' eq $authmech1 || 'EXTERNAL' eq $authmech1 || do { $password1 = ask_for_password( $authuser1 || $user1, $host1 ) ; } ; $password1 = ( defined( $passfile1 ) ) ? firstline ( $passfile1 ) : $password1 ; -$password2 || $passfile2 || 'PREAUTH' eq $authmech2 || do { +$password2 || $passfile2 || 'PREAUTH' eq $authmech2 || 'EXTERNAL' eq $authmech2 || do { $password2 = ask_for_password( $authuser2 || $user2, $host2 ) ; } ; @@ -2065,10 +2068,9 @@ sub authenticate_imap { $imap->User($user) ; } - $imap->Authcallback(\&xoauth) if $authmech eq "XOAUTH" ; - $imap->Authcallback(\&plainauth) if $authmech eq "PLAIN" ; + $imap->Authcallback(\&xoauth) if ( 'XOAUTH' eq $authmech ) ; + $imap->Authcallback(\&plainauth) if ( ( 'PLAIN' eq $authmech ) or ( 'EXTERNAL' eq $authmech ) ) ; - $imap->Domain($domain) if (defined($domain)) ; $imap->Authuser($authuser) ; $imap->Password($password) ; @@ -2263,8 +2265,8 @@ sub banner_imapsync { my @argv = @_ ; my $banner_imapsync = join("", '$RCSfile: imapsync,v $ ', - '$Revision: 1.564 $ ', - '$Date: 2013/08/18 19:28:47 $ ', + '$Revision: 1.567 $ ', + '$Date: 2013/09/18 20:38:10 $ ', "\n",localhost_info(), "\n", "Command line used:\n", "$0 ", command_line_nopassword( @argv ), "\n", @@ -2315,7 +2317,7 @@ sub exit_clean { sub die_clean { my @messages = @_ ; unlink( $pidfile ) ; - croak @messages ; + croak( @messages ) ; } sub missing_option { @@ -3344,7 +3346,7 @@ sub copy_message { my ( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) = @_ ; ( $debug or $dry) and print "msg $h1_fold/$h1_msg copying to $h2_fold $dry_message\n"; - my $h1_size = $h1_fir_ref->{$h1_msg}->{"RFC822.SIZE"} || '' ; + my $h1_size = $h1_fir_ref->{$h1_msg}->{"RFC822.SIZE"} || 0 ; my $h1_flags = $h1_fir_ref->{$h1_msg}->{"FLAGS"} || '' ; my $h1_idate = $h1_fir_ref->{$h1_msg}->{"INTERNALDATE"} || '' ; @@ -4657,7 +4659,7 @@ sub check_last_release { } sub imapsync_version { - my $rcs_imapsync = '$Id: imapsync,v 1.564 2013/08/18 19:28:47 gilles Exp gilles $ ' ; + my $rcs_imapsync = '$Id: imapsync,v 1.567 2013/09/18 20:38:10 gilles Exp gilles $ ' ; my $imapsync_version ; if ( $rcs_imapsync =~ m{,v\s+(\d+\.\d+)}xo ) { diff --git a/index.shtml b/index.shtml index 6282c3b..70d2895 100644 --- a/index.shtml +++ b/index.shtml @@ -5,7 +5,7 @@ Official imapsync migration tool ( release <!--#exec cmd="cat ./VERSION"--> ) - + @@ -73,7 +73,7 @@ No way via IMAP, no way via imapsync imapsync is not suitable for maintaining a synchronization between two active imap accounts while the user is working on both sides. -Use offlineimap (written by John Goerzen) +Use offlineimap (written by John Goerzen) or mbsync (written by Michael R. Elkins) for bidirectionnal (2 ways) synchronizations.

@@ -84,10 +84,10 @@ for bidirectionnal (2 ways) synchronizations.

Facts and figures for 2011-2013

    -
  • 4000 to 5000 users per month (34000 users a year)
  • +
  • 4000 to 5000 users per month (45000 users a year)
  • -
  • 6 to 25 millions mailboxes transfers per month, -total is 93 millions for 2011, 91 millions for 2012, 66 millions for half 2013
  • +
  • 6 to 25 millions mailboxes transfers per month, +total is 93 millions for 2011, 91 millions for 2012, should be 110 millions for end 2013
  • Operating systems run by imapsync users:
      @@ -102,14 +102,32 @@ total is 93 millions for 2011, 91 millions for 2012, 66 millions for half 2013
    • Highest use rate: about 21 millions of IMAP mailbox transfers (in a single month)
    - +

    +Where all those numbers come from? +To know wether a newer imapsync exists or not imapsync does a http GET to VERSION. +Via the User-agent parameter it also send:

    + +
      +
    • imapsync release
    • +
    • Perl version
    • +
    • Mail::IMAPClient version
    • +
    • Operating System
    • +
    + +

    You can remove this behavior by adding option --noreleasecheck on the command line (or by setting $releasecheck = 0 in the source code) +

    Latest release is imapsync

    -

    Written on

    +

    imapsync was written on

    + +
    + + +

    See ChangeLog to know what's new in details since 2001.

    @@ -117,7 +135,7 @@ total is 93 millions for 2011, 91 millions for 2012, 66 millions for half 2013 -
  • 1.564
  • +
  • 1.567
  • Enhancement:
  • Enhancement:
  • Enhancement:
  • @@ -127,7 +145,7 @@ total is 93 millions for 2011, 91 millions for 2012, 66 millions for half 2013Usability:
  • Usability:
  • Bug fix:
  • -
  • :
  • +
  • Bug fix:
  • Bug fix:
  • Bug fix:
  • Refactoring:
  • @@ -137,6 +155,13 @@ total is 93 millions for 2011, 91 millions for 2012, 66 millions for half 2013 --> +
      +
    • 1.567 imapsync.exe crash fix
    • +
    • Enhancement: Added --authmech EXTERNAL.
    • +
    • Bug fix: Fixed a warning when RFC822.SIZE is null or undef.
    • +
    • Bug fix: Fixed imapsync.exe crash with no error message when it exits on a error. Back to Perl 5.16
    • +
    +
    • 1.564 QQMail support
    • Enhancement: Adapted behavior for allowing --maxdate --mindate with --noabletosearch. @@ -677,6 +702,7 @@ I like it.
    • Dovecot 0.99.10.4, 0.99.14, 0.99.14-8.fc4, 1.0-0.beta2.7, 1.0.0 [dest/source] (LGPL) (http://www.dovecot.org/) (http://www.dovecot.org/)
    • Eudora WorldMail v2 (http://www.eudora.com/worldmail/)
    • +
    • Fusemail imap.fusemail.net:143 (https://www.fusemail.com/).
    • Gimap (Gmail imap) [host1] [host2] (http://mail.google.com/)
    • GMX IMAP4 StreamProxy. (http://www.gmx.com/)
    • Godaddy IMAP (since Godaddy runs Courier) (http://www.godaddy.com/)
    • @@ -712,9 +738,11 @@ I like it. (http://www.oracle.com/technetwork/middleware/beehive/)
    • Qualcomm Worldmail (NT) (http://www.eudora.com/worldmail/)
    • Rockliffe Mailsite 5.3.11, 4.5.6 (http://www.mailsite.com/)
    • +
    • RackSpace hoster secure.emailsrvr.com:993 http://www.rackspace.com/)
    • QQMail IMAP4Server [host1] [host2] (See FAQ) https://en.mail.qq.com/
    • Samsung Contact IMAP server 8.5.0
    • Scalix v10.1, 10.0.1.3, 11.0.0.431, 11.4.6 (http://www.scalix.com/)
    • +
    • Sendmail Mail Store IMAP4rev1 (5.5.6/mstore-5-5-build-1874 [host1].
    • SmarterMail, Smarter Mail 5.0 Enterprise, Smarter Mail 5.5 [host1], SmarterMail Professional 10.2 [host1]. (http://www.smartertools.com/)
    • Softalk Workgroup Mail 7.6.4 [host1] (http://www.softalkltd.com/products/download_wm_v7.asp).
    • SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) (http://www.oracle.com/)
    • @@ -737,7 +765,7 @@ I like it.
      -

      +


      This document last modified on -($Id: index.shtml,v 1.180 2013/08/19 21:30:37 gilles Exp gilles $) +($Id: index.shtml,v 1.185 2013/09/21 22:28:26 gilles Exp gilles $)

      diff --git a/perlcritic_1.out b/perlcritic_1.out index 15528b7..4b59120 100644 --- a/perlcritic_1.out +++ b/perlcritic_1.out @@ -7,1839 +7,1834 @@ Missing "DEPENDENCIES" section in POD at line 1, column 1. See pages 133,138 of Missing "INCOMPATIBILITIES" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) Missing "BUGS AND LIMITATIONS" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) Missing "LICENSE AND COPYRIGHT" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) -Main code has high complexity score (333) at line 1, column 1. Consider refactoring. (Severity: 3) +Main code has high complexity score (335) at line 1, column 1. Consider refactoring. (Severity: 3) POD before __END__ at line 16, column 1. See pages 139,140 of PBP. (Severity: 1) -Magic punctuation variable used at line 548, column 3. See page 79 of PBP. (Severity: 2) -File lexical variable "$debugLIST" is not all lower case or all upper case at line 575, column 1. See pages 45,46 of PBP. (Severity: 1) -File lexical variable "$flagsCase" is not all lower case or all upper case at line 575, column 1. See pages 45,46 of PBP. (Severity: 1) -File lexical variable "$ssl1_SSL_version" is not all lower case or all upper case at line 575, column 1. See pages 45,46 of PBP. (Severity: 1) -File lexical variable "$ssl2_SSL_version" is not all lower case or all upper case at line 575, column 1. See pages 45,46 of PBP. (Severity: 1) -File lexical variable "$fixInboxINBOX" is not all lower case or all upper case at line 575, column 1. See pages 45,46 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 576, column 41. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 578, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Magic punctuation variable used at line 551, column 3. See page 79 of PBP. (Severity: 2) +File lexical variable "$debugLIST" is not all lower case or all upper case at line 578, column 1. See pages 45,46 of PBP. (Severity: 1) +File lexical variable "$flagsCase" is not all lower case or all upper case at line 578, column 1. See pages 45,46 of PBP. (Severity: 1) +File lexical variable "$ssl1_SSL_version" is not all lower case or all upper case at line 578, column 1. See pages 45,46 of PBP. (Severity: 1) +File lexical variable "$ssl2_SSL_version" is not all lower case or all upper case at line 578, column 1. See pages 45,46 of PBP. (Severity: 1) +File lexical variable "$fixInboxINBOX" is not all lower case or all upper case at line 578, column 1. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 579, column 41. Don't use whitespace at the end of lines. (Severity: 1) Found "\N{SPACE}" at the end of the line at line 581, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 584, column 28. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 591, column 28. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 594, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 600, column 40. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 602, column 18. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 605, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 609, column 29. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 610, column 18. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 620, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 621, column 29. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 624, column 43. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 626, column 39. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 627, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 631, column 22. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 667, column 8. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 705, column 15. Don't use whitespace at the end of lines. (Severity: 1) -64 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 708, column 10. Unnamed numeric literals make code less maintainable. (Severity: 2) -Builtin function called with parentheses at line 720, column 14. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 721, column 18. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 724, column 21. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 725, column 1. See pages 208,278 of PBP. (Severity: 1) -Quotes used with an empty string at line 731, column 61. See page 53 of PBP. (Severity: 2) -5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 759, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) -5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 760, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) -Postfix control "if" used at line 769, column 15. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 769, column 36. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 770, column 21. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 770, column 44. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 776, column 25. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 781, column 24. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 781, column 46. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 783, column 1. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 785, column 1. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 788, column 25. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 792, column 23. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 795, column 15. See pages 93,94 of PBP. (Severity: 2) -100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 798, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) -100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 799, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) -Useless interpolation of literal string at line 801, column 26. See page 51 of PBP. (Severity: 1) -993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 802, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) -143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 802, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 584, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 587, column 28. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 594, column 28. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 597, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 603, column 40. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 605, column 18. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 608, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 612, column 29. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 613, column 18. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 623, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 624, column 29. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 627, column 43. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 629, column 39. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 630, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 634, column 22. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 670, column 8. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 708, column 15. Don't use whitespace at the end of lines. (Severity: 1) +64 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 711, column 10. Unnamed numeric literals make code less maintainable. (Severity: 2) +Builtin function called with parentheses at line 723, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 724, column 18. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 727, column 21. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 728, column 1. See pages 208,278 of PBP. (Severity: 1) +Quotes used with an empty string at line 734, column 61. See page 53 of PBP. (Severity: 2) +5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 762, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) +5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 763, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 772, column 15. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 772, column 36. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 773, column 21. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 773, column 44. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 779, column 25. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 784, column 24. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 784, column 46. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 786, column 1. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 788, column 1. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 791, column 25. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 795, column 23. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 798, column 15. See pages 93,94 of PBP. (Severity: 2) +100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 801, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) +100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 802, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) Useless interpolation of literal string at line 804, column 26. See page 51 of PBP. (Severity: 1) 993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 805, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) 143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 805, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) -Postfix control "if" used at line 807, column 31. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 808, column 12. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 821, column 20. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 822, column 5. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 822, column 10. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 822, column 46. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 829, column 26. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 830, column 26. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 840, column 9. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 846, column 9. See pages 208,278 of PBP. (Severity: 1) -3 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 847, column 21. Unnamed numeric literals make code less maintainable. (Severity: 2) -Builtin function called with parentheses at line 850, column 49. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 852, column 17. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 854, column 22. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 855, column 18. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 861, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 866, column 2. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 866, column 8. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 872, column 2. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 872, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 807, column 26. See page 51 of PBP. (Severity: 1) +993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 808, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) +143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 808, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 810, column 31. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 811, column 12. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 824, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 825, column 5. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 825, column 10. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 825, column 46. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 832, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 833, column 26. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 843, column 9. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 849, column 9. See pages 208,278 of PBP. (Severity: 1) +3 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 850, column 21. Unnamed numeric literals make code less maintainable. (Severity: 2) +Builtin function called with parentheses at line 853, column 49. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 855, column 17. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 857, column 22. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 858, column 18. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 864, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 869, column 2. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 869, column 8. See page 51 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 875, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 880, column 5. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 885, column 5. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 892, column 5. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 899, column 14. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 900, column 14. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 903, column 24. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 907, column 24. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 913, column 1. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 914, column 1. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 875, column 8. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 878, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 883, column 5. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 888, column 5. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 895, column 5. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 902, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 903, column 14. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 906, column 24. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 910, column 24. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 916, column 1. See pages 208,278 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 917, column 1. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 920, column 14. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 921, column 17. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 922, column 22. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 926, column 13. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 927, column 13. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 929, column 21. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 930, column 21. See page 13 of PBP. (Severity: 1) -Long number not separated with underscores at line 934, column 20. See page 59 of PBP. (Severity: 2) -Useless interpolation of literal string at line 936, column 16. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 936, column 30. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 936, column 44. See page 51 of PBP. (Severity: 1) -Postfix control "unless" used at line 936, column 57. See pages 96,97 of PBP. (Severity: 2) -Builtin function called with parentheses at line 941, column 34. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 947, column 1. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 948, column 1. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 954, column 16. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 960, column 16. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 963, column 19. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 964, column 50. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 966, column 22. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 967, column 22. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 971, column 26. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 973, column 20. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 974, column 21. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 978, column 27. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 978, column 49. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 979, column 20. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 986, column 66. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 992, column 66. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 998, column 18. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 999, column 18. See page 51 of PBP. (Severity: 1) -Postfix control "unless" used at line 1003, column 43. See pages 96,97 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1004, column 1. See pages 208,278 of PBP. (Severity: 1) -Postfix control "unless" used at line 1005, column 43. See pages 96,97 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1006, column 1. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1008, column 1. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1008, column 7. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 1008, column 34. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1008, column 34. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 920, column 1. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 923, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 924, column 17. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 925, column 22. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 929, column 13. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 930, column 13. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 932, column 21. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 933, column 21. See page 13 of PBP. (Severity: 1) +Long number not separated with underscores at line 937, column 20. See page 59 of PBP. (Severity: 2) +Useless interpolation of literal string at line 939, column 16. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 939, column 30. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 939, column 44. See page 51 of PBP. (Severity: 1) +Postfix control "unless" used at line 939, column 57. See pages 96,97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 944, column 34. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 950, column 1. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 951, column 1. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 957, column 16. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 963, column 16. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 966, column 19. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 967, column 50. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 969, column 22. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 970, column 22. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 974, column 26. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 976, column 20. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 977, column 21. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 981, column 27. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 981, column 49. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 982, column 20. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 989, column 66. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 995, column 66. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1001, column 18. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1002, column 18. See page 51 of PBP. (Severity: 1) +Postfix control "unless" used at line 1006, column 43. See pages 96,97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1007, column 1. See pages 208,278 of PBP. (Severity: 1) +Postfix control "unless" used at line 1008, column 43. See pages 96,97 of PBP. (Severity: 2) Return value of flagged function ignored - print at line 1009, column 1. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1009, column 7. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 1009, column 34. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1009, column 34. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 1012, column 15. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1019, column 73. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1020, column 46. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1021, column 34. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1022, column 54. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1023, column 28. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1042, column 2. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1043, column 2. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1045, column 5. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1045, column 39. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1047, column 6. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 1050, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1053, column 29. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 1055, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1057, column 6. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1065, column 10. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1072, column 6. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 1074, column 33. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1074, column 33. See page 237 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1076, column 3. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1080, column 6. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1082, column 32. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 1083, column 33. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1083, column 33. See page 237 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1085, column 3. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1092, column 22. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1094, column 4. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1100, column 29. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1110, column 21. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 1114, column 40. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1115, column 40. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1117, column 27. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 1118, column 43. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1119, column 43. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1122, column 1. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1123, column 1. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1140, column 2. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1141, column 34. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1151, column 58. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1152, column 55. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1153, column 11. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 1157, column 15. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1159, column 1. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1159, column 6. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1164, column 1. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1164, column 6. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 1165, column 3. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1165, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1166, column 25. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1166, column 62. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 1167, column 3. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1172, column 1. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1172, column 42. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 1175, column 32. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1178, column 1. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1193, column 2. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 1198, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1199, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1200, column 9. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 1203, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1205, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1208, column 44. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1209, column 57. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1213, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1219, column 3. See pages 208,278 of PBP. (Severity: 1) -"unless" block used at line 1220, column 3. See page 97 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 1224, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1226, column 22. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1227, column 3. See pages 208,278 of PBP. (Severity: 1) -"unless" block used at line 1228, column 3. See page 97 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 1230, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1239, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1240, column 26. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1245, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1249, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1250, column 26. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1255, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1259, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 1260, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1261, column 50. See page 53 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1267, column 3. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1269, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1271, column 3. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1271, column 9. See page 51 of PBP. (Severity: 1) -Double-sigil dereference at line 1271, column 39. See page 228 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1271, column 70. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 1273, column 50. See page 228 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 1275, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1011, column 1. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1011, column 7. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1011, column 34. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1011, column 34. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1012, column 1. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1012, column 7. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1012, column 34. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1012, column 34. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1015, column 15. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1022, column 73. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1023, column 46. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1024, column 34. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1025, column 54. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1026, column 28. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1045, column 2. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1046, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1048, column 5. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1048, column 39. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1050, column 6. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1053, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1056, column 29. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1058, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1060, column 6. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1068, column 10. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1075, column 6. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1077, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1077, column 33. See page 237 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1079, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1083, column 6. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1085, column 32. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1086, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1086, column 33. See page 237 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1088, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1095, column 22. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1097, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1103, column 29. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1113, column 21. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1117, column 40. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1118, column 40. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1120, column 27. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1121, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1122, column 43. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1125, column 1. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1126, column 1. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1143, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1144, column 34. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1154, column 58. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1155, column 55. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1156, column 11. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 1160, column 15. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1162, column 1. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1162, column 6. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1167, column 1. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1167, column 6. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1168, column 3. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1168, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1169, column 25. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1169, column 62. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1170, column 3. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1175, column 1. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1175, column 42. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1178, column 32. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1181, column 1. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1196, column 2. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1201, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1202, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1203, column 9. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1206, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1208, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1211, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1212, column 57. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1216, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1222, column 3. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1223, column 3. See page 97 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1227, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1229, column 22. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1230, column 3. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1231, column 3. See page 97 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1233, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1242, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1243, column 26. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1248, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1252, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1253, column 26. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1258, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1262, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 1263, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1264, column 50. See page 53 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1270, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1272, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1274, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1274, column 9. See page 51 of PBP. (Severity: 1) +Double-sigil dereference at line 1274, column 39. See page 228 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1274, column 70. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 1276, column 50. See page 228 of PBP. (Severity: 2) Found "\t" at the end of the line at line 1278, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1282, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 1283, column 49. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 1284, column 30. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1281, column 1. Don't use whitespace at the end of lines. (Severity: 1) Found "\t" at the end of the line at line 1285, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1291, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1295, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 1286, column 49. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1287, column 30. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1288, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1294, column 1. Don't use whitespace at the end of lines. (Severity: 1) Found "\t" at the end of the line at line 1298, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 1302, column 57. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 1305, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1301, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1305, column 57. See pages 93,94 of PBP. (Severity: 2) Found "\t" at the end of the line at line 1308, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 1312, column 77. See pages 93,94 of PBP. (Severity: 2) -Double-sigil dereference at line 1315, column 2. See page 228 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1316, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 1319, column 48. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1319, column 57. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1319, column 73. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 1320, column 5. See pages 93,94 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1323, column 51. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1323, column 60. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1323, column 76. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 1324, column 3. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1327, column 2. See page 97 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1330, column 21. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 1330, column 53. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1338, column 9. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1339, column 38. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1340, column 4. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1347, column 4. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1349, column 38. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1356, column 36. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1358, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 1360, column 19. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1311, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1315, column 77. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1318, column 2. See page 228 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1319, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1322, column 48. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1322, column 57. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1322, column 73. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1323, column 5. See pages 93,94 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1326, column 51. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1326, column 60. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1326, column 76. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1327, column 3. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1330, column 2. See page 97 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1333, column 21. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1333, column 53. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1341, column 9. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1342, column 38. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1343, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1350, column 4. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1352, column 38. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1359, column 36. See page 13 of PBP. (Severity: 1) Found "\N{SPACE}" at the end of the line at line 1361, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1363, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 1365, column 79. See pages 93,94 of PBP. (Severity: 2) -Double-sigil dereference at line 1369, column 2. See page 228 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1373, column 48. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1373, column 57. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1373, column 73. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 1374, column 3. See pages 93,94 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1377, column 51. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1377, column 60. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1377, column 76. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 1378, column 3. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 1382, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 1386, column 37. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1387, column 9. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1388, column 25. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1394, column 4. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1397, column 36. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1399, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1400, column 9. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1400, column 107. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 1401, column 10. See pages 93,94 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1402, column 19. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 1406, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1407, column 32. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1408, column 53. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1363, column 19. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1364, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1366, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1368, column 79. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1372, column 2. See page 228 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1376, column 48. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1376, column 57. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1376, column 73. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1377, column 3. See pages 93,94 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1380, column 51. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1380, column 60. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1380, column 76. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1381, column 3. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1385, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1389, column 37. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1390, column 9. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1391, column 25. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1397, column 4. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1400, column 36. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1402, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1403, column 9. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1403, column 107. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1404, column 10. See pages 93,94 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1405, column 19. See page 51 of PBP. (Severity: 1) Found "\t" at the end of the line at line 1409, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1411, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1412, column 32. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1413, column 53. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1415, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1416, column 33. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1420, column 4. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1421, column 4. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 1421, column 33. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1422, column 4. See page 97 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1429, column 4. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 1430, column 39. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1433, column 18. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 1434, column 38. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1437, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1438, column 23. See page 13 of PBP. (Severity: 1) -"unless" block used at line 1443, column 4. See page 97 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1443, column 12. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 1445, column 45. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1445, column 45. See page 51 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 1446, column 31. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1446, column 31. See page 237 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1447, column 5. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 1448, column 7. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1449, column 5. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 1449, column 32. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1450, column 5. See page 97 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1457, column 4. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1458, column 25. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 1458, column 52. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1459, column 4. See page 97 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1466, column 4. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 1467, column 39. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1470, column 18. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 1471, column 38. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1475, column 19. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1476, column 10. See pages 208,278 of PBP. (Severity: 1) -"unless" block used at line 1480, column 4. See page 97 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1480, column 13. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 1481, column 49. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1481, column 49. See page 51 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 1482, column 31. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1482, column 31. See page 237 of PBP. (Severity: 2) -"unless" block used at line 1483, column 5. See page 97 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1493, column 4. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1496, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1498, column 4. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1501, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1502, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1505, column 25. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1508, column 38. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1511, column 34. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1512, column 41. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 1512, column 70. See pages 93,94 of PBP. (Severity: 2) -Code structure is deeply nested at line 1513, column 41. Consider refactoring. (Severity: 3) -"unless" block used at line 1513, column 41. See page 97 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1520, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1523, column 4. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 1524, column 39. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1527, column 18. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 1528, column 38. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1531, column 59. Don't use whitespace at the end of lines. (Severity: 1) -"unless" block used at line 1546, column 3. See page 97 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1546, column 11. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1549, column 42. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1550, column 26. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1563, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1566, column 44. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1570, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 1581, column 47. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1582, column 44. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 1582, column 59. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1583, column 4. See pages 208,278 of PBP. (Severity: 1) -"unless" block used at line 1584, column 4. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1587, column 23. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 1590, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1603, column 56. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1605, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1613, column 34. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1614, column 18. See pages 208,278 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 1619, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1621, column 3. See pages 208,278 of PBP. (Severity: 1) -"unless" block used at line 1622, column 3. See page 97 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1625, column 3. See pages 208,278 of PBP. (Severity: 1) -"unless" block used at line 1626, column 3. See page 97 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1629, column 19. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1637, column 10. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1639, column 10. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1643, column 1. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1644, column 18. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1651, column 51. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1652, column 51. See page 51 of PBP. (Severity: 1) -Postfix control "unless" used at line 1655, column 20. See pages 96,97 of PBP. (Severity: 2) -Postfix control "unless" used at line 1656, column 20. See pages 96,97 of PBP. (Severity: 2) -Postfix control "if" used at line 1660, column 17. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 1670, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Too many arguments at line 1680, column 1. See page 182 of PBP. (Severity: 3) -Useless interpolation of literal string at line 1683, column 41. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1687, column 45. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 1687, column 58. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1688, column 45. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 1688, column 58. See page 53 of PBP. (Severity: 2) -Too many arguments at line 1695, column 1. See page 182 of PBP. (Severity: 3) -Found "\N{SPACE}" at the end of the line at line 1697, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1700, column 9. See pages 208,278 of PBP. (Severity: 1) -Too many arguments at line 1705, column 1. See page 182 of PBP. (Severity: 3) -Found "\N{SPACE}" at the end of the line at line 1708, column 31. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1715, column 31. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1718, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1720, column 22. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 1720, column 28. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1721, column 22. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 1721, column 28. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1724, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1730, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 1733, column 26. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1743, column 28. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1743, column 28. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1745, column 19. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1747, column 27. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1748, column 27. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1749, column 31. See page 51 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 1751, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1751, column 17. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 1761, column 55. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1761, column 55. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 1762, column 74. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1762, column 74. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1767, column 17. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1767, column 17. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 1767, column 58. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1768, column 17. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1768, column 17. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1778, column 28. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1780, column 10. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1784, column 21. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1785, column 21. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1786, column 21. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1787, column 12. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1787, column 34. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1788, column 28. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1789, column 28. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1790, column 32. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1791, column 23. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1791, column 34. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1792, column 18. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1792, column 25. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1792, column 36. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 1799, column 23. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1799, column 23. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1799, column 28. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1801, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1807, column 3. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1807, column 9. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1812, column 16. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1818, column 12. See page 13 of PBP. (Severity: 1) -Subroutine "modules_VERSION" is not all lower case or all upper case at line 1822, column 1. See pages 45,46 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1827, column 77. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1827, column 77. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1828, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1830, column 65. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1830, column 65. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1410, column 32. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1411, column 53. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1412, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1414, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1415, column 32. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1416, column 53. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1418, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1419, column 33. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1423, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1424, column 4. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 1424, column 33. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1425, column 4. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1432, column 4. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1433, column 39. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1436, column 18. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1437, column 38. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1440, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1441, column 23. See page 13 of PBP. (Severity: 1) +"unless" block used at line 1446, column 4. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1446, column 12. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1448, column 45. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1448, column 45. See page 51 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1449, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1449, column 31. See page 237 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1450, column 5. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1451, column 7. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1452, column 5. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 1452, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1453, column 5. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1460, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1461, column 25. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 1461, column 52. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1462, column 4. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1469, column 4. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1470, column 39. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1473, column 18. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1474, column 38. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1478, column 19. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1479, column 10. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1483, column 4. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1483, column 13. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1484, column 49. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1484, column 49. See page 51 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1485, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1485, column 31. See page 237 of PBP. (Severity: 2) +"unless" block used at line 1486, column 5. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1496, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1499, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1501, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1504, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1505, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1508, column 25. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1511, column 38. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1514, column 34. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1515, column 41. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 1515, column 70. See pages 93,94 of PBP. (Severity: 2) +Code structure is deeply nested at line 1516, column 41. Consider refactoring. (Severity: 3) +"unless" block used at line 1516, column 41. See page 97 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1523, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1526, column 4. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1527, column 39. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1530, column 18. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1531, column 38. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1534, column 59. Don't use whitespace at the end of lines. (Severity: 1) +"unless" block used at line 1549, column 3. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1549, column 11. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1552, column 42. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1553, column 26. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1566, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1569, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1573, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 1584, column 47. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1585, column 44. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1585, column 59. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1586, column 4. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1587, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1590, column 23. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1593, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1606, column 56. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1608, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1616, column 34. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1617, column 18. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1622, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1624, column 3. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1625, column 3. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1628, column 3. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1629, column 3. See page 97 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1632, column 19. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1640, column 10. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1642, column 10. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1646, column 1. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1647, column 18. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1654, column 51. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1655, column 51. See page 51 of PBP. (Severity: 1) +Postfix control "unless" used at line 1658, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1659, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 1663, column 17. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1673, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Too many arguments at line 1683, column 1. See page 182 of PBP. (Severity: 3) +Useless interpolation of literal string at line 1686, column 41. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1690, column 45. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1690, column 58. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1691, column 45. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1691, column 58. See page 53 of PBP. (Severity: 2) +Too many arguments at line 1698, column 1. See page 182 of PBP. (Severity: 3) +Found "\N{SPACE}" at the end of the line at line 1700, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1703, column 9. See pages 208,278 of PBP. (Severity: 1) +Too many arguments at line 1708, column 1. See page 182 of PBP. (Severity: 3) +Found "\N{SPACE}" at the end of the line at line 1711, column 31. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1718, column 31. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1721, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1723, column 22. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1723, column 28. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1724, column 22. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1724, column 28. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1727, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1733, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 1736, column 26. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1746, column 28. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1746, column 28. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1748, column 19. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1750, column 27. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1751, column 27. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1752, column 31. See page 51 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1754, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1754, column 17. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 1764, column 55. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1764, column 55. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1765, column 74. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1765, column 74. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1770, column 17. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1770, column 17. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1770, column 58. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1771, column 17. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1771, column 17. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1781, column 28. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1783, column 10. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1787, column 21. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1788, column 21. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1789, column 21. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1790, column 12. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1790, column 34. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1791, column 28. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1792, column 28. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1793, column 32. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1794, column 23. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1794, column 34. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1795, column 18. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1795, column 25. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1795, column 36. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1802, column 23. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1802, column 23. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1802, column 28. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1804, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1810, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1810, column 9. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1815, column 16. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1821, column 12. See page 13 of PBP. (Severity: 1) +Subroutine "modules_VERSION" is not all lower case or all upper case at line 1825, column 1. See pages 45,46 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1830, column 77. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1830, column 77. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1831, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1833, column 73. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1833, column 73. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1833, column 65. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1833, column 65. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1834, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1836, column 77. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1836, column 77. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1836, column 73. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1836, column 73. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1837, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1839, column 76. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1839, column 76. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1839, column 77. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1839, column 77. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1840, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1842, column 68. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1842, column 68. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1842, column 76. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1842, column 76. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1843, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1845, column 67. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1845, column 67. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1845, column 68. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1845, column 68. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1846, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1848, column 77. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1848, column 77. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1848, column 67. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1848, column 67. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1849, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1851, column 79. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1851, column 79. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1851, column 77. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1851, column 77. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1852, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1854, column 71. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1854, column 71. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1854, column 79. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1854, column 79. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1855, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1857, column 69. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1857, column 69. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1857, column 71. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1857, column 71. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1858, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1860, column 65. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1860, column 65. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1860, column 69. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1860, column 69. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1861, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1863, column 67. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1863, column 67. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1863, column 65. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1863, column 65. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1864, column 2. See page 13 of PBP. (Severity: 1) Useless interpolation of literal string at line 1866, column 67. See page 51 of PBP. (Severity: 1) Quotes used with a noisy string at line 1866, column 67. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1867, column 2. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1869, column 69. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 1869, column 69. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1869, column 67. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1869, column 67. See page 53 of PBP. (Severity: 2) Builtin function called with parentheses at line 1870, column 2. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1880, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 1883, column 13. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 1884, column 15. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1884, column 15. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 1885, column 4. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 1886, column 4. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1886, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1872, column 69. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1872, column 69. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1873, column 2. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1883, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1886, column 13. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1887, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1887, column 15. See page 237 of PBP. (Severity: 2) Builtin function called with parentheses at line 1888, column 4. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 1896, column 5. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1900, column 43. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 1903, column 5. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1907, column 44. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 1914, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1925, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1933, column 2. See pages 208,278 of PBP. (Severity: 1) -Too many arguments at line 1939, column 1. See page 182 of PBP. (Severity: 3) -Local lexical variable "$SSL_version" is not all lower case or all upper case at line 1940, column 2. See pages 45,46 of PBP. (Severity: 1) -Postfix control "if" used at line 1943, column 19. See pages 93,94 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 1948, column 17. See page 79 of PBP. (Severity: 2) -Postfix control "if" used at line 1953, column 29. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 1960, column 2. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1960, column 8. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 1961, column 2. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 1961, column 8. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 1961, column 35. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 1961, column 35. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1889, column 4. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1889, column 33. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1891, column 4. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1899, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1903, column 43. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 1906, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1910, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1917, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1928, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1936, column 2. See pages 208,278 of PBP. (Severity: 1) +Too many arguments at line 1942, column 1. See page 182 of PBP. (Severity: 3) +Local lexical variable "$SSL_version" is not all lower case or all upper case at line 1943, column 2. See pages 45,46 of PBP. (Severity: 1) +Postfix control "if" used at line 1946, column 19. See pages 93,94 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 1951, column 17. See page 79 of PBP. (Severity: 2) +Postfix control "if" used at line 1956, column 29. See pages 93,94 of PBP. (Severity: 2) Return value of flagged function ignored - print at line 1963, column 2. See pages 208,278 of PBP. (Severity: 1) Useless interpolation of literal string at line 1963, column 8. See page 51 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 1964, column 2. See pages 208,278 of PBP. (Severity: 1) Useless interpolation of literal string at line 1964, column 8. See page 51 of PBP. (Severity: 1) Quotes used with an empty string at line 1964, column 35. See page 53 of PBP. (Severity: 2) Useless interpolation of literal string at line 1964, column 35. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1973, column 48. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1977, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 1978, column 14. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 1985, column 48. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 1989, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 1990, column 14. See pages 93,94 of PBP. (Severity: 2) -Too many arguments at line 1994, column 1. See page 182 of PBP. (Severity: 3) -Found "\N{SPACE}" at the end of the line at line 1996, column 45. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 1997, column 39. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2004, column 43. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2005, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 2009, column 35. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 2009, column 38. See page 13 of PBP. (Severity: 1) -Local lexical variable "$Side" is not all lower case or all upper case at line 2017, column 2. See pages 45,46 of PBP. (Severity: 1) -Local lexical variable "$SSL_version" is not all lower case or all upper case at line 2017, column 2. See pages 45,46 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2017, column 45. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2018, column 39. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2022, column 13. See page 13 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated string at line 2026, column 17. See page 79 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 2027, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 2030, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2035, column 4. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 2041, column 22. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 2042, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2044, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 2045, column 2. See pages 208,278 of PBP. (Severity: 1) -Too many arguments at line 2050, column 1. See page 182 of PBP. (Severity: 3) -Local lexical variable "$Side" is not all lower case or all upper case at line 2052, column 2. See pages 45,46 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2053, column 52. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2054, column 39. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2061, column 38. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2061, column 38. See page 51 of PBP. (Severity: 1) -Postfix control "unless" used at line 2064, column 51. See pages 96,97 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2067, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 2068, column 32. See pages 93,94 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2068, column 48. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 2069, column 35. See pages 93,94 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2069, column 51. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2070, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 2072, column 32. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 2072, column 36. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2075, column 1. Don't use whitespace at the end of lines. (Severity: 1) -"unless" block used at line 2076, column 2. See page 97 of PBP. (Severity: 2) -Builtin function called with parentheses at line 2079, column 3. See page 13 of PBP. (Severity: 1) -File handle for "print" or "printf" is not braced at line 2084, column 4. See page 217 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2084, column 4. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2086, column 3. See pages 208,278 of PBP. (Severity: 1) -Quotes used with an empty string at line 2087, column 24. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2087, column 24. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2096, column 25. See page 13 of PBP. (Severity: 1) -Local lexical variable "$Side" is not all lower case or all upper case at line 2106, column 2. See pages 45,46 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2107, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2111, column 3. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2113, column 3. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2115, column 3. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2118, column 4. See pages 208,278 of PBP. (Severity: 1) -Local lexical variable "$SSL_version" is not all lower case or all upper case at line 2126, column 2. See pages 45,46 of PBP. (Severity: 1) -Quotes used with an empty string at line 2130, column 40. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2132, column 43. Don't use whitespace at the end of lines. (Severity: 1) -Too many arguments at line 2141, column 1. See page 182 of PBP. (Severity: 3) -Local lexical variable "$Side" is not all lower case or all upper case at line 2142, column 2. See pages 45,46 of PBP. (Severity: 1) -Local lexical variable "$SSL_version" is not all lower case or all upper case at line 2142, column 2. See pages 45,46 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2142, column 45. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2143, column 39. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2148, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1966, column 2. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1966, column 8. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1967, column 2. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1967, column 8. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1967, column 35. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1967, column 35. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1976, column 48. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1980, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1981, column 14. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1988, column 48. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1992, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1993, column 14. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 1997, column 1. See page 182 of PBP. (Severity: 3) +Found "\N{SPACE}" at the end of the line at line 1999, column 45. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2000, column 39. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2007, column 43. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2008, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 2012, column 35. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2012, column 38. See page 13 of PBP. (Severity: 1) +Local lexical variable "$Side" is not all lower case or all upper case at line 2020, column 2. See pages 45,46 of PBP. (Severity: 1) +Local lexical variable "$SSL_version" is not all lower case or all upper case at line 2020, column 2. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2020, column 45. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2021, column 39. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2025, column 13. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 2029, column 17. See page 79 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2030, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2033, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2038, column 4. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 2044, column 22. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2045, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2047, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2048, column 2. See pages 208,278 of PBP. (Severity: 1) +Too many arguments at line 2053, column 1. See page 182 of PBP. (Severity: 3) +Local lexical variable "$Side" is not all lower case or all upper case at line 2055, column 2. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2056, column 52. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2057, column 39. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2064, column 38. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2064, column 38. See page 51 of PBP. (Severity: 1) +Postfix control "unless" used at line 2067, column 51. See pages 96,97 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2070, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 2071, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2072, column 35. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2073, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 2074, column 32. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2074, column 36. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2077, column 1. Don't use whitespace at the end of lines. (Severity: 1) +"unless" block used at line 2078, column 2. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2081, column 3. See page 13 of PBP. (Severity: 1) +File handle for "print" or "printf" is not braced at line 2086, column 4. See page 217 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2086, column 4. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2088, column 3. See pages 208,278 of PBP. (Severity: 1) +Quotes used with an empty string at line 2089, column 24. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2089, column 24. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2098, column 25. See page 13 of PBP. (Severity: 1) +Local lexical variable "$Side" is not all lower case or all upper case at line 2108, column 2. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2109, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2113, column 3. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2115, column 3. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2117, column 3. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2120, column 4. See pages 208,278 of PBP. (Severity: 1) +Local lexical variable "$SSL_version" is not all lower case or all upper case at line 2128, column 2. See pages 45,46 of PBP. (Severity: 1) +Quotes used with an empty string at line 2132, column 40. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2134, column 43. Don't use whitespace at the end of lines. (Severity: 1) +Too many arguments at line 2143, column 1. See page 182 of PBP. (Severity: 3) +Local lexical variable "$Side" is not all lower case or all upper case at line 2144, column 2. See pages 45,46 of PBP. (Severity: 1) +Local lexical variable "$SSL_version" is not all lower case or all upper case at line 2144, column 2. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2144, column 45. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2145, column 39. Don't use whitespace at the end of lines. (Severity: 1) Found "\t" at the end of the line at line 2150, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 2152, column 19. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 2162, column 2. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 2164, column 41. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 2167, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2177, column 22. See page 13 of PBP. (Severity: 1) -Numeric escapes in interpolated string at line 2177, column 30. See page 56 of PBP. (Severity: 2) -Quotes used with an empty string at line 2179, column 41. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2179, column 41. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2189, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2191, column 22. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2192, column 19. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2192, column 27. See page 51 of PBP. (Severity: 1) -Local lexical variable "$URLparm" is not all lower case or all upper case at line 2193, column 9. See pages 45,46 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2193, column 23. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2193, column 31. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2194, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2197, column 26. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 2197, column 32. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2197, column 32. See page 237 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2199, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2206, column 39. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2210, column 65. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 2210, column 65. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2211, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2213, column 25. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2213, column 25. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2216, column 39. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 2216, column 39. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2218, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2221, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2225, column 82. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 2225, column 82. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2226, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2228, column 63. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2229, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2232, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2234, column 32. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2234, column 32. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2234, column 45. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 2234, column 45. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2234, column 61. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2234, column 61. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 2237, column 22. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2237, column 22. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2240, column 39. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 2240, column 39. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2242, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2245, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2152, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 2154, column 19. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2164, column 2. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 2166, column 41. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2169, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2179, column 22. See page 13 of PBP. (Severity: 1) +Numeric escapes in interpolated string at line 2179, column 30. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 2181, column 41. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2181, column 41. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2191, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2193, column 22. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2194, column 19. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2194, column 27. See page 51 of PBP. (Severity: 1) +Local lexical variable "$URLparm" is not all lower case or all upper case at line 2195, column 9. See pages 45,46 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2195, column 23. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2195, column 31. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2196, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2199, column 26. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 2199, column 32. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2199, column 32. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2201, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2208, column 39. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2212, column 65. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2212, column 65. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2213, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2215, column 25. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2215, column 25. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2218, column 39. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2218, column 39. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2220, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2223, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2227, column 82. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2227, column 82. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2228, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2230, column 63. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2231, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2234, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2236, column 32. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2236, column 32. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2236, column 45. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2236, column 45. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2236, column 61. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2236, column 61. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2239, column 22. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2239, column 22. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2242, column 39. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2242, column 39. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2244, column 1. Don't use whitespace at the end of lines. (Severity: 1) Found "\N{SPACE}" at the end of the line at line 2247, column 1. Don't use whitespace at the end of lines. (Severity: 1) Found "\N{SPACE}" at the end of the line at line 2249, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2251, column 41. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2251, column 41. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2264, column 24. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 2264, column 29. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2264, column 29. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2264, column 32. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2265, column 5. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2266, column 5. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2251, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2253, column 41. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2253, column 41. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2266, column 24. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2266, column 29. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2266, column 29. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2266, column 32. Don't use whitespace at the end of lines. (Severity: 1) String *may* require interpolation at line 2267, column 5. See page 51 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated string at line 2270, column 5. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2279, column 26. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2280, column 8. See page 79 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2285, column 20. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2287, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 2288, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2290, column 3. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2291, column 17. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2292, column 3. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 2294, column 3. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2297, column 2. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2298, column 3. See pages 208,278 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2301, column 1. Don't use whitespace at the end of lines. (Severity: 1) -File handle for "print" or "printf" is not braced at line 2302, column 2. See page 217 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2302, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of "close" ignored at line 2303, column 2. Check the return value of "close" for success. (Severity: 2) -Return value of flagged function ignored - close at line 2303, column 2. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2304, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2306, column 2. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2311, column 2. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2312, column 2. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2317, column 2. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2319, column 2. Don't use whitespace at the end of lines. (Severity: 1) -Magic punctuation variable used in interpolated string at line 2323, column 12. See page 79 of PBP. (Severity: 2) -Subroutine "fix_Inbox_INBOX_mapping" is not all lower case or all upper case at line 2328, column 1. See pages 45,46 of PBP. (Severity: 1) -Quotes used with an empty string at line 2331, column 14. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2333, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2334, column 79. See page 53 of PBP. (Severity: 2) -String *may* require interpolation at line 2335, column 79. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2336, column 79. See page 51 of PBP. (Severity: 1) -Subroutine "tests_fix_Inbox_INBOX_mapping" is not all lower case or all upper case at line 2341, column 1. See pages 45,46 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2344, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2345, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2346, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2347, column 6. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2348, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2349, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2350, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2351, column 6. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2352, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2353, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2354, column 25. See page 53 of PBP. (Severity: 2) -String *may* require interpolation at line 2355, column 6. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2356, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2357, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2358, column 25. See page 53 of PBP. (Severity: 2) -String *may* require interpolation at line 2359, column 6. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2360, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2361, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2362, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2363, column 6. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2364, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2365, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2366, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2367, column 6. See page 53 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 2375, column 3. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2375, column 8. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 2389, column 3. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2389, column 8. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2403, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 2404, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2405, column 27. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2407, column 17. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2412, column 4. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2412, column 4. See pages 208,278 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2450, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2451, column 10. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2457, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2461, column 10. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2466, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2470, column 10. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2475, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2476, column 22. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2476, column 48. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2477, column 22. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2477, column 52. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2478, column 21. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2479, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2480, column 10. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2481, column 10. See page 13 of PBP. (Severity: 1) -Double-sigil dereference at line 2488, column 28. See page 228 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 2490, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 2492, column 26. See page 228 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 2493, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 2501, column 36. See page 228 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 2502, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2509, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2268, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2269, column 5. See page 51 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 2272, column 5. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2281, column 26. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2282, column 8. See page 79 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2287, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2289, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2290, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2292, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2293, column 17. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2294, column 3. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2296, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2299, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2300, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2303, column 1. Don't use whitespace at the end of lines. (Severity: 1) +File handle for "print" or "printf" is not braced at line 2304, column 2. See page 217 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2304, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of "close" ignored at line 2305, column 2. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 2305, column 2. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2306, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2308, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2313, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2314, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2319, column 2. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2321, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Magic punctuation variable used in interpolated string at line 2325, column 12. See page 79 of PBP. (Severity: 2) +Subroutine "fix_Inbox_INBOX_mapping" is not all lower case or all upper case at line 2330, column 1. See pages 45,46 of PBP. (Severity: 1) +Quotes used with an empty string at line 2333, column 14. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2335, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2336, column 79. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 2337, column 79. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2338, column 79. See page 51 of PBP. (Severity: 1) +Subroutine "tests_fix_Inbox_INBOX_mapping" is not all lower case or all upper case at line 2343, column 1. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2346, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2347, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2348, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2349, column 6. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2350, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2351, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2352, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2353, column 6. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2354, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2355, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2356, column 25. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 2357, column 6. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2358, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2359, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2360, column 25. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 2361, column 6. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2362, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2363, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2364, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2365, column 6. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2366, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2367, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2368, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2369, column 6. See page 53 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 2377, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2377, column 8. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2391, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2391, column 8. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2405, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2406, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2407, column 27. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2409, column 17. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2414, column 4. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2414, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2452, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2453, column 10. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2459, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2463, column 10. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2468, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2472, column 10. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2477, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2478, column 22. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2478, column 48. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2479, column 22. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2479, column 52. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2480, column 21. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2481, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2482, column 10. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2483, column 10. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 2490, column 28. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2492, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 2494, column 26. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2495, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 2503, column 36. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2504, column 1. Don't use whitespace at the end of lines. (Severity: 1) Found "\t" at the end of the line at line 2511, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2525, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2526, column 46. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2527, column 46. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2513, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2527, column 1. Don't use whitespace at the end of lines. (Severity: 1) Useless interpolation of literal string at line 2528, column 46. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2529, column 46. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2530, column 46. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2531, column 46. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2532, column 46. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2535, column 43. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2536, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2533, column 46. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2534, column 46. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2537, column 43. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2538, column 43. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2539, column 43. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2541, column 50. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2545, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2546, column 26. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2546, column 33. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2547, column 26. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2547, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2540, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2541, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2543, column 50. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2547, column 1. Don't use whitespace at the end of lines. (Severity: 1) Useless interpolation of literal string at line 2548, column 26. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2548, column 34. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2548, column 33. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2549, column 26. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2549, column 33. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2550, column 26. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2550, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2550, column 34. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2551, column 26. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2551, column 33. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2551, column 38. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2552, column 26. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 2552, column 32. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2552, column 32. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2552, column 37. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2552, column 47. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2552, column 52. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2553, column 31. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 2553, column 37. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2553, column 37. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2553, column 42. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2553, column 52. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2553, column 57. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2562, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2564, column 7. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2565, column 3. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2570, column 30. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2576, column 3. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2576, column 8. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2577, column 5. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2577, column 47. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2589, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2590, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2591, column 7. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2592, column 3. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2597, column 29. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2600, column 3. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2600, column 8. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2601, column 5. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2601, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2602, column 22. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2607, column 3. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2608, column 5. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2608, column 47. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2618, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2624, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2630, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with a noisy string at line 2635, column 49. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 2636, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2645, column 16. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 2645, column 21. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 2652, column 11. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2653, column 11. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 2653, column 38. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2654, column 38. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2654, column 42. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 2655, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2656, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2656, column 30. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2656, column 34. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2552, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2552, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2553, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2553, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2553, column 38. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2554, column 26. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2554, column 32. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2554, column 32. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2554, column 37. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2554, column 47. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2554, column 52. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2555, column 31. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2555, column 37. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2555, column 37. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2555, column 42. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2555, column 52. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2555, column 57. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2564, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2566, column 7. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2567, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2572, column 30. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2578, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2578, column 8. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2579, column 5. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2579, column 47. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2591, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2592, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2593, column 7. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2594, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2599, column 29. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2602, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2602, column 8. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2603, column 5. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2603, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2604, column 22. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2609, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2610, column 5. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2610, column 47. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2620, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2626, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2632, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with a noisy string at line 2637, column 49. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2638, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2647, column 16. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2647, column 21. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2654, column 11. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2655, column 11. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2655, column 38. See page 53 of PBP. (Severity: 2) Quotes used with an empty string at line 2656, column 38. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2657, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2657, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2658, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2658, column 51. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2659, column 48. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2659, column 53. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2660, column 48. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2660, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2656, column 42. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2657, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2658, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2658, column 30. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2658, column 34. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2658, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2659, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2659, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2660, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2660, column 51. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2661, column 48. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2661, column 53. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2662, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2662, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2662, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2662, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2663, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2663, column 53. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2664, column 50. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2664, column 55. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2666, column 50. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2666, column 55. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 2674, column 27. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2674, column 54. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2674, column 86. See page 13 of PBP. (Severity: 1) -Numeric escapes in interpolated string at line 2676, column 12. See page 56 of PBP. (Severity: 2) -Use only '//' or '{}' to delimit regexps at line 2679, column 14. See page 246 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 2679, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2679, column 14. See page 237 of PBP. (Severity: 2) -Use only '//' or '{}' to delimit regexps at line 2680, column 14. See page 246 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 2680, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2680, column 14. See page 237 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2668, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2668, column 55. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2676, column 27. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2676, column 54. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2676, column 86. See page 13 of PBP. (Severity: 1) +Numeric escapes in interpolated string at line 2678, column 12. See page 56 of PBP. (Severity: 2) Use only '//' or '{}' to delimit regexps at line 2681, column 14. See page 246 of PBP. (Severity: 1) Regular expression without "/s" flag at line 2681, column 14. See pages 240,241 of PBP. (Severity: 2) Regular expression without "/m" flag at line 2681, column 14. See page 237 of PBP. (Severity: 2) -Use only '//' or '{}' to delimit regexps at line 2682, column 21. See page 246 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 2682, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2682, column 21. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 2682, column 30. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2682, column 49. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2682, column 74. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2684, column 2. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2689, column 27. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2690, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2691, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2702, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2702, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2709, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2709, column 28. See page 53 of PBP. (Severity: 2) -String *may* require interpolation at line 2719, column 17. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2720, column 45. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 2724, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2724, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2731, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2732, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2733, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2733, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2740, column 14. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2754, column 13. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2754, column 13. See page 237 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2759, column 34. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "unless" used at line 2760, column 4. See pages 96,97 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2760, column 26. See page 51 of PBP. (Severity: 1) -Use 'eq' or hash instead of fixed-pattern regexps at line 2760, column 62. See pages 271,272 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2760, column 62. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2760, column 62. See page 237 of PBP. (Severity: 2) -Expression form of "eval" at line 2766, column 13. See page 161 of PBP. (Severity: 5) -Builtin function called with parentheses at line 2766, column 13. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2768, column 28. See page 13 of PBP. (Severity: 1) -Magic punctuation variable used at line 2768, column 49. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2769, column 14. See page 79 of PBP. (Severity: 2) -Quotes used with an empty string at line 2777, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2777, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2777, column 57. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2778, column 28. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2786, column 42. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2786, column 42. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 2787, column 17. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2787, column 21. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 2798, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 2799, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2803, column 3. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2804, column 47. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2805, column 11. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2805, column 11. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2808, column 47. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2809, column 11. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 2809, column 11. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2812, column 1. Don't use whitespace at the end of lines. (Severity: 1) -"unless" block used at line 2813, column 3. See page 97 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 2814, column 4. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2814, column 9. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2820, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2823, column 14. See page 13 of PBP. (Severity: 1) -Double-sigil dereference at line 2825, column 3. See page 228 of PBP. (Severity: 2) -Postfix control "if" used at line 2825, column 35. See pages 93,94 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2828, column 32. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 2828, column 71. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2828, column 71. See page 79 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2831, column 59. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 2831, column 100. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2831, column 100. See page 79 of PBP. (Severity: 2) -Double-sigil dereference at line 2833, column 15. See page 228 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2834, column 59. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2839, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 2840, column 3. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2840, column 11. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2841, column 3. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2841, column 11. See page 51 of PBP. (Severity: 1) +Use only '//' or '{}' to delimit regexps at line 2682, column 14. See page 246 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 2682, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2682, column 14. See page 237 of PBP. (Severity: 2) +Use only '//' or '{}' to delimit regexps at line 2683, column 14. See page 246 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 2683, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2683, column 14. See page 237 of PBP. (Severity: 2) +Use only '//' or '{}' to delimit regexps at line 2684, column 21. See page 246 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 2684, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2684, column 21. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 2684, column 30. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2684, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2684, column 74. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2686, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2691, column 27. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2692, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2693, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2704, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2704, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2711, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2711, column 28. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 2721, column 17. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2722, column 45. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2726, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2726, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2733, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2734, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2735, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2735, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2742, column 14. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2756, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2756, column 13. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2761, column 34. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "unless" used at line 2762, column 4. See pages 96,97 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2762, column 26. See page 51 of PBP. (Severity: 1) +Use 'eq' or hash instead of fixed-pattern regexps at line 2762, column 62. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2762, column 62. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2762, column 62. See page 237 of PBP. (Severity: 2) +Expression form of "eval" at line 2768, column 13. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 2768, column 13. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2770, column 28. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used at line 2770, column 49. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2771, column 14. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 2779, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2779, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2779, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2780, column 28. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2788, column 42. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2788, column 42. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 2789, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2789, column 21. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2800, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2801, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2805, column 3. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2806, column 47. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2807, column 11. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2807, column 11. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2810, column 47. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2811, column 11. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2811, column 11. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2814, column 1. Don't use whitespace at the end of lines. (Severity: 1) +"unless" block used at line 2815, column 3. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 2816, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2816, column 9. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2822, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2825, column 14. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 2827, column 3. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 2827, column 35. See pages 93,94 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2830, column 32. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2830, column 71. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2830, column 71. See page 79 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2833, column 59. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2833, column 100. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2833, column 100. See page 79 of PBP. (Severity: 2) +Double-sigil dereference at line 2835, column 15. See page 228 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2836, column 59. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2841, column 1. Don't use whitespace at the end of lines. (Severity: 1) Builtin function called with parentheses at line 2842, column 3. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2847, column 2. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2848, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2842, column 11. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2843, column 3. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2843, column 11. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2844, column 3. See page 13 of PBP. (Severity: 1) Builtin function called with parentheses at line 2849, column 2. See page 13 of PBP. (Severity: 1) Builtin function called with parentheses at line 2850, column 2. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2875, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2876, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2877, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2877, column 23. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2877, column 28. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2878, column 5. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2878, column 42. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 2881, column 19. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 2881, column 41. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2882, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2884, column 5. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2884, column 35. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2884, column 59. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2885, column 16. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2886, column 37. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2886, column 61. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2886, column 91. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2887, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2851, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2852, column 2. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2877, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2878, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2879, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2879, column 23. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2879, column 28. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2880, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2880, column 42. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2883, column 19. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2883, column 41. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2884, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2886, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2886, column 35. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2886, column 59. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2887, column 16. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2888, column 37. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2888, column 61. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2888, column 91. See page 51 of PBP. (Severity: 1) Found "\t" at the end of the line at line 2889, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2890, column 5. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2890, column 37. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2890, column 92. See page 51 of PBP. (Severity: 1) Found "\t" at the end of the line at line 2891, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2893, column 5. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2893, column 41. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2893, column 120. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2894, column 5. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2894, column 43. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2894, column 133. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2896, column 16. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2897, column 67. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2899, column 59. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2900, column 59. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2901, column 64. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2902, column 51. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2903, column 43. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2905, column 16. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2906, column 55. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2907, column 64. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2908, column 52. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2910, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2911, column 16. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2911, column 49. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2912, column 2. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2913, column 63. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2914, column 59. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2915, column 59. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2892, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2892, column 37. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2892, column 92. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2893, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2895, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2895, column 41. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2895, column 120. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2896, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2896, column 43. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2896, column 133. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2898, column 16. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2899, column 67. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2901, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2902, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2903, column 64. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2904, column 51. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2905, column 43. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2907, column 16. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2908, column 55. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2909, column 64. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2910, column 52. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2912, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2913, column 16. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2913, column 49. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2914, column 2. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2915, column 63. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2916, column 59. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2917, column 83. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2918, column 61. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2919, column 72. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2920, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2921, column 16. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2922, column 77. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2924, column 78. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2925, column 1. Don't use whitespace at the end of lines. (Severity: 1) -List declaration without trailing comma at line 2926, column 15. See page 17 of PBP. (Severity: 1) -String *may* require interpolation at line 2927, column 2. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2928, column 2. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2928, column 42. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2917, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2918, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2919, column 83. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2920, column 61. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2921, column 72. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2922, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2923, column 16. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2924, column 77. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2926, column 78. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2927, column 1. Don't use whitespace at the end of lines. (Severity: 1) +List declaration without trailing comma at line 2928, column 15. See page 17 of PBP. (Severity: 1) String *may* require interpolation at line 2929, column 2. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2932, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2933, column 63. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2934, column 59. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2935, column 59. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2930, column 2. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2930, column 42. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2931, column 2. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2934, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2935, column 63. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 2936, column 59. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2937, column 83. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2938, column 61. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2939, column 72. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 2940, column 5. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2940, column 48. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2941, column 1. Don't use whitespace at the end of lines. (Severity: 1) -List declaration without trailing comma at line 2942, column 15. See page 17 of PBP. (Severity: 1) -String *may* require interpolation at line 2943, column 2. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 2944, column 2. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2944, column 80. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2937, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2938, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2939, column 83. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2940, column 61. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2941, column 72. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2942, column 5. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2942, column 48. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2943, column 1. Don't use whitespace at the end of lines. (Severity: 1) +List declaration without trailing comma at line 2944, column 15. See page 17 of PBP. (Severity: 1) String *may* require interpolation at line 2945, column 2. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2948, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2949, column 28. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2950, column 17. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2950, column 67. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 2951, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2951, column 23. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2951, column 28. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 2952, column 5. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2952, column 7. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2953, column 17. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 2953, column 48. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2954, column 46. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2955, column 65. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2956, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 2957, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2959, column 2. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2961, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2962, column 28. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2963, column 17. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2963, column 67. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2964, column 2. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2965, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 2966, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2966, column 23. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 2966, column 28. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2946, column 2. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2946, column 80. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2947, column 2. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2950, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2951, column 28. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2952, column 17. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2952, column 67. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2953, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2953, column 23. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2953, column 28. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2954, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2954, column 7. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2955, column 17. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2955, column 48. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2956, column 46. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2957, column 65. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2958, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2959, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2961, column 2. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2963, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2964, column 28. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2965, column 17. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2965, column 67. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2966, column 2. See page 51 of PBP. (Severity: 1) Found "\t" at the end of the line at line 2967, column 1. Don't use whitespace at the end of lines. (Severity: 1) Quotes used with an empty string at line 2968, column 5. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 2968, column 7. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 2969, column 17. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2969, column 47. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2970, column 2. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2971, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2972, column 46. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 2973, column 64. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 2974, column 2. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 2975, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Expression form of "eval" at line 2984, column 13. See page 161 of PBP. (Severity: 5) -Builtin function called with parentheses at line 2984, column 13. See page 13 of PBP. (Severity: 1) -Magic punctuation variable used at line 2986, column 45. See page 79 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 2987, column 4. See pages 208,278 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated string at line 2987, column 10. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2998, column 14. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 2968, column 23. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2968, column 28. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2969, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2970, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2970, column 7. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2971, column 17. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2971, column 47. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2972, column 2. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2973, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2974, column 46. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2975, column 64. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2976, column 2. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2977, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Expression form of "eval" at line 2986, column 13. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 2986, column 13. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used at line 2988, column 45. See page 79 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 2989, column 4. See pages 208,278 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 2989, column 10. See page 79 of PBP. (Severity: 2) Magic punctuation variable used in interpolated string at line 3000, column 14. See page 79 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3001, column 15. See page 13 of PBP. (Severity: 1) -Double-sigil dereference at line 3001, column 37. See page 228 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3001, column 49. See page 13 of PBP. (Severity: 1) -Double-sigil dereference at line 3001, column 54. See page 228 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3002, column 26. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 3003, column 35. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 3004, column 4. See pages 208,278 of PBP. (Severity: 1) -"unless" block used at line 3007, column 4. See page 97 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 3008, column 5. See pages 208,278 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated string at line 3010, column 16. See page 79 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3019, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3021, column 5. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 3021, column 82. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3023, column 95. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3025, column 23. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3026, column 32. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3031, column 5. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3039, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3039, column 17. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3042, column 28. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3042, column 28. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 3043, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3048, column 17. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3054, column 6. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 3057, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Magic punctuation variable used in interpolated string at line 3002, column 14. See page 79 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3003, column 15. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 3003, column 37. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3003, column 49. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 3003, column 54. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3004, column 26. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3005, column 35. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 3006, column 4. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 3009, column 4. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 3010, column 5. See pages 208,278 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 3012, column 16. See page 79 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3021, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3023, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3023, column 82. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3025, column 95. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3027, column 23. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3028, column 32. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3033, column 5. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3041, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3041, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3044, column 28. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3044, column 28. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3045, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3050, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3056, column 6. See page 53 of PBP. (Severity: 2) Found "\N{SPACE}" at the end of the line at line 3059, column 20. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3066, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3067, column 14. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 3067, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3067, column 21. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3068, column 38. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 3068, column 44. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3071, column 18. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 3071, column 24. See page 53 of PBP. (Severity: 2) -Subroutine "flagsCase" is not all lower case or all upper case at line 3076, column 1. See pages 45,46 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3078, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3079, column 14. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 3079, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3079, column 21. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3080, column 34. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 3080, column 40. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3081, column 53. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3081, column 78. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3083, column 18. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 3083, column 24. See page 53 of PBP. (Severity: 2) -Subroutine "tests_flagsCase" is not all lower case or all upper case at line 3088, column 1. See pages 45,46 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3094, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3103, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3104, column 31. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3105, column 41. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 3105, column 67. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3105, column 77. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3106, column 41. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3106, column 69. See page 13 of PBP. (Severity: 1) -Subroutine "select_msgs" does not end with "return" at line 3125, column 1. See page 197 of PBP. (Severity: 4) -Found "\N{SPACE}" at the end of the line at line 3129, column 24. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3140, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3146, column 9. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3147, column 18. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3147, column 45. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3147, column 72. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3153, column 49. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3154, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3155, column 22. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3159, column 26. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3159, column 53. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3159, column 80. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3163, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3164, column 14. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3178, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 3187, column 46. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3188, column 40. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3191, column 45. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3192, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3193, column 14. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3197, column 18. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3197, column 45. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3197, column 72. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3200, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3201, column 14. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 3202, column 3. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3209, column 7. See page 13 of PBP. (Severity: 1) -Long number not separated with underscores at line 3209, column 63. See page 59 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3210, column 7. See page 13 of PBP. (Severity: 1) -Long number not separated with underscores at line 3210, column 63. See page 59 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3214, column 8. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3215, column 4. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3217, column 8. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3218, column 4. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3227, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3061, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3068, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3069, column 14. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 3069, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3069, column 21. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3070, column 38. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3070, column 44. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3073, column 18. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3073, column 24. See page 53 of PBP. (Severity: 2) +Subroutine "flagsCase" is not all lower case or all upper case at line 3078, column 1. See pages 45,46 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3080, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3081, column 14. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 3081, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3081, column 21. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3082, column 34. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3082, column 40. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3083, column 53. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3083, column 78. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3085, column 18. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3085, column 24. See page 53 of PBP. (Severity: 2) +Subroutine "tests_flagsCase" is not all lower case or all upper case at line 3090, column 1. See pages 45,46 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3096, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3105, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3106, column 31. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3107, column 41. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 3107, column 67. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3107, column 77. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3108, column 41. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3108, column 69. See page 13 of PBP. (Severity: 1) +Subroutine "select_msgs" does not end with "return" at line 3127, column 1. See page 197 of PBP. (Severity: 4) +Found "\N{SPACE}" at the end of the line at line 3131, column 24. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3142, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3148, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3149, column 18. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3149, column 45. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3149, column 72. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3155, column 49. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3156, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3157, column 22. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3161, column 26. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3161, column 53. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3161, column 80. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3165, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3166, column 14. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3180, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3189, column 46. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3190, column 40. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3193, column 45. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3194, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3195, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3199, column 18. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3199, column 45. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3199, column 72. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3202, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3203, column 14. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 3204, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3211, column 7. See page 13 of PBP. (Severity: 1) +Long number not separated with underscores at line 3211, column 63. See page 59 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3212, column 7. See page 13 of PBP. (Severity: 1) +Long number not separated with underscores at line 3212, column 63. See page 59 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3216, column 8. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3217, column 4. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3219, column 8. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3220, column 4. See page 13 of PBP. (Severity: 1) Found "\N{SPACE}" at the end of the line at line 3229, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3230, column 7. See page 13 of PBP. (Severity: 1) -Long number not separated with underscores at line 3231, column 45. See page 59 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3233, column 7. See page 13 of PBP. (Severity: 1) -Long number not separated with underscores at line 3234, column 46. See page 59 of PBP. (Severity: 2) -Double-sigil dereference at line 3245, column 9. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3246, column 9. See page 228 of PBP. (Severity: 2) -"unless" block used at line 3249, column 3. See page 97 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3249, column 11. See page 13 of PBP. (Severity: 1) -"unless" block used at line 3250, column 3. See page 97 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3250, column 11. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3251, column 26. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3253, column 31. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3254, column 31. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3259, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3264, column 1. See page 197 of PBP. (Severity: 4) -Found "\t" at the end of the line at line 3286, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3297, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3300, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3301, column 7. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3311, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 3312, column 22. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 3314, column 3. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 3320, column 3. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3332, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Subroutine "copy_message" with high complexity score (21) at line 3341, column 1. Consider refactoring. (Severity: 3) -Too many arguments at line 3341, column 1. See page 182 of PBP. (Severity: 3) -Found "\t" at the end of the line at line 3343, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 3347, column 42. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 3347, column 60. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 3348, column 42. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 3348, column 54. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3231, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3232, column 7. See page 13 of PBP. (Severity: 1) +Long number not separated with underscores at line 3233, column 45. See page 59 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3235, column 7. See page 13 of PBP. (Severity: 1) +Long number not separated with underscores at line 3236, column 46. See page 59 of PBP. (Severity: 2) +Double-sigil dereference at line 3247, column 9. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3248, column 9. See page 228 of PBP. (Severity: 2) +"unless" block used at line 3251, column 3. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3251, column 11. See page 13 of PBP. (Severity: 1) +"unless" block used at line 3252, column 3. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3252, column 11. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3253, column 26. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3255, column 31. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3256, column 31. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3261, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3266, column 1. See page 197 of PBP. (Severity: 4) +Found "\t" at the end of the line at line 3288, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3299, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3302, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3303, column 7. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3313, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 3314, column 22. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 3316, column 3. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 3322, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3334, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Subroutine "copy_message" with high complexity score (21) at line 3343, column 1. Consider refactoring. (Severity: 3) +Too many arguments at line 3343, column 1. See page 182 of PBP. (Severity: 3) +Found "\t" at the end of the line at line 3345, column 1. Don't use whitespace at the end of lines. (Severity: 1) Useless interpolation of literal string at line 3349, column 42. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 3349, column 61. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3350, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3351, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3356, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 3357, column 7. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 3357, column 41. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 3358, column 2. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 3358, column 95. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3360, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3368, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3370, column 16. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3370, column 44. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 3374, column 11. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3374, column 88. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3381, column 31. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3386, column 31. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 3389, column 19. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3389, column 35. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 3389, column 35. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3390, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3397, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Too many arguments at line 3401, column 1. See page 182 of PBP. (Severity: 3) -Found "\N{SPACE}" at the end of the line at line 3403, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3405, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3406, column 60. See page 53 of PBP. (Severity: 2) -"unless" block used at line 3408, column 2. See page 97 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3408, column 11. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 3411, column 24. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 3413, column 34. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3418, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3422, column 28. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 3423, column 18. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3424, column 80. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 3430, column 62. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3437, column 25. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 3438, column 3. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 3438, column 3. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 3438, column 17. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 3441, column 49. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 3441, column 49. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3449, column 16. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 3449, column 16. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3457, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 3459, column 41. See page 51 of PBP. (Severity: 1) -Use only '//' or '{}' to delimit regexps at line 3471, column 15. See page 246 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 3471, column 15. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3471, column 15. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 3476, column 37. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 3477, column 64. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3478, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3484, column 16. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 3485, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3488, column 60. Don't use whitespace at the end of lines. (Severity: 1) -Subroutine "tests_subject" does not end with "return" at line 3495, column 1. See page 197 of PBP. (Severity: 4) -Quotes used with an empty string at line 3496, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3496, column 21. See page 53 of PBP. (Severity: 2) -String *may* require interpolation at line 3499, column 63. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 3536, column 6. See page 53 of PBP. (Severity: 2) -Too many arguments at line 3558, column 1. See page 182 of PBP. (Severity: 3) -Found "\t" at the end of the line at line 3560, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3567, column 58. See page 53 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 3568, column 4. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3569, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 3579, column 20. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3579, column 20. See page 237 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 3590, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3591, column 4. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3591, column 70. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3593, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 3594, column 75. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3594, column 75. See page 237 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 3596, column 44. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 3619, column 2. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 3623, column 28. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3631, column 10. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3632, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3636, column 17. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 3636, column 26. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 3650, column 41. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 3651, column 42. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 3652, column 42. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3660, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3663, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 3664, column 2. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3664, column 22. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3665, column 2. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3665, column 22. See page 228 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3666, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 3667, column 26. See page 228 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3670, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3671, column 72. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3676, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3681, column 9. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3684, column 6. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3692, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3694, column 12. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3718, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3721, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 3724, column 37. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3725, column 37. See page 228 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3738, column 23. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3738, column 23. See page 237 of PBP. (Severity: 2) -String *may* require interpolation at line 3746, column 6. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3746, column 32. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3746, column 43. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3747, column 6. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3747, column 37. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3747, column 50. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3756, column 16. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3763, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 3765, column 50. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 3768, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3771, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 3772, column 18. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 3772, column 25. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3773, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3774, column 38. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3776, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3350, column 42. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 3350, column 54. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 3351, column 42. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 3351, column 61. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3352, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3353, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3358, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 3359, column 7. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 3359, column 41. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 3360, column 2. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 3360, column 95. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3362, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3370, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3372, column 16. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3372, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 3376, column 11. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3376, column 88. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3383, column 31. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3388, column 31. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 3391, column 19. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3391, column 35. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 3391, column 35. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3392, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3399, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Too many arguments at line 3403, column 1. See page 182 of PBP. (Severity: 3) +Found "\N{SPACE}" at the end of the line at line 3405, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3407, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3408, column 60. See page 53 of PBP. (Severity: 2) +"unless" block used at line 3410, column 2. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3410, column 11. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3413, column 24. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3415, column 34. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3420, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3424, column 28. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 3425, column 18. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3426, column 80. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3432, column 62. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3439, column 25. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3440, column 3. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 3440, column 3. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3440, column 17. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3443, column 49. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 3443, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3451, column 16. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 3451, column 16. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3459, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3461, column 41. See page 51 of PBP. (Severity: 1) +Use only '//' or '{}' to delimit regexps at line 3473, column 15. See page 246 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 3473, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3473, column 15. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3478, column 37. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3479, column 64. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3480, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3486, column 16. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3487, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3490, column 60. Don't use whitespace at the end of lines. (Severity: 1) +Subroutine "tests_subject" does not end with "return" at line 3497, column 1. See page 197 of PBP. (Severity: 4) +Quotes used with an empty string at line 3498, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3498, column 21. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 3501, column 63. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 3538, column 6. See page 53 of PBP. (Severity: 2) +Too many arguments at line 3560, column 1. See page 182 of PBP. (Severity: 3) +Found "\t" at the end of the line at line 3562, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3569, column 58. See page 53 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 3570, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3571, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 3581, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3581, column 20. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3592, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3593, column 4. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3593, column 70. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3595, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 3596, column 75. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3596, column 75. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3598, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 3621, column 2. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 3625, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3633, column 10. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3634, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3638, column 17. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3638, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3652, column 41. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3653, column 42. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3654, column 42. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3662, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3665, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3666, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3666, column 22. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3667, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3667, column 22. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3668, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3669, column 26. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3672, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3673, column 72. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3678, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3683, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3686, column 6. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3694, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3696, column 12. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3720, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3723, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3726, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3727, column 37. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3740, column 23. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3740, column 23. See page 237 of PBP. (Severity: 2) +String *may* require interpolation at line 3748, column 6. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3748, column 32. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3748, column 43. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3749, column 6. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3749, column 37. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3749, column 50. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3758, column 16. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3765, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 3767, column 50. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3770, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3773, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3774, column 18. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3774, column 25. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3775, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3776, column 38. Don't use whitespace at the end of lines. (Severity: 1) Found "\t" at the end of the line at line 3778, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3788, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3792, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3805, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3806, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3811, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3812, column 35. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3812, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3812, column 57. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3812, column 68. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3812, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 35. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 57. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 68. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 90. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3814, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 3817, column 37. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3818, column 37. See page 228 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3825, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3834, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3835, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 3839, column 15. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3839, column 47. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3839, column 72. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3840, column 14. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3840, column 38. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3841, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3854, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3859, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3860, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3860, column 43. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3860, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3860, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3860, column 76. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 43. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 76. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 87. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 3862, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 3863, column 33. See page 51 of PBP. (Severity: 1) -Double-sigil dereference at line 3864, column 34. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3865, column 34. See page 228 of PBP. (Severity: 2) -String *may* require interpolation at line 3868, column 9. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3869, column 9. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3870, column 11. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 3871, column 11. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 3878, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 3880, column 16. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3880, column 16. See page 237 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3892, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3893, column 47. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3896, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3900, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3922, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3780, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3790, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3794, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3807, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3808, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3813, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3814, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3814, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3814, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3814, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3814, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 90. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3816, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3819, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3820, column 37. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3827, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3836, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3837, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 3841, column 15. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3841, column 47. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3841, column 72. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3842, column 14. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3842, column 38. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3843, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3856, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3861, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3862, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3862, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3862, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3862, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3862, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 87. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3864, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 3865, column 33. See page 51 of PBP. (Severity: 1) +Double-sigil dereference at line 3866, column 34. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3867, column 34. See page 228 of PBP. (Severity: 2) +String *may* require interpolation at line 3870, column 9. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3871, column 9. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3872, column 11. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3873, column 11. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3880, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 3882, column 16. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3882, column 16. See page 237 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3894, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3895, column 47. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3898, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3902, column 1. Don't use whitespace at the end of lines. (Severity: 1) Found "\t" at the end of the line at line 3924, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 3925, column 78. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3926, column 21. See page 228 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3929, column 19. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 3929, column 102. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 3932, column 14. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3933, column 14. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 3938, column 4. See page 13 of PBP. (Severity: 1) -Quotes used with a noisy string at line 3938, column 29. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 3938, column 29. See page 79 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3941, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3950, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3963, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 3970, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 3975, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3977, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3978, column 24. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 3980, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 3982, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3983, column 24. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3926, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3927, column 78. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3928, column 21. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3931, column 19. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3931, column 102. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3934, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3935, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3940, column 4. See page 13 of PBP. (Severity: 1) +Quotes used with a noisy string at line 3940, column 29. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3940, column 29. See page 79 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3943, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3952, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3965, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3972, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3977, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3979, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3980, column 24. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3982, column 1. Don't use whitespace at the end of lines. (Severity: 1) Quotes used with an empty string at line 3984, column 24. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 3987, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4001, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4014, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4021, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4026, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4028, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4029, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3985, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3986, column 24. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3989, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4003, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4016, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4023, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4028, column 1. Don't use whitespace at the end of lines. (Severity: 1) Quotes used with an empty string at line 4030, column 24. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4032, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4034, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4035, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4031, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4032, column 24. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4034, column 1. Don't use whitespace at the end of lines. (Severity: 1) Quotes used with an empty string at line 4036, column 24. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4038, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4039, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4037, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4038, column 24. See page 53 of PBP. (Severity: 2) Found "\N{SPACE}" at the end of the line at line 4040, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4042, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4056, column 25. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4058, column 52. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4078, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 4084, column 18. See pages 208,278 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4101, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with a noisy string at line 4102, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4103, column 25. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4104, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4108, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4117, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4118, column 20. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4118, column 20. See page 237 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4134, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4135, column 13. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4135, column 13. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 4141, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4141, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4141, column 36. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4142, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4143, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4146, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4147, column 60. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4153, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4154, column 5. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4154, column 27. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4154, column 38. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4157, column 11. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4157, column 30. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4157, column 45. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4158, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4160, column 5. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4160, column 27. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4160, column 38. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4161, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4163, column 35. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4164, column 51. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4165, column 5. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4166, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4168, column 15. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4168, column 17. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4169, column 15. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4171, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4172, column 15. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4172, column 46. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4173, column 15. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4175, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4176, column 22. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4176, column 53. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4177, column 22. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4179, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4180, column 31. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4180, column 62. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4181, column 31. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4183, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4184, column 15. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 4185, column 15. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4185, column 17. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4186, column 15. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4188, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4189, column 15. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4189, column 17. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4190, column 15. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4192, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4193, column 22. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4193, column 53. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4194, column 22. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4196, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4198, column 15. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 4198, column 15. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 4198, column 31. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4198, column 62. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4199, column 31. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4201, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 4223, column 14. See page 51 of PBP. (Severity: 1) -Expression form of "eval" at line 4315, column 13. See page 161 of PBP. (Severity: 5) -Builtin function called with parentheses at line 4315, column 13. See page 13 of PBP. (Severity: 1) -Magic punctuation variable used at line 4317, column 38. See page 79 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 4318, column 4. See pages 208,278 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated string at line 4318, column 10. See page 79 of PBP. (Severity: 2) -Long number not separated with underscores at line 4331, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4332, column 46. See page 59 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4041, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4042, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4044, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4058, column 25. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4060, column 52. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4080, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 4086, column 18. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4103, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with a noisy string at line 4104, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4105, column 25. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4106, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4110, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4119, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4120, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4120, column 20. See page 237 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4136, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4137, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4137, column 13. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4143, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4143, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4143, column 36. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4144, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4145, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4148, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4149, column 60. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4155, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4156, column 5. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4156, column 27. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4156, column 38. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4159, column 11. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4159, column 30. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4159, column 45. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4160, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4162, column 5. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4162, column 27. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4162, column 38. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4163, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4165, column 35. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4166, column 51. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4167, column 5. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4168, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4170, column 15. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4170, column 17. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4171, column 15. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4173, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4174, column 15. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4174, column 46. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4175, column 15. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4177, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4178, column 22. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4178, column 53. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4179, column 22. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4181, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4182, column 31. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4182, column 62. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4183, column 31. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4185, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4186, column 15. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 4187, column 15. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4187, column 17. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4188, column 15. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4190, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4191, column 15. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4191, column 17. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4192, column 15. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4194, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4195, column 22. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4195, column 53. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4196, column 22. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4198, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4200, column 15. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4200, column 15. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 4200, column 31. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4200, column 62. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4201, column 31. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4203, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4225, column 14. See page 51 of PBP. (Severity: 1) +Expression form of "eval" at line 4317, column 13. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 4317, column 13. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used at line 4319, column 38. See page 79 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 4320, column 4. See pages 208,278 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4320, column 10. See page 79 of PBP. (Severity: 2) +Long number not separated with underscores at line 4333, column 46. See page 59 of PBP. (Severity: 2) Long number not separated with underscores at line 4334, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4335, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4336, column 46. See page 59 of PBP. (Severity: 2) Long number not separated with underscores at line 4337, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4338, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4339, column 46. See page 59 of PBP. (Severity: 2) Long number not separated with underscores at line 4340, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4341, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4342, column 46. See page 59 of PBP. (Severity: 2) Long number not separated with underscores at line 4343, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4344, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4346, column 49. See page 59 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4347, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4352, column 27. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4355, column 23. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4356, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 4359, column 29. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4359, column 38. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4359, column 66. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 4363, column 29. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4363, column 38. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4367, column 22. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4367, column 30. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4371, column 22. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4371, column 31. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4374, column 22. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4374, column 31. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4383, column 13. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4386, column 22. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4387, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4389, column 47. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4390, column 67. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4395, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4396, column 2. See pages 208,278 of PBP. (Severity: 1) +Long number not separated with underscores at line 4345, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4346, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4348, column 49. See page 59 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4349, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4354, column 27. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4357, column 23. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4358, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4361, column 29. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4361, column 38. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4361, column 66. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4365, column 29. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4365, column 38. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4369, column 22. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4369, column 30. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4373, column 22. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4373, column 31. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4376, column 22. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4376, column 31. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4385, column 13. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4388, column 22. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4389, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4391, column 47. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4392, column 67. See page 51 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4397, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4398, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4398, column 2. See pages 208,278 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4399, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4400, column 2. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 4400, column 65. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4400, column 2. See page 13 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4401, column 2. See pages 208,278 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4402, column 2. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 4402, column 65. See pages 93,94 of PBP. (Severity: 2) Return value of flagged function ignored - print at line 4403, column 2. See pages 208,278 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4404, column 2. See pages 208,278 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4405, column 2. See pages 208,278 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4406, column 2. See pages 208,278 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4407, column 2. See pages 208,278 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4408, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4409, column 9. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4412, column 9. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4415, column 9. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4418, column 9. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4421, column 9. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4425, column 2. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4426, column 2. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4427, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4428, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4429, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4409, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4410, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4411, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4414, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4417, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4420, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4423, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4427, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4428, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4429, column 2. See pages 208,278 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4430, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4433, column 2. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4436, column 2. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4440, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4431, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4432, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4435, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4438, column 2. See page 13 of PBP. (Severity: 1) Return value of flagged function ignored - print at line 4442, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4443, column 2. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 4459, column 31. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4460, column 41. Don't use whitespace at the end of lines. (Severity: 1) -Too many arguments at line 4470, column 1. See page 182 of PBP. (Severity: 3) -Found "\t" at the end of the line at line 4472, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 4474, column 17. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4474, column 24. See page 13 of PBP. (Severity: 1) -Double-sigil dereference at line 4474, column 29. See page 228 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4476, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 4478, column 3. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4479, column 24. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4481, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4484, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 4485, column 29. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4485, column 37. See page 13 of PBP. (Severity: 1) -Double-sigil dereference at line 4485, column 43. See page 228 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4493, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4495, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4496, column 55. See page 51 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4498, column 3. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4499, column 15. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4500, column 22. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4504, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4505, column 33. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4506, column 33. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4444, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4445, column 2. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 4461, column 31. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4462, column 41. Don't use whitespace at the end of lines. (Severity: 1) +Too many arguments at line 4472, column 1. See page 182 of PBP. (Severity: 3) +Found "\t" at the end of the line at line 4474, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4476, column 17. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4476, column 24. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 4476, column 29. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4478, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 4480, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4481, column 24. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4483, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4486, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4487, column 29. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4487, column 37. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 4487, column 43. See page 228 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4495, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4497, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4498, column 55. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4500, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4501, column 15. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4502, column 22. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4506, column 1. Don't use whitespace at the end of lines. (Severity: 1) Useless interpolation of literal string at line 4507, column 33. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4508, column 10. See page 13 of PBP. (Severity: 1) -Postfix control "unless" used at line 4508, column 29. See pages 96,97 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4532, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 4534, column 23. See page 13 of PBP. (Severity: 1) -Double-sigil dereference at line 4534, column 29. See page 228 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4535, column 31. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4535, column 51. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4536, column 31. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4539, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4541, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4544, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4545, column 30. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4545, column 30. See page 237 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4558, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4560, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4560, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4563, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4563, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4566, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4566, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4569, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4569, column 24. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4572, column 59. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 4572, column 98. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4572, column 98. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4577, column 27. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 4585, column 37. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4585, column 41. See page 53 of PBP. (Severity: 2) -Numeric escapes in interpolated string at line 4590, column 51. See page 56 of PBP. (Severity: 2) -Quotes used with an empty string at line 4600, column 21. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 4600, column 21. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4601, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 4602, column 9. See page 13 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated string at line 4602, column 52. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4604, column 9. Check the return value of "close" for success. (Severity: 2) -Return value of flagged function ignored - close at line 4604, column 9. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4613, column 2. See page 13 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated string at line 4613, column 46. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4615, column 2. Check the return value of "close" for success. (Severity: 2) -Return value of flagged function ignored - close at line 4615, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4616, column 9. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 4616, column 14. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4622, column 2. See page 13 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated string at line 4622, column 67. See page 79 of PBP. (Severity: 2) -File handle for "print" or "printf" is not braced at line 4623, column 2. See page 217 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4623, column 2. See pages 208,278 of PBP. (Severity: 1) -Return value of "close" ignored at line 4624, column 2. Check the return value of "close" for success. (Severity: 2) -Return value of flagged function ignored - close at line 4624, column 2. See pages 208,278 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4638, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4639, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4639, column 21. See page 237 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4649, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4508, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4509, column 33. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4510, column 10. See page 13 of PBP. (Severity: 1) +Postfix control "unless" used at line 4510, column 29. See pages 96,97 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4534, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4536, column 23. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 4536, column 29. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4537, column 31. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4537, column 51. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4538, column 31. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4541, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4543, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4546, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4547, column 30. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4547, column 30. See page 237 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4560, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4562, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4562, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4565, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4565, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4568, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4568, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4571, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4571, column 24. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4574, column 59. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 4574, column 98. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4574, column 98. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4579, column 27. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 4587, column 37. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4587, column 41. See page 53 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 4592, column 51. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 4602, column 21. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4602, column 21. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4603, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4604, column 9. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4604, column 52. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4606, column 9. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 4606, column 9. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4615, column 2. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4615, column 46. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4617, column 2. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 4617, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4618, column 9. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 4618, column 14. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4624, column 2. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4624, column 67. See page 79 of PBP. (Severity: 2) +File handle for "print" or "printf" is not braced at line 4625, column 2. See page 217 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4625, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of "close" ignored at line 4626, column 2. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 4626, column 2. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4640, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4641, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4641, column 21. See page 237 of PBP. (Severity: 2) Found "\t" at the end of the line at line 4651, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4655, column 10. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 4660, column 21. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4662, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4663, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4663, column 24. See page 237 of PBP. (Severity: 2) -Useless interpolation of literal string at line 4666, column 30. See page 51 of PBP. (Severity: 1) -Magic punctuation variable used at line 4680, column 18. See page 79 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4685, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4688, column 42. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4689, column 13. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4689, column 34. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4695, column 17. Don't use whitespace at the end of lines. (Severity: 1) -File handle for "print" or "printf" is not braced at line 4698, column 2. See page 217 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 4698, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4703, column 2. See page 13 of PBP. (Severity: 1) -Return value of "close" ignored at line 4703, column 2. Check the return value of "close" for success. (Severity: 2) -Return value of flagged function ignored - close at line 4703, column 2. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4653, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4657, column 10. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 4662, column 21. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4664, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4665, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4665, column 24. See page 237 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4668, column 30. See page 51 of PBP. (Severity: 1) +Magic punctuation variable used at line 4682, column 18. See page 79 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4687, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4690, column 42. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4691, column 13. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4691, column 34. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4697, column 17. Don't use whitespace at the end of lines. (Severity: 1) +File handle for "print" or "printf" is not braced at line 4700, column 2. See page 217 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4700, column 2. See pages 208,278 of PBP. (Severity: 1) Builtin function called with parentheses at line 4705, column 2. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4713, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4716, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4720, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4722, column 60. See page 51 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated string at line 4723, column 20. See page 79 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4725, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 4727, column 3. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4733, column 3. See page 13 of PBP. (Severity: 1) -Magic punctuation variable used at line 4737, column 23. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used at line 4739, column 7. See page 79 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4739, column 13. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4739, column 13. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4743, column 4. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4753, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 4754, column 15. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 4754, column 20. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 4754, column 20. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4754, column 23. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4755, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4756, column 11. See page 53 of PBP. (Severity: 2) -Useless interpolation of literal string at line 4756, column 11. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4756, column 15. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4760, column 11. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4760, column 24. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4761, column 19. See page 51 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 4776, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4786, column 13. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4799, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4802, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String delimiter used with "split" at line 4808, column 28. Express it as a regex instead. (Severity: 2) -Builtin function called with parentheses at line 4808, column 28. See page 13 of PBP. (Severity: 1) -Quotes used with a noisy string at line 4808, column 34. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4813, column 4. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4818, column 4. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4835, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4837, column 29. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4839, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4853, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 4863, column 37. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4864, column 38. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4865, column 43. See page 51 of PBP. (Severity: 1) -Subroutine "remove_Ko" is not all lower case or all upper case at line 4869, column 1. See pages 45,46 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 4871, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4871, column 17. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4880, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4880, column 17. See page 237 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 4904, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4913, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 4916, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 4918, column 13. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4918, column 24. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 4921, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4921, column 17. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 4924, column 16. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 4924, column 30. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 4925, column 22. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4925, column 29. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4929, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4930, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4930, column 12. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 4942, column 38. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4942, column 72. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4942, column 72. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 4943, column 38. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4944, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 4945, column 46. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4946, column 24. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4946, column 32. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4947, column 25. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4947, column 33. See page 51 of PBP. (Severity: 1) +Return value of "close" ignored at line 4705, column 2. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 4705, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4707, column 2. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4715, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4718, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4722, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4724, column 60. See page 51 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4725, column 20. See page 79 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4727, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4729, column 3. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4735, column 3. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used at line 4739, column 23. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used at line 4741, column 7. See page 79 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4741, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4741, column 13. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4745, column 4. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4755, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4756, column 15. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 4756, column 20. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4756, column 20. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4756, column 23. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4757, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4758, column 11. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4758, column 11. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4758, column 15. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4762, column 11. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4762, column 24. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4763, column 19. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4778, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4788, column 13. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4801, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4804, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String delimiter used with "split" at line 4810, column 28. Express it as a regex instead. (Severity: 2) +Builtin function called with parentheses at line 4810, column 28. See page 13 of PBP. (Severity: 1) +Quotes used with a noisy string at line 4810, column 34. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4815, column 4. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4820, column 4. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4837, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4839, column 29. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4841, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4855, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4865, column 37. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4866, column 38. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4867, column 43. See page 51 of PBP. (Severity: 1) +Subroutine "remove_Ko" is not all lower case or all upper case at line 4871, column 1. See pages 45,46 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 4873, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4873, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4882, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4882, column 17. See page 237 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4906, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4915, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4918, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4920, column 13. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4920, column 24. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 4923, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4923, column 17. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4926, column 16. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 4926, column 30. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 4927, column 22. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4927, column 29. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4931, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4932, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4932, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4944, column 38. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4944, column 72. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4944, column 72. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4945, column 38. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4946, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 4947, column 46. See pages 93,94 of PBP. (Severity: 2) Builtin function called with parentheses at line 4948, column 24. See page 13 of PBP. (Severity: 1) Useless interpolation of literal string at line 4948, column 32. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 4949, column 30. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4949, column 37. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4949, column 25. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4949, column 33. See page 51 of PBP. (Severity: 1) Builtin function called with parentheses at line 4950, column 24. See page 13 of PBP. (Severity: 1) Useless interpolation of literal string at line 4950, column 32. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 4951, column 34. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4951, column 41. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4955, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4956, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4956, column 12. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4964, column 24. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4964, column 32. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4965, column 25. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4965, column 33. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 4951, column 30. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4951, column 37. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4952, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4952, column 32. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 4953, column 34. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4953, column 41. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4957, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4958, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4958, column 12. See page 237 of PBP. (Severity: 2) Builtin function called with parentheses at line 4966, column 24. See page 13 of PBP. (Severity: 1) Useless interpolation of literal string at line 4966, column 32. See page 51 of PBP. (Severity: 1) -Builtin function called with parentheses at line 4967, column 24. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4967, column 32. See page 51 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 4972, column 19. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4972, column 19. See page 237 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 4984, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4985, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4985, column 12. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 4991, column 29. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 4992, column 24. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 4992, column 32. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 4996, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 4997, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4997, column 12. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 5003, column 24. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5003, column 32. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5007, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 5008, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5008, column 12. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 5013, column 24. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5013, column 32. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5017, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5021, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5024, column 2. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 5029, column 5. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 5071, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 5080, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Double-sigil dereference at line 5081, column 33. See page 228 of PBP. (Severity: 2) -Builtin function called with parentheses at line 5083, column 3. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 5095, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5099, column 35. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 5102, column 8. See page 13 of PBP. (Severity: 1) -Expression form of "eval" at line 5102, column 43. See page 161 of PBP. (Severity: 5) -Builtin function called with parentheses at line 5102, column 43. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 5103, column 4. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 5106, column 8. See page 13 of PBP. (Severity: 1) -Expression form of "eval" at line 5106, column 45. See page 161 of PBP. (Severity: 5) -Builtin function called with parentheses at line 5106, column 45. See page 13 of PBP. (Severity: 1) -Return value of flagged function ignored - print at line 5107, column 4. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 5111, column 34. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5112, column 36. See pages 93,94 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 5114, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4967, column 25. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4967, column 33. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4968, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4968, column 32. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4969, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4969, column 32. See page 51 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 4974, column 19. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4974, column 19. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4986, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4987, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4987, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4993, column 29. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4994, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4994, column 32. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4998, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4999, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4999, column 12. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5005, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5005, column 32. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5009, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 5010, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5010, column 12. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5015, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5015, column 32. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5019, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5023, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5026, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 5031, column 5. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 5073, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 5082, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 5083, column 33. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5085, column 3. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 5097, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5101, column 35. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 5104, column 8. See page 13 of PBP. (Severity: 1) +Expression form of "eval" at line 5104, column 43. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 5104, column 43. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 5105, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 5108, column 8. See page 13 of PBP. (Severity: 1) +Expression form of "eval" at line 5108, column 45. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 5108, column 45. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 5109, column 4. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 5113, column 34. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5114, column 36. See pages 93,94 of PBP. (Severity: 2) Return value of flagged function ignored - print at line 5116, column 4. See pages 208,278 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5125, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 5126, column 26. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 5126, column 33. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5126, column 33. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 5127, column 36. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 5134, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 5140, column 1. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5153, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5159, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5163, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Builtin function called with parentheses at line 5165, column 20. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 5165, column 27. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5165, column 27. See page 237 of PBP. (Severity: 2) -Use 'eq' or hash instead of fixed-pattern regexps at line 5169, column 36. See pages 271,272 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5169, column 36. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5169, column 36. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5171, column 31. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5171, column 31. See page 237 of PBP. (Severity: 2) -Builtin function called with parentheses at line 5175, column 25. See page 13 of PBP. (Severity: 1) -Regular expression without "/s" flag at line 5177, column 34. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5177, column 34. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5180, column 65. See pages 93,94 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 5196, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5212, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5213, column 20. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5216, column 20. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5219, column 26. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5222, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5225, column 28. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5228, column 21. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5233, column 1. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 5242, column 13. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5242, column 60. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5253, column 12. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5254, column 105. Don't use whitespace at the end of lines. (Severity: 1) -String *may* require interpolation at line 5268, column 9. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5271, column 9. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5285, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5286, column 20. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5289, column 26. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5292, column 37. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 5301, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Quotes used with an empty string at line 5306, column 17. See page 53 of PBP. (Severity: 2) -Builtin function called with parentheses at line 5306, column 28. See page 13 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5310, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 5311, column 20. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5311, column 20. See page 237 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 5313, column 85. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5316, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 5317, column 28. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5317, column 33. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 5318, column 28. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5318, column 33. See page 53 of PBP. (Severity: 2) -Found "\N{SPACE}" at the end of the line at line 5319, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5320, column 88. Don't use whitespace at the end of lines. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5322, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Local lexical variable "$header_Message_Id" is not all lower case or all upper case at line 5345, column 2. See pages 45,46 of PBP. (Severity: 1) -String *may* require interpolation at line 5345, column 58. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5350, column 6. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5351, column 6. See page 51 of PBP. (Severity: 1) -Long number not separated with underscores at line 5351, column 55. See page 59 of PBP. (Severity: 2) -Subroutine "tests_Banner" is not all lower case or all upper case at line 5356, column 1. See pages 45,46 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5359, column 50. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5360, column 42. See page 51 of PBP. (Severity: 1) -"$i" is declared but not used at line 5370, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) -Builtin function called with parentheses at line 5372, column 28. See page 13 of PBP. (Severity: 1) -Quotes used with an empty string at line 5381, column 28. See page 53 of PBP. (Severity: 2) -String *may* require interpolation at line 5382, column 36. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5383, column 38. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5384, column 42. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5385, column 28. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5386, column 38. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5387, column 40. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5388, column 41. See page 51 of PBP. (Severity: 1) -Long number not separated with underscores at line 5389, column 40. See page 59 of PBP. (Severity: 2) -String *may* require interpolation at line 5389, column 49. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5390, column 44. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5392, column 46. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5393, column 48. See page 51 of PBP. (Severity: 1) -String *may* require interpolation at line 5394, column 96. See page 51 of PBP. (Severity: 1) -Quotes used with an empty string at line 5401, column 25. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 5402, column 43. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 5402, column 51. See page 13 of PBP. (Severity: 1) -Quotes used with a noisy string at line 5403, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5403, column 60. See page 53 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 5404, column 9. See pages 208,278 of PBP. (Severity: 1) -Magic punctuation variable used in interpolated here-document at line 5404, column 15. See page 79 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 5620, column 2. See pages 208,278 of PBP. (Severity: 1) -Builtin function called with parentheses at line 5645, column 15. See page 13 of PBP. (Severity: 1) -Builtin function called with parentheses at line 5646, column 15. See page 13 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5646, column 20. See page 51 of PBP. (Severity: 1) -Quotes used with a noisy string at line 5646, column 20. See page 53 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 5647, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Regular expression without "/s" flag at line 5651, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5651, column 14. See page 237 of PBP. (Severity: 2) -Return value of flagged function ignored - print at line 5652, column 3. See pages 208,278 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5656, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5657, column 36. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 5118, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5127, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 5128, column 26. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 5128, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5128, column 33. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 5129, column 36. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 5136, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 5142, column 1. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5155, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5161, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5165, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 5167, column 20. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 5167, column 27. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5167, column 27. See page 237 of PBP. (Severity: 2) +Use 'eq' or hash instead of fixed-pattern regexps at line 5171, column 36. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5171, column 36. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5171, column 36. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5173, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5173, column 31. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5177, column 25. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 5179, column 34. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5179, column 34. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5182, column 65. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 5198, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5214, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5215, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5218, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5221, column 26. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5224, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5227, column 28. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5230, column 21. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5235, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 5244, column 13. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5244, column 60. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5255, column 12. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5256, column 105. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 5270, column 9. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5273, column 9. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5287, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5288, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5291, column 26. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5294, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 5303, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 5308, column 17. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5308, column 28. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5312, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 5313, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5313, column 20. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 5315, column 85. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5318, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 5319, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5319, column 33. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5320, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5320, column 33. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 5321, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5322, column 88. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5324, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Local lexical variable "$header_Message_Id" is not all lower case or all upper case at line 5347, column 2. See pages 45,46 of PBP. (Severity: 1) +String *may* require interpolation at line 5347, column 58. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5352, column 6. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5353, column 6. See page 51 of PBP. (Severity: 1) +Long number not separated with underscores at line 5353, column 55. See page 59 of PBP. (Severity: 2) +Subroutine "tests_Banner" is not all lower case or all upper case at line 5358, column 1. See pages 45,46 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5361, column 50. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5362, column 42. See page 51 of PBP. (Severity: 1) +"$i" is declared but not used at line 5372, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) +Builtin function called with parentheses at line 5374, column 28. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 5383, column 28. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 5384, column 36. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5385, column 38. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5386, column 42. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5387, column 28. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5388, column 38. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5389, column 40. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5390, column 41. See page 51 of PBP. (Severity: 1) +Long number not separated with underscores at line 5391, column 40. See page 59 of PBP. (Severity: 2) +String *may* require interpolation at line 5391, column 49. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5392, column 44. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5394, column 46. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5395, column 48. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5396, column 96. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 5403, column 25. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5404, column 43. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5404, column 51. See page 13 of PBP. (Severity: 1) +Quotes used with a noisy string at line 5405, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5405, column 60. See page 53 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 5406, column 9. See pages 208,278 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated here-document at line 5406, column 15. See page 79 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 5622, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 5647, column 15. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 5648, column 15. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5648, column 20. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 5648, column 20. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 5649, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 5653, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5653, column 14. See page 237 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 5654, column 3. See pages 208,278 of PBP. (Severity: 1) Useless interpolation of literal string at line 5658, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5659, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5659, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5660, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5661, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5661, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5662, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5663, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5664, column 36. See page 51 of PBP. (Severity: 1) @@ -1855,65 +1850,65 @@ Useless interpolation of literal string at line 5673, column 36. See page 51 of Useless interpolation of literal string at line 5674, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5675, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5676, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5677, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5678, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5677, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5678, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5679, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5680, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5681, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5682, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5683, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5680, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5681, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5682, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5683, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5684, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5685, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5686, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5687, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5688, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5689, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5689, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5690, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5691, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5691, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5692, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5693, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5694, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5695, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5696, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5695, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5696, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5697, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5698, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5699, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5700, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5699, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5700, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5701, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5702, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5703, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5702, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5703, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5704, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5705, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5706, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5705, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5706, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5707, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5708, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5709, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5710, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5709, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5710, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5711, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5712, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5713, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5714, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5715, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5712, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5713, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5714, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5715, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5716, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5717, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5718, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5719, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5720, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5721, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5722, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5722, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5723, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5724, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5725, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5726, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5727, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5728, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5724, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5725, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5726, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5727, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5728, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5729, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5730, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5731, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5730, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5731, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5732, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5733, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5733, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5734, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5735, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5735, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5736, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5737, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5738, column 8. See page 51 of PBP. (Severity: 1) @@ -1937,50 +1932,52 @@ Useless interpolation of literal string at line 5755, column 8. See page 51 of Useless interpolation of literal string at line 5756, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5757, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5758, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5759, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5760, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5759, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5760, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5761, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5762, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5763, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5764, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5763, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5764, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5765, column 8. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5765, column 49. Don't use whitespace at the end of lines. (Severity: 1) Useless interpolation of literal string at line 5766, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5767, column 8. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5767, column 49. Don't use whitespace at the end of lines. (Severity: 1) Useless interpolation of literal string at line 5768, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5769, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5769, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5770, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5771, column 8. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5772, column 36. See page 51 of PBP. (Severity: 1) -Useless interpolation of literal string at line 5773, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5771, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5772, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5773, column 8. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5774, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5775, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5776, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5777, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5778, column 36. See page 51 of PBP. (Severity: 1) Useless interpolation of literal string at line 5779, column 36. See page 51 of PBP. (Severity: 1) -Found "\N{SPACE}" at the end of the line at line 5779, column 73. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 5781, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Return value of flagged function ignored - print at line 5785, column 9. See pages 208,278 of PBP. (Severity: 1) -Postfix control "if" used at line 5785, column 49. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 5786, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Found "\t" at the end of the line at line 5797, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Postfix control "if" used at line 5798, column 12. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 5802, column 23. See page 13 of PBP. (Severity: 1) -Postfix control "if" used at line 5802, column 32. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 5805, column 9. See page 13 of PBP. (Severity: 1) -Postfix control "unless" used at line 5805, column 30. See pages 96,97 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 5811, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 5813, column 8. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 5813, column 32. See pages 93,94 of PBP. (Severity: 2) -Found "\t" at the end of the line at line 5820, column 1. Don't use whitespace at the end of lines. (Severity: 1) -Useless interpolation of literal string at line 5822, column 8. See page 51 of PBP. (Severity: 1) -Postfix control "if" used at line 5822, column 32. See pages 93,94 of PBP. (Severity: 2) -Subroutine "Tls" is not all lower case or all upper case at line 5876, column 1. See pages 45,46 of PBP. (Severity: 1) -Builtin function called with parentheses at line 5879, column 7. See page 13 of PBP. (Severity: 1) -Subroutine "Reconnect_counter" is not all lower case or all upper case at line 5883, column 1. See pages 45,46 of PBP. (Severity: 1) -Postfix control "if" used at line 5886, column 33. See pages 93,94 of PBP. (Severity: 2) -Builtin function called with parentheses at line 5887, column 7. See page 13 of PBP. (Severity: 1) -Subroutine "Banner" is not all lower case or all upper case at line 5892, column 1. See pages 45,46 of PBP. (Severity: 1) -Builtin function called with parentheses at line 5895, column 7. See page 13 of PBP. (Severity: 1) -Found "\t" at the end of the line at line 5901, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 5780, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5781, column 36. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5781, column 73. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 5783, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 5787, column 9. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 5787, column 49. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 5788, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 5799, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 5800, column 12. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5804, column 23. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 5804, column 32. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5807, column 9. See page 13 of PBP. (Severity: 1) +Postfix control "unless" used at line 5807, column 30. See pages 96,97 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 5813, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 5815, column 8. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 5815, column 32. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 5822, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 5824, column 8. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 5824, column 32. See pages 93,94 of PBP. (Severity: 2) +Subroutine "Tls" is not all lower case or all upper case at line 5878, column 1. See pages 45,46 of PBP. (Severity: 1) +Builtin function called with parentheses at line 5881, column 7. See page 13 of PBP. (Severity: 1) +Subroutine "Reconnect_counter" is not all lower case or all upper case at line 5885, column 1. See pages 45,46 of PBP. (Severity: 1) +Postfix control "if" used at line 5888, column 33. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5889, column 7. See page 13 of PBP. (Severity: 1) +Subroutine "Banner" is not all lower case or all upper case at line 5894, column 1. See pages 45,46 of PBP. (Severity: 1) +Builtin function called with parentheses at line 5897, column 7. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 5903, column 1. Don't use whitespace at the end of lines. (Severity: 1) diff --git a/perlcritic_2.out b/perlcritic_2.out index 2714284..1271fb2 100644 --- a/perlcritic_2.out +++ b/perlcritic_2.out @@ -5,569 +5,568 @@ Missing "DEPENDENCIES" section in POD at line 1, column 1. See pages 133,138 of Missing "INCOMPATIBILITIES" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) Missing "BUGS AND LIMITATIONS" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) Missing "LICENSE AND COPYRIGHT" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) -Main code has high complexity score (333) at line 1, column 1. Consider refactoring. (Severity: 3) -Magic punctuation variable used at line 548, column 3. See page 79 of PBP. (Severity: 2) -64 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 708, column 10. Unnamed numeric literals make code less maintainable. (Severity: 2) -Quotes used with an empty string at line 731, column 61. See page 53 of PBP. (Severity: 2) -5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 759, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) -5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 760, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) -Postfix control "if" used at line 769, column 15. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 770, column 21. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 776, column 25. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 781, column 24. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 788, column 25. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 795, column 15. See pages 93,94 of PBP. (Severity: 2) -100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 798, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) -100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 799, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) -993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 802, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) -143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 802, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) +Main code has high complexity score (335) at line 1, column 1. Consider refactoring. (Severity: 3) +Magic punctuation variable used at line 551, column 3. See page 79 of PBP. (Severity: 2) +64 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 711, column 10. Unnamed numeric literals make code less maintainable. (Severity: 2) +Quotes used with an empty string at line 734, column 61. See page 53 of PBP. (Severity: 2) +5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 762, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) +5 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 763, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 772, column 15. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 773, column 21. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 779, column 25. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 784, column 24. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 791, column 25. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 798, column 15. See pages 93,94 of PBP. (Severity: 2) +100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 801, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) +100 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 802, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) 993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 805, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) 143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 805, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) -Postfix control "if" used at line 807, column 31. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 808, column 12. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 822, column 5. See pages 93,94 of PBP. (Severity: 2) -3 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 847, column 21. Unnamed numeric literals make code less maintainable. (Severity: 2) -Long number not separated with underscores at line 934, column 20. See page 59 of PBP. (Severity: 2) -Postfix control "unless" used at line 936, column 57. See pages 96,97 of PBP. (Severity: 2) -Quotes used with an empty string at line 963, column 19. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 964, column 50. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 966, column 22. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 967, column 22. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 971, column 26. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 978, column 49. See page 53 of PBP. (Severity: 2) -Postfix control "unless" used at line 1003, column 43. See pages 96,97 of PBP. (Severity: 2) -Postfix control "unless" used at line 1005, column 43. See pages 96,97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1008, column 34. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1009, column 34. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1012, column 15. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1074, column 33. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1074, column 33. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1083, column 33. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1083, column 33. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 1157, column 15. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1167, column 3. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1175, column 32. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1220, column 3. See page 97 of PBP. (Severity: 2) -"unless" block used at line 1228, column 3. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1260, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1261, column 50. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 1271, column 39. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 1273, column 50. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 1283, column 49. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 1284, column 30. See page 228 of PBP. (Severity: 2) -Postfix control "if" used at line 1302, column 57. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1312, column 77. See pages 93,94 of PBP. (Severity: 2) -Double-sigil dereference at line 1315, column 2. See page 228 of PBP. (Severity: 2) -Postfix control "if" used at line 1320, column 5. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1324, column 3. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1327, column 2. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1330, column 53. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1365, column 79. See pages 93,94 of PBP. (Severity: 2) -Double-sigil dereference at line 1369, column 2. See page 228 of PBP. (Severity: 2) -Postfix control "if" used at line 1374, column 3. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1378, column 3. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1401, column 10. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1421, column 33. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1422, column 4. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1430, column 39. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1434, column 38. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1443, column 4. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1445, column 45. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1446, column 31. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1446, column 31. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 1448, column 7. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1449, column 32. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1450, column 5. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1458, column 52. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1459, column 4. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1467, column 39. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1471, column 38. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1480, column 4. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1481, column 49. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1482, column 31. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1482, column 31. See page 237 of PBP. (Severity: 2) -"unless" block used at line 1483, column 5. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1512, column 70. See pages 93,94 of PBP. (Severity: 2) -Code structure is deeply nested at line 1513, column 41. Consider refactoring. (Severity: 3) -"unless" block used at line 1513, column 41. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1524, column 39. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1528, column 38. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1546, column 3. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 1581, column 47. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1582, column 59. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1584, column 4. See page 97 of PBP. (Severity: 2) -Postfix control "if" used at line 1587, column 23. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 1622, column 3. See page 97 of PBP. (Severity: 2) -"unless" block used at line 1626, column 3. See page 97 of PBP. (Severity: 2) -Postfix control "unless" used at line 1655, column 20. See pages 96,97 of PBP. (Severity: 2) -Postfix control "unless" used at line 1656, column 20. See pages 96,97 of PBP. (Severity: 2) -Postfix control "if" used at line 1660, column 17. See pages 93,94 of PBP. (Severity: 2) -Too many arguments at line 1680, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 1687, column 58. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1688, column 58. See page 53 of PBP. (Severity: 2) -Too many arguments at line 1695, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 1705, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 1720, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1721, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1733, column 26. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1743, column 28. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1751, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1751, column 17. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 1761, column 55. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1762, column 74. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1767, column 58. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 1799, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1827, column 77. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1830, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1833, column 73. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1836, column 77. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1839, column 76. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1842, column 68. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1845, column 67. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1848, column 77. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1851, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1854, column 71. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1857, column 69. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1860, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1863, column 67. See page 53 of PBP. (Severity: 2) +993 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 808, column 24. Unnamed numeric literals make code less maintainable. (Severity: 2) +143 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 808, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 810, column 31. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 811, column 12. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 825, column 5. See pages 93,94 of PBP. (Severity: 2) +3 is not one of the allowed literal values (0, 1, 2). Use the Readonly module or the "constant" pragma instead at line 850, column 21. Unnamed numeric literals make code less maintainable. (Severity: 2) +Long number not separated with underscores at line 937, column 20. See page 59 of PBP. (Severity: 2) +Postfix control "unless" used at line 939, column 57. See pages 96,97 of PBP. (Severity: 2) +Quotes used with an empty string at line 966, column 19. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 967, column 50. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 969, column 22. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 970, column 22. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 974, column 26. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 981, column 49. See page 53 of PBP. (Severity: 2) +Postfix control "unless" used at line 1006, column 43. See pages 96,97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1008, column 43. See pages 96,97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1011, column 34. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1012, column 34. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1015, column 15. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1077, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1077, column 33. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1086, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1086, column 33. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 1160, column 15. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1170, column 3. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1178, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1223, column 3. See page 97 of PBP. (Severity: 2) +"unless" block used at line 1231, column 3. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1263, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1264, column 50. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 1274, column 39. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1276, column 50. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1286, column 49. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1287, column 30. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 1305, column 57. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1315, column 77. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1318, column 2. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 1323, column 5. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1327, column 3. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1330, column 2. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1333, column 53. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1368, column 79. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1372, column 2. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 1377, column 3. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1381, column 3. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1404, column 10. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1424, column 33. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1425, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1433, column 39. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1437, column 38. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1446, column 4. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1448, column 45. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1449, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1449, column 31. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 1451, column 7. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1452, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1453, column 5. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1461, column 52. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1462, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1470, column 39. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1474, column 38. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1483, column 4. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1484, column 49. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1485, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1485, column 31. See page 237 of PBP. (Severity: 2) +"unless" block used at line 1486, column 5. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1515, column 70. See pages 93,94 of PBP. (Severity: 2) +Code structure is deeply nested at line 1516, column 41. Consider refactoring. (Severity: 3) +"unless" block used at line 1516, column 41. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1527, column 39. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1531, column 38. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1549, column 3. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1584, column 47. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1585, column 59. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1587, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1590, column 23. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1625, column 3. See page 97 of PBP. (Severity: 2) +"unless" block used at line 1629, column 3. See page 97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1658, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1659, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 1663, column 17. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 1683, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 1690, column 58. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1691, column 58. See page 53 of PBP. (Severity: 2) +Too many arguments at line 1698, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1708, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 1723, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1724, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1736, column 26. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1746, column 28. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1754, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1754, column 17. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 1764, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1765, column 74. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1770, column 58. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 1802, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1830, column 77. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1833, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1836, column 73. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1839, column 77. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1842, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1845, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1848, column 67. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1851, column 77. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1854, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1857, column 71. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1860, column 69. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1863, column 65. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 1866, column 67. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 1869, column 69. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 1884, column 15. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 1884, column 15. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 1896, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 1903, column 5. See page 53 of PBP. (Severity: 2) -Too many arguments at line 1939, column 1. See page 182 of PBP. (Severity: 3) -Postfix control "if" used at line 1943, column 19. See pages 93,94 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 1948, column 17. See page 79 of PBP. (Severity: 2) -Postfix control "if" used at line 1953, column 29. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 1961, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1869, column 67. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1872, column 69. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1887, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1887, column 15. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 1899, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1906, column 5. See page 53 of PBP. (Severity: 2) +Too many arguments at line 1942, column 1. See page 182 of PBP. (Severity: 3) +Postfix control "if" used at line 1946, column 19. See pages 93,94 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 1951, column 17. See page 79 of PBP. (Severity: 2) +Postfix control "if" used at line 1956, column 29. See pages 93,94 of PBP. (Severity: 2) Quotes used with an empty string at line 1964, column 35. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 1978, column 14. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 1990, column 14. See pages 93,94 of PBP. (Severity: 2) -Too many arguments at line 1994, column 1. See page 182 of PBP. (Severity: 3) -Postfix control "if" used at line 2009, column 35. See pages 93,94 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2026, column 17. See page 79 of PBP. (Severity: 2) -Postfix control "if" used at line 2041, column 22. See pages 93,94 of PBP. (Severity: 2) -Too many arguments at line 2050, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 2061, column 38. See page 53 of PBP. (Severity: 2) -Postfix control "unless" used at line 2064, column 51. See pages 96,97 of PBP. (Severity: 2) -Postfix control "if" used at line 2068, column 32. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 2069, column 35. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 2072, column 32. See pages 93,94 of PBP. (Severity: 2) -"unless" block used at line 2076, column 2. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 2087, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2130, column 40. See page 53 of PBP. (Severity: 2) -Too many arguments at line 2141, column 1. See page 182 of PBP. (Severity: 3) -Postfix control "if" used at line 2152, column 19. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 2164, column 41. See pages 93,94 of PBP. (Severity: 2) -Numeric escapes in interpolated string at line 2177, column 30. See page 56 of PBP. (Severity: 2) -Quotes used with an empty string at line 2179, column 41. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2197, column 32. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2197, column 32. See page 237 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2210, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2213, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2216, column 39. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2225, column 82. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2234, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2234, column 45. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2234, column 61. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2237, column 22. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2240, column 39. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2251, column 41. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2264, column 29. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2270, column 5. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2279, column 26. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2280, column 8. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 2303, column 2. Check the return value of "close" for success. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2323, column 12. See page 79 of PBP. (Severity: 2) -Quotes used with an empty string at line 2331, column 14. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2333, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2334, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2345, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2346, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2347, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2349, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2350, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2351, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2353, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2354, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2357, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2358, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2361, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2362, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2363, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2365, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2366, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2367, column 6. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 2488, column 28. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 2492, column 26. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 2501, column 36. See page 228 of PBP. (Severity: 2) -Quotes used with an empty string at line 2552, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2553, column 37. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2635, column 49. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2645, column 21. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2653, column 38. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2654, column 38. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2654, column 42. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2656, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2656, column 30. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2656, column 34. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1967, column 35. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1981, column 14. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1993, column 14. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 1997, column 1. See page 182 of PBP. (Severity: 3) +Postfix control "if" used at line 2012, column 35. See pages 93,94 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2029, column 17. See page 79 of PBP. (Severity: 2) +Postfix control "if" used at line 2044, column 22. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 2053, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 2064, column 38. See page 53 of PBP. (Severity: 2) +Postfix control "unless" used at line 2067, column 51. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 2071, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2072, column 35. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2074, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 2078, column 2. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 2089, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2132, column 40. See page 53 of PBP. (Severity: 2) +Too many arguments at line 2143, column 1. See page 182 of PBP. (Severity: 3) +Postfix control "if" used at line 2154, column 19. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2166, column 41. See pages 93,94 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 2179, column 30. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 2181, column 41. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2199, column 32. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2199, column 32. See page 237 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2212, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2215, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2218, column 39. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2227, column 82. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2236, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2236, column 45. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2236, column 61. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2239, column 22. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2242, column 39. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2253, column 41. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2266, column 29. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2272, column 5. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2281, column 26. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2282, column 8. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 2305, column 2. Check the return value of "close" for success. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2325, column 12. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 2333, column 14. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2335, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2336, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2347, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2348, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2349, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2351, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2352, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2353, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2355, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2356, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2359, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2360, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2363, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2364, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2365, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2367, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2368, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2369, column 6. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 2490, column 28. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 2494, column 26. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 2503, column 36. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 2554, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2555, column 37. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2637, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2647, column 21. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2655, column 38. See page 53 of PBP. (Severity: 2) Quotes used with an empty string at line 2656, column 38. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2657, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2657, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2658, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2658, column 51. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2659, column 48. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2659, column 53. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2660, column 48. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2660, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2656, column 42. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2658, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2658, column 30. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2658, column 34. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2658, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2659, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2659, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2660, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2660, column 51. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2661, column 48. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2661, column 53. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2662, column 50. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2662, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2662, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2662, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2663, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2663, column 53. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2664, column 50. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2664, column 55. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2666, column 50. See page 53 of PBP. (Severity: 2) Quotes used with a noisy string at line 2666, column 55. See page 53 of PBP. (Severity: 2) -Numeric escapes in interpolated string at line 2676, column 12. See page 56 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2679, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2679, column 14. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2680, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2680, column 14. See page 237 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2668, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2668, column 55. See page 53 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 2678, column 12. See page 56 of PBP. (Severity: 2) Regular expression without "/s" flag at line 2681, column 14. See pages 240,241 of PBP. (Severity: 2) Regular expression without "/m" flag at line 2681, column 14. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2682, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2682, column 21. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 2682, column 30. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2682, column 49. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2682, column 74. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2689, column 27. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2690, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2691, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2702, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2702, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2709, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2709, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2724, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2724, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2731, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2732, column 11. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2733, column 4. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2733, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2740, column 14. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2754, column 13. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2754, column 13. See page 237 of PBP. (Severity: 2) -Postfix control "unless" used at line 2760, column 4. See pages 96,97 of PBP. (Severity: 2) -Use 'eq' or hash instead of fixed-pattern regexps at line 2760, column 62. See pages 271,272 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2760, column 62. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2760, column 62. See page 237 of PBP. (Severity: 2) -Expression form of "eval" at line 2766, column 13. See page 161 of PBP. (Severity: 5) -Magic punctuation variable used at line 2768, column 49. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2769, column 14. See page 79 of PBP. (Severity: 2) -Quotes used with an empty string at line 2777, column 28. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2777, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2777, column 57. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2778, column 28. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 2786, column 42. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 2786, column 42. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 2787, column 17. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2787, column 21. See page 53 of PBP. (Severity: 2) -"unless" block used at line 2813, column 3. See page 97 of PBP. (Severity: 2) -Double-sigil dereference at line 2825, column 3. See page 228 of PBP. (Severity: 2) -Postfix control "if" used at line 2825, column 35. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2828, column 71. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2828, column 71. See page 79 of PBP. (Severity: 2) -Quotes used with a noisy string at line 2831, column 100. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2831, column 100. See page 79 of PBP. (Severity: 2) -Double-sigil dereference at line 2833, column 15. See page 228 of PBP. (Severity: 2) -Quotes used with an empty string at line 2877, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2877, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2881, column 41. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2940, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2951, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2951, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2952, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2966, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 2966, column 23. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2682, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2682, column 14. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2683, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2683, column 14. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2684, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2684, column 21. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 2684, column 30. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2684, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2684, column 74. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2691, column 27. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2692, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2693, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2704, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2704, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2711, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2711, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2726, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2726, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2733, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2734, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2735, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2735, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2742, column 14. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2756, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2756, column 13. See page 237 of PBP. (Severity: 2) +Postfix control "unless" used at line 2762, column 4. See pages 96,97 of PBP. (Severity: 2) +Use 'eq' or hash instead of fixed-pattern regexps at line 2762, column 62. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2762, column 62. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2762, column 62. See page 237 of PBP. (Severity: 2) +Expression form of "eval" at line 2768, column 13. See page 161 of PBP. (Severity: 5) +Magic punctuation variable used at line 2770, column 49. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2771, column 14. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 2779, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2779, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2779, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2780, column 28. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2788, column 42. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2788, column 42. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 2789, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2789, column 21. See page 53 of PBP. (Severity: 2) +"unless" block used at line 2815, column 3. See page 97 of PBP. (Severity: 2) +Double-sigil dereference at line 2827, column 3. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 2827, column 35. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2830, column 71. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2830, column 71. See page 79 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2833, column 100. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2833, column 100. See page 79 of PBP. (Severity: 2) +Double-sigil dereference at line 2835, column 15. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 2879, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2879, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2883, column 41. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2942, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2953, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2953, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2954, column 5. See page 53 of PBP. (Severity: 2) Quotes used with an empty string at line 2968, column 5. See page 53 of PBP. (Severity: 2) -Expression form of "eval" at line 2984, column 13. See page 161 of PBP. (Severity: 5) -Magic punctuation variable used at line 2986, column 45. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2987, column 10. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 2998, column 14. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 2968, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2970, column 5. See page 53 of PBP. (Severity: 2) +Expression form of "eval" at line 2986, column 13. See page 161 of PBP. (Severity: 5) +Magic punctuation variable used at line 2988, column 45. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2989, column 10. See page 79 of PBP. (Severity: 2) Magic punctuation variable used in interpolated string at line 3000, column 14. See page 79 of PBP. (Severity: 2) -Double-sigil dereference at line 3001, column 37. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3001, column 54. See page 228 of PBP. (Severity: 2) -"unless" block used at line 3007, column 4. See page 97 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 3010, column 16. See page 79 of PBP. (Severity: 2) -Quotes used with an empty string at line 3021, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3031, column 5. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3039, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3039, column 17. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3042, column 28. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3042, column 28. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 3043, column 23. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3048, column 17. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3054, column 6. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3067, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3067, column 21. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 3068, column 44. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3071, column 24. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3079, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3079, column 21. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 3080, column 40. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3083, column 24. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 3105, column 67. See pages 93,94 of PBP. (Severity: 2) -Subroutine "select_msgs" does not end with "return" at line 3125, column 1. See page 197 of PBP. (Severity: 4) -Long number not separated with underscores at line 3209, column 63. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 3210, column 63. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 3231, column 45. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 3234, column 46. See page 59 of PBP. (Severity: 2) -Double-sigil dereference at line 3245, column 9. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3246, column 9. See page 228 of PBP. (Severity: 2) -"unless" block used at line 3249, column 3. See page 97 of PBP. (Severity: 2) -"unless" block used at line 3250, column 3. See page 97 of PBP. (Severity: 2) -Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3264, column 1. See page 197 of PBP. (Severity: 4) -Postfix control "if" used at line 3312, column 22. See pages 93,94 of PBP. (Severity: 2) -Subroutine "copy_message" with high complexity score (21) at line 3341, column 1. Consider refactoring. (Severity: 3) -Too many arguments at line 3341, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 3347, column 60. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3348, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3349, column 61. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 3357, column 41. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 3358, column 95. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 3389, column 19. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3389, column 35. See page 53 of PBP. (Severity: 2) -Too many arguments at line 3401, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 3406, column 60. See page 53 of PBP. (Severity: 2) -"unless" block used at line 3408, column 2. See page 97 of PBP. (Severity: 2) -Quotes used with an empty string at line 3411, column 24. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 3413, column 34. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 3438, column 3. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 3441, column 49. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3449, column 16. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3471, column 15. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3471, column 15. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 3476, column 37. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 3477, column 64. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3484, column 16. See page 53 of PBP. (Severity: 2) -Subroutine "tests_subject" does not end with "return" at line 3495, column 1. See page 197 of PBP. (Severity: 4) -Quotes used with an empty string at line 3496, column 6. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3496, column 21. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3536, column 6. See page 53 of PBP. (Severity: 2) -Too many arguments at line 3558, column 1. See page 182 of PBP. (Severity: 3) -Quotes used with an empty string at line 3567, column 58. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3579, column 20. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3579, column 20. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3594, column 75. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3594, column 75. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 3623, column 28. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3631, column 10. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 3664, column 2. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3664, column 22. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3665, column 2. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3665, column 22. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3667, column 26. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3724, column 37. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3725, column 37. See page 228 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3738, column 23. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3738, column 23. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 3765, column 50. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 3812, column 35. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3812, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3812, column 57. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3812, column 68. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3812, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 35. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 57. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 68. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 79. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3813, column 90. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 3817, column 37. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3818, column 37. See page 228 of PBP. (Severity: 2) -Quotes used with an empty string at line 3860, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3860, column 43. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3860, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3860, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3860, column 76. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 43. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 65. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 76. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3861, column 87. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 3864, column 34. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3865, column 34. See page 228 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 3880, column 16. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 3880, column 16. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 3893, column 47. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 3925, column 78. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 3926, column 21. See page 228 of PBP. (Severity: 2) -Quotes used with an empty string at line 3929, column 102. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 3938, column 29. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 3938, column 29. See page 79 of PBP. (Severity: 2) -Quotes used with an empty string at line 3977, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3978, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3982, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 3983, column 24. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3002, column 14. See page 79 of PBP. (Severity: 2) +Double-sigil dereference at line 3003, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3003, column 54. See page 228 of PBP. (Severity: 2) +"unless" block used at line 3009, column 4. See page 97 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3012, column 16. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 3023, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3033, column 5. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3041, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3041, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3044, column 28. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3044, column 28. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3045, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3050, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3056, column 6. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3069, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3069, column 21. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3070, column 44. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3073, column 24. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3081, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3081, column 21. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3082, column 40. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3085, column 24. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3107, column 67. See pages 93,94 of PBP. (Severity: 2) +Subroutine "select_msgs" does not end with "return" at line 3127, column 1. See page 197 of PBP. (Severity: 4) +Long number not separated with underscores at line 3211, column 63. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 3212, column 63. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 3233, column 45. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 3236, column 46. See page 59 of PBP. (Severity: 2) +Double-sigil dereference at line 3247, column 9. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3248, column 9. See page 228 of PBP. (Severity: 2) +"unless" block used at line 3251, column 3. See page 97 of PBP. (Severity: 2) +"unless" block used at line 3252, column 3. See page 97 of PBP. (Severity: 2) +Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3266, column 1. See page 197 of PBP. (Severity: 4) +Postfix control "if" used at line 3314, column 22. See pages 93,94 of PBP. (Severity: 2) +Subroutine "copy_message" with high complexity score (21) at line 3343, column 1. Consider refactoring. (Severity: 3) +Too many arguments at line 3343, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 3350, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3351, column 61. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3359, column 41. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3360, column 95. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3391, column 19. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3391, column 35. See page 53 of PBP. (Severity: 2) +Too many arguments at line 3403, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 3408, column 60. See page 53 of PBP. (Severity: 2) +"unless" block used at line 3410, column 2. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 3413, column 24. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3415, column 34. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3440, column 3. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3443, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3451, column 16. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3473, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3473, column 15. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3478, column 37. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3479, column 64. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3486, column 16. See page 53 of PBP. (Severity: 2) +Subroutine "tests_subject" does not end with "return" at line 3497, column 1. See page 197 of PBP. (Severity: 4) +Quotes used with an empty string at line 3498, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3498, column 21. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3538, column 6. See page 53 of PBP. (Severity: 2) +Too many arguments at line 3560, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 3569, column 58. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3581, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3581, column 20. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3596, column 75. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3596, column 75. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3625, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3633, column 10. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 3666, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3666, column 22. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3667, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3667, column 22. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3669, column 26. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3726, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3727, column 37. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3740, column 23. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3740, column 23. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3767, column 50. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3814, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3814, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3814, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3814, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3814, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3815, column 90. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 3819, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3820, column 37. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 3862, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3862, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3862, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3862, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3862, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3863, column 87. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 3866, column 34. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3867, column 34. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3882, column 16. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3882, column 16. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3895, column 47. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 3927, column 78. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3928, column 21. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 3931, column 102. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3940, column 29. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3940, column 29. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 3979, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3980, column 24. See page 53 of PBP. (Severity: 2) Quotes used with an empty string at line 3984, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4028, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4029, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3985, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3986, column 24. See page 53 of PBP. (Severity: 2) Quotes used with an empty string at line 4030, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4034, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4035, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4031, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4032, column 24. See page 53 of PBP. (Severity: 2) Quotes used with an empty string at line 4036, column 24. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4102, column 25. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4103, column 25. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4118, column 20. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4118, column 20. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4135, column 13. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4135, column 13. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 4141, column 5. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4141, column 32. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4141, column 36. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4142, column 46. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4143, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4146, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 4147, column 60. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4168, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4169, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4185, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4186, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4189, column 15. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4198, column 15. See page 53 of PBP. (Severity: 2) -Expression form of "eval" at line 4315, column 13. See page 161 of PBP. (Severity: 5) -Magic punctuation variable used at line 4317, column 38. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4318, column 10. See page 79 of PBP. (Severity: 2) -Long number not separated with underscores at line 4331, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4332, column 46. See page 59 of PBP. (Severity: 2) +Quotes used with an empty string at line 4037, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4038, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4104, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4105, column 25. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4120, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4120, column 20. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4137, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4137, column 13. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4143, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4143, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4143, column 36. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4144, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4145, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4148, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4149, column 60. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4170, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4171, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4187, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4188, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4191, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4200, column 15. See page 53 of PBP. (Severity: 2) +Expression form of "eval" at line 4317, column 13. See page 161 of PBP. (Severity: 5) +Magic punctuation variable used at line 4319, column 38. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4320, column 10. See page 79 of PBP. (Severity: 2) +Long number not separated with underscores at line 4333, column 46. See page 59 of PBP. (Severity: 2) Long number not separated with underscores at line 4334, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4335, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4336, column 46. See page 59 of PBP. (Severity: 2) Long number not separated with underscores at line 4337, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4338, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4339, column 46. See page 59 of PBP. (Severity: 2) Long number not separated with underscores at line 4340, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4341, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4342, column 46. See page 59 of PBP. (Severity: 2) Long number not separated with underscores at line 4343, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4344, column 46. See page 59 of PBP. (Severity: 2) -Long number not separated with underscores at line 4346, column 49. See page 59 of PBP. (Severity: 2) -Quotes used with an empty string at line 4355, column 23. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 4400, column 65. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 4459, column 31. See pages 93,94 of PBP. (Severity: 2) -Too many arguments at line 4470, column 1. See page 182 of PBP. (Severity: 3) -Double-sigil dereference at line 4474, column 29. See page 228 of PBP. (Severity: 2) -Double-sigil dereference at line 4485, column 43. See page 228 of PBP. (Severity: 2) -Postfix control "unless" used at line 4508, column 29. See pages 96,97 of PBP. (Severity: 2) -Double-sigil dereference at line 4534, column 29. See page 228 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4545, column 30. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4545, column 30. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4560, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4560, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4563, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4563, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4566, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4566, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4569, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4569, column 24. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4572, column 98. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4572, column 98. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 4585, column 37. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4585, column 41. See page 53 of PBP. (Severity: 2) -Numeric escapes in interpolated string at line 4590, column 51. See page 56 of PBP. (Severity: 2) -Quotes used with an empty string at line 4600, column 21. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4602, column 52. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4604, column 9. Check the return value of "close" for success. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4613, column 46. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4615, column 2. Check the return value of "close" for success. (Severity: 2) -Quotes used with an empty string at line 4616, column 14. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4622, column 67. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4624, column 2. Check the return value of "close" for success. (Severity: 2) -Regular expression without "/s" flag at line 4639, column 21. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4639, column 21. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4663, column 24. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4663, column 24. See page 237 of PBP. (Severity: 2) -Magic punctuation variable used at line 4680, column 18. See page 79 of PBP. (Severity: 2) -Return value of "close" ignored at line 4703, column 2. Check the return value of "close" for success. (Severity: 2) -Magic punctuation variable used in interpolated string at line 4723, column 20. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used at line 4737, column 23. See page 79 of PBP. (Severity: 2) -Magic punctuation variable used at line 4739, column 7. See page 79 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4739, column 13. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4739, column 13. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 4754, column 20. See page 53 of PBP. (Severity: 2) -Quotes used with an empty string at line 4756, column 11. See page 53 of PBP. (Severity: 2) -String delimiter used with "split" at line 4808, column 28. Express it as a regex instead. (Severity: 2) -Quotes used with a noisy string at line 4808, column 34. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4871, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4871, column 17. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4880, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4880, column 17. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 4918, column 13. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4921, column 17. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4921, column 17. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 4924, column 16. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 4924, column 30. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 4925, column 22. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4930, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4930, column 12. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 4942, column 38. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4942, column 72. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4942, column 72. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 4943, column 38. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 4945, column 46. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 4949, column 30. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 4951, column 34. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4956, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4956, column 12. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4972, column 19. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4972, column 19. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4985, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4985, column 12. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 4991, column 29. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 4997, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 4997, column 12. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5008, column 12. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5008, column 12. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 5029, column 5. See page 53 of PBP. (Severity: 2) -Double-sigil dereference at line 5081, column 33. See page 228 of PBP. (Severity: 2) -Expression form of "eval" at line 5102, column 43. See page 161 of PBP. (Severity: 5) -Expression form of "eval" at line 5106, column 45. See page 161 of PBP. (Severity: 5) -Postfix control "if" used at line 5111, column 34. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5112, column 36. See pages 93,94 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5126, column 33. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5126, column 33. See page 237 of PBP. (Severity: 2) -Quotes used with an empty string at line 5127, column 36. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5165, column 27. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5165, column 27. See page 237 of PBP. (Severity: 2) -Use 'eq' or hash instead of fixed-pattern regexps at line 5169, column 36. See pages 271,272 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5169, column 36. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5169, column 36. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5171, column 31. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5171, column 31. See page 237 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5177, column 34. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5177, column 34. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5180, column 65. See pages 93,94 of PBP. (Severity: 2) -Quotes used with an empty string at line 5306, column 17. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5311, column 20. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5311, column 20. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5317, column 28. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5317, column 33. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 5318, column 28. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5318, column 33. See page 53 of PBP. (Severity: 2) -Long number not separated with underscores at line 5351, column 55. See page 59 of PBP. (Severity: 2) -"$i" is declared but not used at line 5370, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) -Quotes used with an empty string at line 5381, column 28. See page 53 of PBP. (Severity: 2) -Long number not separated with underscores at line 5389, column 40. See page 59 of PBP. (Severity: 2) -Quotes used with an empty string at line 5401, column 25. See page 53 of PBP. (Severity: 2) -Postfix control "if" used at line 5402, column 43. See pages 93,94 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5403, column 54. See page 53 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5403, column 60. See page 53 of PBP. (Severity: 2) -Magic punctuation variable used in interpolated here-document at line 5404, column 15. See page 79 of PBP. (Severity: 2) -Quotes used with a noisy string at line 5646, column 20. See page 53 of PBP. (Severity: 2) -Regular expression without "/s" flag at line 5651, column 14. See pages 240,241 of PBP. (Severity: 2) -Regular expression without "/m" flag at line 5651, column 14. See page 237 of PBP. (Severity: 2) -Postfix control "if" used at line 5785, column 49. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5798, column 12. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5802, column 32. See pages 93,94 of PBP. (Severity: 2) -Postfix control "unless" used at line 5805, column 30. See pages 96,97 of PBP. (Severity: 2) -Postfix control "if" used at line 5813, column 32. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5822, column 32. See pages 93,94 of PBP. (Severity: 2) -Postfix control "if" used at line 5886, column 33. See pages 93,94 of PBP. (Severity: 2) +Long number not separated with underscores at line 4345, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4346, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4348, column 49. See page 59 of PBP. (Severity: 2) +Quotes used with an empty string at line 4357, column 23. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 4402, column 65. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4461, column 31. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 4472, column 1. See page 182 of PBP. (Severity: 3) +Double-sigil dereference at line 4476, column 29. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 4487, column 43. See page 228 of PBP. (Severity: 2) +Postfix control "unless" used at line 4510, column 29. See pages 96,97 of PBP. (Severity: 2) +Double-sigil dereference at line 4536, column 29. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4547, column 30. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4547, column 30. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4562, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4562, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4565, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4565, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4568, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4568, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4571, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4571, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4574, column 98. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4574, column 98. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4587, column 37. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4587, column 41. See page 53 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 4592, column 51. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 4602, column 21. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4604, column 52. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4606, column 9. Check the return value of "close" for success. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4615, column 46. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4617, column 2. Check the return value of "close" for success. (Severity: 2) +Quotes used with an empty string at line 4618, column 14. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4624, column 67. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4626, column 2. Check the return value of "close" for success. (Severity: 2) +Regular expression without "/s" flag at line 4641, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4641, column 21. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4665, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4665, column 24. See page 237 of PBP. (Severity: 2) +Magic punctuation variable used at line 4682, column 18. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4705, column 2. Check the return value of "close" for success. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4725, column 20. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used at line 4739, column 23. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used at line 4741, column 7. See page 79 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4741, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4741, column 13. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4756, column 20. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4758, column 11. See page 53 of PBP. (Severity: 2) +String delimiter used with "split" at line 4810, column 28. Express it as a regex instead. (Severity: 2) +Quotes used with a noisy string at line 4810, column 34. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4873, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4873, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4882, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4882, column 17. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4920, column 13. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4923, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4923, column 17. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4926, column 16. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 4926, column 30. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 4927, column 22. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4932, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4932, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4944, column 38. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4944, column 72. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4944, column 72. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4945, column 38. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4947, column 46. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4951, column 30. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4953, column 34. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4958, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4958, column 12. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4974, column 19. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4974, column 19. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4987, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4987, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4993, column 29. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4999, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4999, column 12. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5010, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5010, column 12. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 5031, column 5. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 5083, column 33. See page 228 of PBP. (Severity: 2) +Expression form of "eval" at line 5104, column 43. See page 161 of PBP. (Severity: 5) +Expression form of "eval" at line 5108, column 45. See page 161 of PBP. (Severity: 5) +Postfix control "if" used at line 5113, column 34. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5114, column 36. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5128, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5128, column 33. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 5129, column 36. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5167, column 27. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5167, column 27. See page 237 of PBP. (Severity: 2) +Use 'eq' or hash instead of fixed-pattern regexps at line 5171, column 36. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5171, column 36. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5171, column 36. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5173, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5173, column 31. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5179, column 34. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5179, column 34. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5182, column 65. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 5308, column 17. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5313, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5313, column 20. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5319, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5319, column 33. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5320, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5320, column 33. See page 53 of PBP. (Severity: 2) +Long number not separated with underscores at line 5353, column 55. See page 59 of PBP. (Severity: 2) +"$i" is declared but not used at line 5372, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) +Quotes used with an empty string at line 5383, column 28. See page 53 of PBP. (Severity: 2) +Long number not separated with underscores at line 5391, column 40. See page 59 of PBP. (Severity: 2) +Quotes used with an empty string at line 5403, column 25. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5404, column 43. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5405, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5405, column 60. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated here-document at line 5406, column 15. See page 79 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5648, column 20. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5653, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5653, column 14. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5787, column 49. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5800, column 12. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5804, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "unless" used at line 5807, column 30. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 5815, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5824, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5888, column 33. See pages 93,94 of PBP. (Severity: 2) diff --git a/perlcritic_3.out b/perlcritic_3.out index 1f66b0a..9a772aa 100644 --- a/perlcritic_3.out +++ b/perlcritic_3.out @@ -1,23 +1,23 @@ -Main code has high complexity score (333) at line 1, column 1. Consider refactoring. (Severity: 3) -Code structure is deeply nested at line 1513, column 41. Consider refactoring. (Severity: 3) -Too many arguments at line 1680, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 1695, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 1705, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 1939, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 1994, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 2050, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 2141, column 1. See page 182 of PBP. (Severity: 3) -Expression form of "eval" at line 2766, column 13. See page 161 of PBP. (Severity: 5) -Expression form of "eval" at line 2984, column 13. See page 161 of PBP. (Severity: 5) -Subroutine "select_msgs" does not end with "return" at line 3125, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3264, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "copy_message" with high complexity score (21) at line 3341, column 1. Consider refactoring. (Severity: 3) -Too many arguments at line 3341, column 1. See page 182 of PBP. (Severity: 3) -Too many arguments at line 3401, column 1. See page 182 of PBP. (Severity: 3) -Subroutine "tests_subject" does not end with "return" at line 3495, column 1. See page 197 of PBP. (Severity: 4) -Too many arguments at line 3558, column 1. See page 182 of PBP. (Severity: 3) -Expression form of "eval" at line 4315, column 13. See page 161 of PBP. (Severity: 5) -Too many arguments at line 4470, column 1. See page 182 of PBP. (Severity: 3) -Expression form of "eval" at line 5102, column 43. See page 161 of PBP. (Severity: 5) -Expression form of "eval" at line 5106, column 45. See page 161 of PBP. (Severity: 5) -"$i" is declared but not used at line 5370, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) +Main code has high complexity score (335) at line 1, column 1. Consider refactoring. (Severity: 3) +Code structure is deeply nested at line 1516, column 41. Consider refactoring. (Severity: 3) +Too many arguments at line 1683, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1698, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1708, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1942, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1997, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 2053, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 2143, column 1. See page 182 of PBP. (Severity: 3) +Expression form of "eval" at line 2768, column 13. See page 161 of PBP. (Severity: 5) +Expression form of "eval" at line 2986, column 13. See page 161 of PBP. (Severity: 5) +Subroutine "select_msgs" does not end with "return" at line 3127, column 1. See page 197 of PBP. (Severity: 4) +Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3266, column 1. See page 197 of PBP. (Severity: 4) +Subroutine "copy_message" with high complexity score (21) at line 3343, column 1. Consider refactoring. (Severity: 3) +Too many arguments at line 3343, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 3403, column 1. See page 182 of PBP. (Severity: 3) +Subroutine "tests_subject" does not end with "return" at line 3497, column 1. See page 197 of PBP. (Severity: 4) +Too many arguments at line 3560, column 1. See page 182 of PBP. (Severity: 3) +Expression form of "eval" at line 4317, column 13. See page 161 of PBP. (Severity: 5) +Too many arguments at line 4472, column 1. See page 182 of PBP. (Severity: 3) +Expression form of "eval" at line 5104, column 43. See page 161 of PBP. (Severity: 5) +Expression form of "eval" at line 5108, column 45. See page 161 of PBP. (Severity: 5) +"$i" is declared but not used at line 5372, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) diff --git a/tests.sh b/tests.sh index 03c8895..b543ef8 100644 --- a/tests.sh +++ b/tests.sh @@ -1,6 +1,6 @@ #!/bin/sh -# $Id: tests.sh,v 1.224 2013/08/18 19:30:46 gilles Exp gilles $ +# $Id: tests.sh,v 1.225 2013/09/21 21:55:17 gilles Exp gilles $ # Example 1: # CMD_PERL='perl -I./Mail-IMAPClient-3.33/lib' sh -x tests.sh @@ -468,6 +468,16 @@ ll_folderrec_star() { --folderrec 'INBOX.yop.*' --justfolders } +ll_change_blank() { + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --justfolders --nofoldersizes +} + + ll_folderrec_blank_bug() { @@ -2186,6 +2196,19 @@ msw2() { ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test_exe.bat' } + +ll_change_characters_gmail() { + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --folder "INBOX. f g\h\"i'j " --justfolders \ + --regextrans2 "s/['\"\\\\]/_/g" --regextrans2 's,(/|^) +,$1,g' --regextrans2 's, +(/|$),$1,g' + +} + + xxxxx_gmail() { ! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \ @@ -2197,7 +2220,7 @@ xxxxx_gmail() { --user2 gilles.lamiral@gmail.com \ --passfile2 ../../var/pass/secret.gilles_gmail \ --nofoldersizes \ - --regextrans2 's/ +$//g' --regextrans2 's# +/#/#g' \ + --regextrans2 's,(/|^) +,$1,g' --regextrans2 's, +(/|$),$1,g' \ --exclude 'INBOX.yop.YAP' \ --regextrans2 "s,^Messages envoy&AOk-s$,[Gmail]/Messages envoy&AOk-s," \ --regextrans2 "s,^Sent$,[Gmail]/Sent Mail," \ @@ -2288,7 +2311,8 @@ xxxxx_gmail_5_justfolders() { --ssl2 \ --user2 gilles.lamiral@gmail.com \ --passfile2 ../../var/pass/secret.gilles_gmail \ - --justfolders + --justfolders --nofoldersizes \ + --regextrans2 's,(/|^) +,$1,g' --regextrans2 's, +(/|$),$1,g' }