From ce6842565f39f8140495dffb0bce857d91d8c6c7 Mon Sep 17 00:00:00 2001 From: Nick Bebout Date: Thu, 25 Jul 2013 16:42:01 -0500 Subject: [PATCH] 1.555 --- ChangeLog | 50 +- FAQ | 5 +- Makefile | 30 +- README | 8 +- TODO | 25 +- VERSION | 2 +- VERSION_EXE | 2 +- W/.BUILD_EXE_TIME | 31 +- W/learn/dbfile | 2 +- W/learn/test_dbmdeep.db | Bin 0 -> 1922913 bytes W/test3.bat | 16 +- W/test3_gmail.bat | 16 + build_exe.bat | 4 +- examples/install_modules.bat | 4 +- imapsync | 3186 ++++++++++++++++++++-------------- index.shtml | 49 +- perlcritic.out | 103 -- perlcritic_1.out | 1948 +++++++++++++++++++++ perlcritic_2.out | 565 ++++++ perlcritic_3.out | 20 + tests.sh | 124 +- 21 files changed, 4740 insertions(+), 1450 deletions(-) create mode 100644 W/learn/test_dbmdeep.db create mode 100644 W/test3_gmail.bat delete mode 100644 perlcritic.out create mode 100644 perlcritic_1.out create mode 100644 perlcritic_2.out create mode 100644 perlcritic_3.out diff --git a/ChangeLog b/ChangeLog index 9edce3b..d8c56d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,17 +1,59 @@ RCS file: RCS/imapsync,v Working file: imapsync -head: 1.547 +head: 1.555 branch: locks: strict - gilles: 1.547 + gilles: 1.555 access list: symbolic names: keyword substitution: kv -total revisions: 547; selected revisions: 547 +total revisions: 555; selected revisions: 555 description: ---------------------------- -revision 1.547 locked by: gilles; +revision 1.555 locked by: gilles; +date: 2013/07/23 11:41:10; author: gilles; state: Exp; lines: +7 -6 +Fix warning for extract_header() +---------------------------- +revision 1.554 +date: 2013/07/22 01:23:12; author: gilles; state: Exp; lines: +7 -7 +typo - when error printed. +---------------------------- +revision 1.553 +date: 2013/07/22 01:18:30; author: gilles; state: Exp; lines: +9 -7 +Bug fix. Header lines can contain \r\n. +---------------------------- +revision 1.552 +date: 2013/07/22 00:51:52; author: gilles; state: Exp; lines: +74 -11 +Added "Subject: lala" when line length exceeds maxlinelength to help ti find what are those messages. Added also size, flags and internal date. +---------------------------- +revision 1.551 +date: 2013/07/19 14:05:50; author: gilles; state: Exp; lines: +698 -650 +Added option --maxlinelength to skip messages whose max line length is over a number of bytes. +---------------------------- +revision 1.550 +date: 2013/07/19 00:13:22; author: gilles; state: Exp; lines: +1029 -585 +Added success Domino 8.5.2 +Added option --messageidnodomain to fix Mailenable bug changing the domain part of Message-Id header, and avoid duplicates +Added option --syncflagsaftercopy to fix Mailenable bug not getting the flags with the APPEND. +Added back the banner of IMAP servers, ie, the first line given after the connection established. +Added --fixInboxINBOX, turned on by default, to map automatically Inbox INBOX folder names. +IMAP server removing consecutive spaces on the header part doesn't generate duplicates (MailEnable does that). +Better output of mailbox sizes in human style (could be 1024.00 Kib, now it is 1.000 Mib). Changed bytes_display_string(). +Option --debugflags now prints flags on first sync (the copy) and also the PERMANENTFLAGS outpout. +Fixed nearly 200 perlcritic at level 3, all level 4. Still 5 eval "" at level 5 and 12 critics at level 3. +---------------------------- +revision 1.549 +date: 2013/07/06 01:09:03; author: gilles; state: Exp; lines: +81 -11 +Fixed two bugs coming from adding return( ) at the end of functions. +Added tests to remove Disposition-Notification-To: header with regexmess:. +---------------------------- +revision 1.548 +date: 2013/07/04 02:25:05; author: gilles; state: Exp; lines: +247 -201 +Removed all perlcritic severity 4. Still 5 critics at severity 5. +98 critics severity 4 fixed. +---------------------------- +revision 1.547 date: 2013/07/03 01:24:34; author: gilles; state: Exp; lines: +11 -8 DBOX 2.41 success. Kerio 8 success. diff --git a/FAQ b/FAQ index 395bcec..9ce327c 100644 --- a/FAQ +++ b/FAQ @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: FAQ,v 1.134 2013/06/02 23:34:02 gilles Exp gilles $ +# $Id: FAQ,v 1.135 2013/07/23 11:28:22 gilles Exp gilles $ +------------------+ | FAQ for imapsync | @@ -1703,6 +1703,9 @@ R: --sep1 "/" --prefix1 "" Q: From MailEnable 2.2 R: --sep1 "." --prefix1 "" +Q: To MailEnable +R: --sep2 / --prefix2 "" --addheader --messageidnodomain --syncflagsaftercopy + ====================================================================== Q. From GMX IMAP4 StreamProxy R. Use: diff --git a/Makefile b/Makefile index 5cab5b2..094556f 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -# $Id: Makefile,v 1.121 2013/06/02 23:34:14 gilles Exp gilles $ +# $Id: Makefile,v 1.123 2013/07/23 11:27:18 gilles Exp gilles $ .PHONY: help usage all @@ -21,6 +21,7 @@ usage: @echo "make imapsync.exe" @echo "make imapsync_elf_x86.bin" @echo "make publish" + @echo "make perlcritic" PREFIX ?= /usr @@ -98,7 +99,18 @@ cidone: ############### -.PHONY: test tests testp testf test3xx testv3 +.PHONY: test tests testp testf test3xx testv3 perlcritic + +perlcritic: perlcritic_3.out perlcritic_2.out perlcritic_1.out + +perlcritic_1.out: imapsync + perlcritic -1 imapsync > perlcritic_1.out || : + +perlcritic_2.out: imapsync + perlcritic -2 imapsync > perlcritic_2.out || : + +perlcritic_3.out: imapsync + perlcritic -3 imapsync > perlcritic_3.out || : test_quick : test_quick_3xx @@ -121,7 +133,7 @@ tests: test testf: clean_test test -.PHONY: lfo upload_lfo niouze_lfo niouze_fm public imapsync_cidone +.PHONY: lfo upload_lfo public imapsync_cidone .dosify_bat: W/*.bat examples/*.bat unix2dos W/*.bat examples/*.bat @@ -216,7 +228,7 @@ imapsync_elf_x86.bin: imapsync ./imapsync_elf_x86.bin -lfo: cidone niouze_lfo upload_lfo +lfo: cidone upload_lfo tarball: .tarball @@ -300,7 +312,7 @@ ml: dist_dir mailq -upload_ks: ci dist +upload_ks: ci rsync -lptvHzP $(PUBLIC_FILES) \ root@ks.lamiral.info:/var/www/imapsync/ rsync -lptvHzP $(PUBLIC_FILES_W) \ @@ -331,11 +343,3 @@ upload_index: FAQ LICENSE CREDITS W/*.bat examples/*.bat examples/sync_loop_unix rsync -avH W/*.bat root@ks.lamiral.info:/var/www/imapsync/W/ rsync -avH examples/*.bat examples/sync_loop_unix.sh root@ks.lamiral.info:/var/www/imapsync/examples/ -niouze_lfo : - echo "CORRECT ME: . ./memo && lfo_announce" - -niouze_fm: VERSION - . ./memo && fm_announce - - -public: niouze_fm diff --git a/README b/README index 23cbd40..b5ee957 100644 --- a/README +++ b/README @@ -4,7 +4,7 @@ NAME More than 52 different IMAP server softwares supported with success, few failures. - $Revision: 1.547 $ + $Revision: 1.555 $ SYNOPSIS To synchronize imap account "foo" on "imap.truc.org" to imap account @@ -343,8 +343,8 @@ IMAP SERVERS - 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] + - 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 @@ -464,5 +464,5 @@ SIMILAR SOFTWARES Feedback (good or bad) will often be welcome. - $Id: imapsync,v 1.547 2013/07/03 01:24:34 gilles Exp gilles $ + $Id: imapsync,v 1.555 2013/07/23 11:41:10 gilles Exp gilles $ diff --git a/TODO b/TODO index 877ef5f..f3a6ccc 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: TODO,v 1.119 2013/04/17 13:04:21 gilles Exp gilles $ +# $Id: TODO,v 1.120 2013/07/22 07:40:44 gilles Exp gilles $ TODO file for imapsync ---------------------- @@ -11,7 +11,6 @@ Add a best practice migration tips document. Write a Mail::imapsync package and use it. -Remove 2.2.9 Mail::IMAPClient support. Fix the mailing-list archive bug with From at the beginning of a line @@ -26,7 +25,6 @@ http://www.microsoft.com/download/en/details.aspx?id=1329 "Microsoft Transporter Add an exit value when exiting because of --exitwhenover The goal is to know easily why to restart later. -Add --delete1 as an alias for --delete Add --mark-as-deleted1 --mark-as-deleted2 as aliases for --noexpunge1 --delete1 and --noexpunge2 --delete2 @@ -49,9 +47,6 @@ Fix long path over than 260 character on Win32. Think about Digest::SHA or Digest::SHA::PurePerl. Think about a file database like DBM instead. -Add OAUTH autentication support -https://developers.google.com/google-apps/gmail/oauth_overview - Find a way to avoid passwords in --debugimap unless needed. Explain that users can win time/bandwidth by using --expunge @@ -78,6 +73,7 @@ http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=503159 http://www.linux-france.org/prj/imapsync_list/msg00022.html http://mail.google.com/support/bin/answer.py?hl=en&answer=77657 http://mail.google.com/support/bin/answer.py?answer=78892 + Look at larch https://github.com/rgrove/larch/ http://wonko.com/ @@ -122,11 +118,6 @@ Fix bug with folder names starting with an asterisk: *Archiv Sending: 220 SELECT *Archiv/Support/foobar Read: 220 BAD Protokollfehler: "Invalid folder specified in SELECT command" -Add automatic convertion or detection when -separator inversion produces an invalid character. -From uw to cyrus, for example : -FoldA/FoldB.ext -> FoldA.FoldB/ext - Compare speed between 1.182 and 1.217 "un mailbox de 90MB, ~2400 fichiers prends 80s avec la version 1.182 vs 250s avec la version 1.217". Marc Jauvin @@ -159,9 +150,21 @@ http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html =========================================================================== +DONE. Remove 2.2.9 Mail::IMAPClient support. + +DONE. Add OAUTH autentication support +https://developers.google.com/google-apps/gmail/oauth_overview + +DONE. Add --delete1 as an alias for --delete + DONE. Add current date at the beginning of the run, useful when imapsync doesn't finish with statistics. +DONE. Add automatic convertion or detection when +separator inversion produces an invalid character. +From uw to cyrus, for example : +FoldA/FoldB.ext -> FoldA.FoldB/ext + DONE. Not donse since useless now (--useuid) Add a --skipheaderinfolder option diff --git a/VERSION b/VERSION index e87c784..0a92d41 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.547 +1.555 diff --git a/VERSION_EXE b/VERSION_EXE index e87c784..0a92d41 100644 --- a/VERSION_EXE +++ b/VERSION_EXE @@ -1 +1 @@ -1.547 +1.555 diff --git a/W/.BUILD_EXE_TIME b/W/.BUILD_EXE_TIME index 2b2d14f..3186b00 100644 --- a/W/.BUILD_EXE_TIME +++ b/W/.BUILD_EXE_TIME @@ -2,19 +2,14 @@ 1287415485 END 1.359 : lundi 18 octobre 2010, 17:24:45 (UTC+0200) 1287529537 BEGIN 1.361 : mercredi 20 octobre 2010, 01:05:37 (UTC+0200) 1287530365 END 1.361 : mercredi 20 octobre 2010, 01:19:25 (UTC+0200) -1287959884 BEGIN 1.363 : lundi 25 octobre 2010, 00:38:04 (UTC+0200) 1287959962 BEGIN 1.363 : lundi 25 octobre 2010, 00:39:22 (UTC+0200) 1287961164 END 1.363 : lundi 25 octobre 2010, 00:59:24 (UTC+0200) 1288000749 BEGIN 1.364 : lundi 25 octobre 2010, 11:59:09 (UTC+0200) 1288001592 END 1.364 : lundi 25 octobre 2010, 12:13:12 (UTC+0200) -1288007207 BEGIN 1.365 : lundi 25 octobre 2010, 13:46:47 (UTC+0200) -1288007339 BEGIN 1.365 : lundi 25 octobre 2010, 13:48:59 (UTC+0200) 1288007381 BEGIN 1.365 : lundi 25 octobre 2010, 13:49:41 (UTC+0200) 1288008514 END 1.365 : lundi 25 octobre 2010, 14:08:34 (UTC+0200) 1288027748 BEGIN 1.366 : lundi 25 octobre 2010, 19:29:08 (UTC+0200) 1288028635 END 1.366 : lundi 25 octobre 2010, 19:43:55 (UTC+0200) -1288392218 BEGIN 1.366 : samedi 30 octobre 2010, 00:43:38 (UTC+0200) -1288392376 BEGIN 1.366 : samedi 30 octobre 2010, 00:46:16 (UTC+0200) 1288393061 BEGIN 1.366 : samedi 30 octobre 2010, 00:57:41 (UTC+0200) 1288394122 END 1.366 : samedi 30 octobre 2010, 01:15:22 (UTC+0200) 1288441141 BEGIN 1.366 : samedi 30 octobre 2010, 14:19:01 (UTC+0200) @@ -23,7 +18,6 @@ 1288673466 END 1.370 : mardi 2 novembre 2010, 05:51:06 (UTC+0100) 1288749547 BEGIN 1.372 : mercredi 3 novembre 2010, 02:59:07 (UTC+0100) 1288750449 END 1.372 : mercredi 3 novembre 2010, 03:14:09 (UTC+0100) -1289172807 BEGIN 1.375 : lundi 8 novembre 2010, 00:33:27 (UTC+0100) 1289173896 BEGIN 1.375 : lundi 8 novembre 2010, 00:51:36 (UTC+0100) 1289174968 END 1.375 : lundi 8 novembre 2010, 01:09:28 (UTC+0100) 1289267414 BEGIN 1.376 : mardi 9 novembre 2010, 02:50:14 (UTC+0100) @@ -38,7 +32,6 @@ 1293675986 END 1.388 : jeudi 30 décembre 2010, 03:26:26 (UTC+0100) 1294638763 BEGIN 1.390 : lundi 10 janvier 2011, 06:52:43 (UTC+0100) 1294639451 END 1.390 : lundi 10 janvier 2011, 07:04:11 (UTC+0100) -1295319336 BEGIN 1.397 : mardi 18 janvier 2011, 03:55:36 (UTC+0100) 1295319857 BEGIN 1.398 : mardi 18 janvier 2011, 04:04:17 (UTC+0100) 1295320425 END 1.398 : mardi 18 janvier 2011, 04:13:45 (UTC+0100) 1297861110 BEGIN 1.402 : mercredi 16 février 2011, 13:58:30 (UTC+0100) @@ -49,7 +42,6 @@ 1298256141 END 1.403 : lundi 21 février 2011, 03:42:21 (UTC+0100) 1298260592 BEGIN 1.404 : lundi 21 février 2011, 04:56:32 (UTC+0100) 1298261452 END 1.404 : lundi 21 février 2011, 05:10:52 (UTC+0100) -1301785718 BEGIN 1.407 : dimanche 3 avril 2011, 01:08:38 (UTC+0200) 1301848291 BEGIN 1.407 : dimanche 3 avril 2011, 18:31:31 (UTC+0200) 1301848906 END 1.407 : dimanche 3 avril 2011, 18:41:46 (UTC+0200) 1303254735 BEGIN 1.410 : mercredi 20 avril 2011, 01:12:15 (UTC+0200) @@ -68,8 +60,6 @@ 1304816775 END 1.420 : dimanche 8 mai 2011, 03:06:15 (UTC+0200) 1304876623 BEGIN 1.422 : dimanche 8 mai 2011, 19:43:43 (UTC+0200) 1304877295 END 1.422 : dimanche 8 mai 2011, 19:54:55 (UTC+0200) -1305335556 BEGIN 1.425 : samedi 14 mai 2011, 03:12:36 (UTC+0200) -1305335701 BEGIN 1.426 : samedi 14 mai 2011, 03:15:01 (UTC+0200) 1305335893 BEGIN 1.426 : samedi 14 mai 2011, 03:18:13 (UTC+0200) 1305336587 END 1.426 : samedi 14 mai 2011, 03:29:47 (UTC+0200) 1305337730 BEGIN 1.427 : samedi 14 mai 2011, 03:48:50 (UTC+0200) @@ -82,16 +72,12 @@ 1305516805 END 1.433 : lundi 16 mai 2011, 05:33:25 (UTC+0200) 1305530708 BEGIN 1.434 : lundi 16 mai 2011, 09:25:08 (UTC+0200) 1305531494 END 1.434 : lundi 16 mai 2011, 09:38:14 (UTC+0200) -1305566629 BEGIN 1.434 : lundi 16 mai 2011, 19:23:49 (UTC+0200) -1306773025 BEGIN 1.444 : lundi 30 mai 2011, 18:30:25 (UTC+0200) 1306774566 BEGIN 1.444 : lundi 30 mai 2011, 18:56:06 (UTC+0200) 1306775410 END 1.444 : lundi 30 mai 2011, 19:10:10 (UTC+0200) 1306792918 BEGIN 1.444 : mardi 31 mai 2011, 00:01:58 (UTC+0200) 1306793766 END 1.444 : mardi 31 mai 2011, 00:16:06 (UTC+0200) 1306834735 BEGIN 1.446 : mardi 31 mai 2011, 11:38:55 (UTC+0200) 1306835728 END 1.446 : mardi 31 mai 2011, 11:55:28 (UTC+0200) -1310344505 BEGIN 1.452 : lundi 11 juillet 2011, 02:35:05 (UTC+0200) -1310345745 BEGIN 1.452 : lundi 11 juillet 2011, 02:55:45 (UTC+0200) 1310345934 BEGIN 1.452 : lundi 11 juillet 2011, 02:58:54 (UTC+0200) 1310346470 END 1.452 : lundi 11 juillet 2011, 03:07:50 (UTC+0200) 1310657415 BEGIN 1.452 : jeudi 14 juillet 2011, 17:30:15 (UTC+0200) @@ -102,7 +88,6 @@ 1314168142 END 1.456 : mercredi 24 août 2011, 08:42:22 (UTC+0200) 1314171749 BEGIN 1.456 : mercredi 24 août 2011, 09:42:29 (UTC+0200) 1314173017 END 1.456 : mercredi 24 août 2011, 10:03:37 (UTC+0200) -1321108837 BEGIN 1.462 : samedi 12 novembre 2011, 15:40:37 (UTC+0100) 1321129414 BEGIN 1.462 : samedi 12 novembre 2011, 21:23:34 (UTC+0100) 1321130650 END 1.462 : samedi 12 novembre 2011, 21:44:10 (UTC+0100) 1321176819 BEGIN 1.463 : dimanche 13 novembre 2011, 10:33:40 (UTC+0100) @@ -121,7 +106,6 @@ 1326001199 END 1.480 : dimanche 8 janvier 2012, 06:39:59 (UTC+0100) 1326006966 BEGIN 1.480 : dimanche 8 janvier 2012, 08:16:06 (UTC+0100) 1326008395 END 1.480 : dimanche 8 janvier 2012, 08:39:55 (UTC+0100) -1328570342 BEGIN 1.483 : mardi 7 février 2012, 00:19:02 (UTC+0100) 1328579636 BEGIN 1.484 : mardi 7 février 2012, 02:53:56 (UTC+0100) 1328582268 END 1.484 : mardi 7 février 2012, 03:37:48 (UTC+0100) 1328612115 BEGIN 1.484 : mardi 7 février 2012, 11:55:15 (UTC+0100) @@ -136,7 +120,6 @@ 1334512816 END 1.488 : dimanche 15 avril 2012, 20:00:16 (UTC+0200) 1342519040 BEGIN 1.497 : mardi 17 juillet 2012, 11:57:20 (UTC+0200) 1342520082 END 1.497 : mardi 17 juillet 2012, 12:14:42 (UTC+0200) -1342795821 BEGIN 1.498 : vendredi 20 juillet 2012, 16:50:21 (UTC+0200) 1342796692 BEGIN 1.498 : vendredi 20 juillet 2012, 17:04:52 (UTC+0200) 1342796879 END 1.498 : vendredi 20 juillet 2012, 17:07:59 (UTC+0200) 1342797789 END 1.498 : vendredi 20 juillet 2012, 17:23:09 (UTC+0200) @@ -188,11 +171,8 @@ 1366592337 END 1.538 : lundi 22 avril 2013, 02:58:57 (UTC+0200) 1367829058 BEGIN 1.542 : lundi 6 mai 2013, 10:30:58 (UTC+0200) 1367829799 END 1.542 : lundi 6 mai 2013, 10:43:19 (UTC+0200) -1369002420 BEGIN 1.542 : lundi 20 mai 2013, 00:27:00 (UTC+0200) 1369002592 BEGIN 1.542 : lundi 20 mai 2013, 00:29:52 (UTC+0200) 1369003347 END 1.542 : lundi 20 mai 2013, 00:42:27 (UTC+0200) -1369004592 BEGIN 1.542 : lundi 20 mai 2013, 01:03:12 (UTC+0200) -1369005205 BEGIN 1.542 : lundi 20 mai 2013, 01:13:25 (UTC+0200) 1369007256 BEGIN 1.542 : lundi 20 mai 2013, 01:47:36 (UTC+0200) 1369007618 END 1.542 : lundi 20 mai 2013, 01:53:38 (UTC+0200) 1369008471 BEGIN 1.542 : lundi 20 mai 2013, 02:07:51 (UTC+0200) @@ -223,3 +203,14 @@ 1372851958 END 1.547 : mercredi 3 juillet 2013, 13:45:58 (UTC+0200) 1372852860 BEGIN 1.547 : mercredi 3 juillet 2013, 14:01:00 (UTC+0200) 1372853599 END 1.547 : mercredi 3 juillet 2013, 14:13:19 (UTC+0200) +1374244772 BEGIN 1.551 : vendredi 19 juillet 2013, 16:39:32 (UTC+0200) +1374245570 END 1.551 : vendredi 19 juillet 2013, 16:52:50 (UTC+0200) +1374459974 BEGIN 1.554 : lundi 22 juillet 2013, 04:26:14 (UTC+0200) +1374460797 END 1.554 : lundi 22 juillet 2013, 04:39:57 (UTC+0200) +1374461464 BEGIN 1.554 : lundi 22 juillet 2013, 04:51:04 (UTC+0200) +1374462214 END 1.554 : lundi 22 juillet 2013, 05:03:34 (UTC+0200) +1374579832 BEGIN 1.555 : mardi 23 juillet 2013, 13:43:52 (UTC+0200) +1374579895 BEGIN 1.555 : mardi 23 juillet 2013, 13:44:55 (UTC+0200) +1374581003 END 1.555 : mardi 23 juillet 2013, 14:03:23 (UTC+0200) +1374582566 BEGIN 1.555 : mardi 23 juillet 2013, 14:29:26 (UTC+0200) +1374583297 END 1.555 : mardi 23 juillet 2013, 14:41:37 (UTC+0200) diff --git a/W/learn/dbfile b/W/learn/dbfile index d8bbc1b..2cadcd1 100755 --- a/W/learn/dbfile +++ b/W/learn/dbfile @@ -13,7 +13,7 @@ my $X = tie %hash, 'DB_File', 'test_dbfile.db' ; print ( scalar keys %hash, "\n" ) ; -exit ; +#exit ; for my $num ( 0 .. 255 ) { print "$num\n" ; diff --git a/W/learn/test_dbmdeep.db b/W/learn/test_dbmdeep.db new file mode 100644 index 0000000000000000000000000000000000000000..fec85008100546f7262e9282e651dc8661d51e42 GIT binary patch literal 1922913 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%0D)#k6ay43pfYXtX2xJUo5=wE~WHRxZ1{x#@d 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%0D_sw7Qe$x8$ zeg^kB+pk6cTJ*0)|625~L;pJTuS5Sj^nZZ<577Ss`aeMbhvpBxe;)?@gZqz<%wP0T z()#mJ2KPDJuSfrS^sh(%dh~BV{|5ALK>r5xe~kW*(f={}KSuv2<`2Dpp9KAb`;Sk} zU-W6x`txZ9_c_~dME^$gZ$$q_^lw7{CiHJY|0eW*hW^jc{~7u}L;vUI550e%2mOQl zk1xz$^hMJ8^F;>tIooeW|7P@WM*n8?Z$bYS^lw4`7W99K{x8x0CHlWaf6n}&_b(Up z5AHv{GJnxmN$by78QkY=zZLyk(Z3b_ThX6Ke;)mL^ykt4HTu6s|JUgM8vWmxKlJ{6 z6Z8-6KMLkADkQBxg$(X;SZRp>I{%z>rj{fcF-;Vz6=>Hb|-=hCp^nZ)~@5~>1 z|Go?Q2lpS}o4@G$r1j_f4DNHb-+}%e=-+|<9q8YQ{+;OGiT<7F{{j6!p#KN-|A77< z%^!OIehm5t_a8r*zv!o=_2;Jy?sK-^h5lXW--Z5N=--Y0-RR$q{@v*R8T~(_|7Z07 zjQ(HDAA0|O$+c?I2<|_AHGk2sN$bzA8QkY=zX$z$(7y-$d(giZ{d>{B7yWzD{~P*$ zL;r8+{|)`Wn?Lma{T}oW?mzx8f6*UF>(3t<+~;h+5B>YlzYqQU(7zx3`_aE2{rl1X zC;I&i3WeUmpGC z(O(|@70_P+{T0w(0sR%xUlIKk(O(h$hnYY0{v8(duk`mHk;Ba&IXr3oIXr{=ob4;2 zzY_W@p}!LPE2FgcbI{_5yI4*kcW|2Xs?hyLTuAA0|e5BgX7`;SPG z`6ES1>rYVz_c_}~&>um61pN{8N6{Zee-!;u^vBR2Lw^kYG4#jHAA0}dLH|mB{}CxR zf225R{VC4iK4<#``V;6+pg)2B8tAWq{u=17f&QB4uZjMe=&y ze?(3+f8@lZ_2+N=s(H)q4)2k zpns*m|A?Gy{>aHm>(9v<+~;gx7yWh7Ul;v#(O(b!_0V4r{q@j)3i?k$|0(D{1^uU* zKlJ{c8uYL9_aBkd%pW-|Y5h4ZgZrHA>!ZIu`s<^=KKdJ=zXAFipuYk78=}7<`WvFZ zA^IDcKlJ`J3i?<2`;SOt^G6ydtv`)3xX;ew z*644I{?_O}-Ta~V@ARO5aQ|_J`6Fi}tv_dEaG$e%8}zq9e;f3-L4RBHw?%(j^tVNS zJM_0he>?QIL;soP550e92K|HkkF(4lIV)-XIV*$vobB7AzdicfqrW}+JD|S<`a7V% z1Nu9nza#oPqQ4{hJDET9{&foa2lpRmn?G`P()x3D2KPDJcSe6_^mj&oXY_YLe;4$3 zL4OzYcSV0!^mj#nSM;A_{?Pk(PS8KN|2WtDk#m#QpK~*~&)L2k`n#dO8~VGUzdQQ7 zqrW@)yQ9Ac`g@?i2l{)Uzo+>_?_bZLe{lbCp7|r^C9OZ_WpJOfeJ}L)LVqvx_den-yi+`(cd5a{n3A+`9tsDg+c$|{^KI^M=nZQe=f@4K4<%j(SI@e zFGl~x=ue_QiT)(|ljt9S{sHJ8fc^pKzr_5Z_wSORe{lbiGJhnMwEm5Aa=pWpFTyFlzG4f?M^{|NMtK>rBzk3j!O^p8aUNc4|H|Fz~1y?@sR{e%0D>&zdyE@}O_ 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%0DU(Fx;HEsR*HH-U# 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 G?|%T8fmvJt literal 0 HcmV?d00001 diff --git a/W/test3.bat b/W/test3.bat index 99e1bef..d434ebf 100644 --- a/W/test3.bat +++ b/W/test3.bat @@ -1,16 +1,8 @@ -REM $Id: test3.bat,v 1.2 2013/05/22 10:09:27 gilles Exp gilles $ -cd /D %~dp0 +cd C:\msys\1.0\home\Admin\imapsync -REM ./imapsync.exe --modules_version +.\imapsync.exe --host1 p --user1 toto --passfile1 secret.toto --host2 p --user2 titi --passfile2 secret.titi --ssl1 --ssl2 --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 -perl .\imapsync --host1 imap.gmail.com --ssl1 --user1 gilles.lamiral@gmail.com --passfile1 secret.gilles_gmail ^ - --host2 imap.gmail.com --ssl2 --user2 gilles.lamiral@gmail.com --passfile2 secret.gilles_gmail ^ - --folder INBOX --dry - -PAUSE - -.\imapsync.exe --host1 imap.gmail.com --ssl1 --user1 gilles.lamiral@gmail.com --passfile1 secret.gilles_gmail ^ - --host2 imap.gmail.com --ssl2 --user2 gilles.lamiral@gmail.com --passfile2 secret.gilles_gmail ^ - --folder INBOX --dry diff --git a/W/test3_gmail.bat b/W/test3_gmail.bat new file mode 100644 index 0000000..99e1bef --- /dev/null +++ b/W/test3_gmail.bat @@ -0,0 +1,16 @@ + +REM $Id: test3.bat,v 1.2 2013/05/22 10:09:27 gilles Exp gilles $ + +cd /D %~dp0 + +REM ./imapsync.exe --modules_version + +perl .\imapsync --host1 imap.gmail.com --ssl1 --user1 gilles.lamiral@gmail.com --passfile1 secret.gilles_gmail ^ + --host2 imap.gmail.com --ssl2 --user2 gilles.lamiral@gmail.com --passfile2 secret.gilles_gmail ^ + --folder INBOX --dry + +PAUSE + +.\imapsync.exe --host1 imap.gmail.com --ssl1 --user1 gilles.lamiral@gmail.com --passfile1 secret.gilles_gmail ^ + --host2 imap.gmail.com --ssl2 --user2 gilles.lamiral@gmail.com --passfile2 secret.gilles_gmail ^ + --folder INBOX --dry diff --git a/build_exe.bat b/build_exe.bat index bfc98a7..bacbd4f 100644 --- a/build_exe.bat +++ b/build_exe.bat @@ -1,5 +1,5 @@ -REM $Id: build_exe.bat,v 1.17 2013/07/03 04:13:30 gilles Exp gilles $ +REM $Id: build_exe.bat,v 1.18 2013/07/23 11:27:50 gilles Exp gilles $ @ECHO OFF ECHO Building imapsync.exe @@ -8,7 +8,7 @@ CALL .\examples\install_modules.bat cd /D %~dp0 -perl -mMail::IMAPClient -mIO::Socket -mIO::Socket::SSL ^ +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 ^ diff --git a/examples/install_modules.bat b/examples/install_modules.bat index 880ca6d..9a432f8 100644 --- a/examples/install_modules.bat +++ b/examples/install_modules.bat @@ -1,5 +1,5 @@ -REM $Id: install_modules.bat,v 1.5 2013/07/03 12:00:23 gilles Exp gilles $ +REM $Id: install_modules.bat,v 1.6 2013/07/23 11:30:58 gilles Exp gilles $ @ECHO OFF @@ -12,7 +12,7 @@ IF ERRORLEVEL 1 ECHO Perl needed. Install Strawberry Perl. Get it at http://stra REM perl is there -FOR %%M in ( IO::Socket ^ +FOR %%M in ( IO::Socket IO::Socket::IP ^ Net::SSLeay IO::Socket::SSL ^ Digest::MD5 Digest::HMAC_MD5 ^ Term::ReadKey File::Spec ^ diff --git a/imapsync b/imapsync index a4f3e6e..a218a35 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.547 $ +$Revision: 1.555 $ =head1 SYNOPSIS @@ -393,8 +393,8 @@ Success stories reported with the following 53 imap servers - 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] + - 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 @@ -534,7 +534,7 @@ Entries for imapsync: Feedback (good or bad) will often be welcome. -$Id: imapsync,v 1.547 2013/07/03 01:24:34 gilles Exp gilles $ +$Id: imapsync,v 1.555 2013/07/23 11:41:10 gilles Exp gilles $ =cut @@ -552,7 +552,7 @@ use Digest::HMAC_SHA1 qw( hmac_sha1 ) ; #use Term::ReadKey; #use IO::Socket::SSL; use MIME::Base64; -use English; +use English '-no_match_vars' ; use File::Basename; use POSIX qw(uname SIGALRM); use Fcntl; @@ -564,17 +564,10 @@ use File::Glob qw( :glob ) ; use IO::File; use Time::Local ; use Time::HiRes qw( time ) ; -use Test::More 'no_plan'; +use Test::More 'no_plan' ; +use IPC::Open3 'open3' ; #use Unix::Sysexits ; -use constant { - Unconnected => 0, - Connected => 1, # connected; not logged in - Authenticated => 2, # logged in; no mailbox selected - Selected => 3, # mailbox selected -}; - - # global variables my( @@ -588,11 +581,10 @@ my( @folder, @include, @exclude, @folderrec, $prefix1, $prefix2, @regextrans2, @regexmess, @regexflag, - $flagsCase, $filterflags, + $flagsCase, $filterflags, $syncflagsaftercopy, $sep1, $sep2, $syncinternaldates, $idatefromheader, - $usedatemanip, $syncacls, $fastio1, $fastio2, $maxsize, $minsize, $maxage, $minage, @@ -626,14 +618,14 @@ my( $h1_bytes_processed, $h1_nb_msg_processed, - $h1_nb_msg_start, $h1_bytes_start, + $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, $timediff, - $timesize, $timebefore, + $timestart, $timestart_int, $timeend, + $timebefore, $ssl1, $ssl2, $tls1, $tls2, $uid1, $uid2, @@ -659,13 +651,16 @@ my( $abletosearch, $showpasswords, $fixslash2, + $messageidnodomain, + $fixInboxINBOX, + $maxlinelength, ); # main program # global variables initialisation -$rcs = '$Id: imapsync,v 1.547 2013/07/03 01:24:34 gilles Exp gilles $ '; +$rcs = '$Id: imapsync,v 1.555 2013/07/23 11:41:10 gilles Exp gilles $ '; $total_bytes_transferred = 0; $total_bytes_skipped = 0; @@ -678,7 +673,7 @@ $h1_nb_msg_noheader = $h2_nb_msg_noheader = 0; $h1_total_bytes_duplicate = $h2_total_bytes_duplicate = 0; -$h1_nb_msg_start = $h1_bytes_start = 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 ; @@ -703,10 +698,10 @@ my %month_abrev = ( Dec => 11, ); -unless( defined( &EX_USAGE ) ) { +sub EX_USAGE { # 64 on my linux box. # See http://search.cpan.org/~jmates/Unix-Sysexits-0.02/lib/Unix/Sysexits.pm - eval { sub EX_USAGE { 64 ; } } ; + return( 64 ) ; } @@ -716,7 +711,7 @@ my @argv_copy = @ARGV; get_options(); # $SIG{ INT } = \&catch_continue ; -$SIG{ INT } = \&catch_exit ; +local $SIG{ INT } = local $SIG{ QUIT } = local $SIG{ TERM } = \&catch_exit ; $timestart = time( ); $timestart_int = int( $timestart ) ; @@ -749,6 +744,13 @@ $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 ; @@ -770,6 +772,7 @@ $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 ) ) ) ; @@ -783,7 +786,7 @@ write_pidfile($pidfile) if ($pidfile); $modules_version and print "Modules version list:\n", modules_VERSION(), "\n"; check_lib_version() or - die "imapsync needs perl lib Mail::IMAPClient release 3.25 or superior \n"; + croak "imapsync needs perl lib Mail::IMAPClient release 3.25 or superior \n"; exit_clean(0) if ($justbanner); @@ -835,16 +838,16 @@ if ($delete) { } } -if ( $uidexpunge2 and ! Mail::IMAPClient->can( 'uidexpunge' ) ) { +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 and ! defined( $uidexpunge2 ) ) { +if ( $delete2 and not defined( $uidexpunge2 ) ) { if ( Mail::IMAPClient->can( 'uidexpunge' ) ) { print "Info: will act as --uidexpunge2\n" ; $uidexpunge2 = 1 ; - }elsif ( ! defined( $expunge2 ) ) { + }elsif ( not defined( $expunge2 ) ) { print "Info: will act as --expunge2 (no uidexpunge support)\n" ; $expunge2 = 1 ; } @@ -921,14 +924,14 @@ $reconnectretry2 = (defined($reconnectretry2)) ? $reconnectretry2 : 3; my %useheader ; # Make a hash %useheader of each --useheader 'key' in uppercase -@useheader{ map( { uc( $_ ) } @useheader ) } = ( ) ; +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"; +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 = ask_for_password( $authuser1 || $user1, $host1 ) ; @@ -949,22 +952,33 @@ $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); + $proxyauth1, $uid1, $split1, 'Host1'); $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); + $proxyauth2, $uid2, $split2, 'Host2'); $debug and print "Host1 Buffer I/O: ", $imap1->Buffer(), "\n"; @@ -993,21 +1007,26 @@ my ( @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, %h2_folders_from_1_all, +%h2_folders_from_1_all, ); # Make a hash of subscribed folders in both servers. -map { $h1_subscribed_folder{ $_ } = 1 } $imap1->subscribed( ); -map { $h2_subscribed_folder{ $_ } = 1 } $imap2->subscribed( ); +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(); -map { $h1_folders_all{$_} = 1} @h1_folders_all; -map { $h2_folders_all{$_} = 1} @h2_folders_all; +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 @@ -1036,20 +1055,20 @@ else { # consider (optional) includes and excludes -if (scalar(@include)) { - foreach my $include (@include) { - my @included_folders = grep /$include/, @h1_folders_all; - add_to_requested_folders(@included_folders); - print "Including folders matching pattern '$include': @included_folders\n"; +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/, @requested_folder; - remove_from_requested_folders(@excluded_folders); - print "Excluding folders matching pattern '$exclude': @excluded_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" ; } } @@ -1112,11 +1131,10 @@ foreach my $h1_fold (@h1_folders_all) { $h2_fold = imap2_folder_name($h1_fold); $h2_folders_from_1_all{$h2_fold}++; } -#@h2_folders_from_1_all = sort keys(%h2_folders_from_1_all); if ( $foldersizes ) { - ( $h1_nb_msg_start, $h1_bytes_start ) = foldersizes( "Host1", $imap1, $search1, @h1_folders_wanted ) ; + ( $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 ) ; } @@ -1126,19 +1144,19 @@ 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"; + "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" + 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"; + map( { "[$_]\n" } @h2_folders_not_in_1 ), "\n" ; delete_folders_in_2_not_in_1() if $delete2folders; @@ -1181,7 +1199,8 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { #print "%%% @select_results\n" ; my $permanentflags2 = permanentflags( @select_results ) ; - $debug and print "permanentflags: $permanentflags2\n" ; + ( $debug or $debugflags ) and print "permanentflags: $permanentflags2\n" ; + if ( $expunge or $expunge1 ){ print "Expunging host1 $h1_fold $dry_message\n" ; unless($dry) { $imap1->expunge() } ; @@ -1190,7 +1209,7 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { } if ( ( ( $subscribe and exists $h1_subscribed_folder{ $h1_fold } ) or $subscribe_all ) - and ! exists $h2_subscribed_folder{ $h2_fold } ) { + and not exists( $h2_subscribed_folder{ $h2_fold } ) ) { print "Subscribing to folder $h2_fold on destination server\n" ; unless( $dry ) { $imap2->subscribe( $h2_fold ) } ; } @@ -1369,20 +1388,6 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { my @h2_hash_keys_sorted_by_uid = sort {$h2_hash{$a}{'m'} <=> $h2_hash{$b}{'m'}} keys(%h2_hash); - if ( 0 ) { - # What the hell was this code written for? - # hashes, keys are uid, values are the internaldates in epoch (best format to compare dates) - my %h1_epoch ; - my %h2_epoch ; - @h1_epoch{ @h1_msgs } = map( { epoch( $h1_fir_ref->{ $_ }->{ 'INTERNALDATE' } ) } @h1_msgs ) ; - @h2_epoch{ @h2_msgs } = map( { epoch( $h2_fir_ref->{ $_ }->{ 'INTERNALDATE' } ) } @h2_msgs ) ; - #print keyval( %h1_epoch ) ; - #print keyval( %h2_epoch ) ; - my $h1_greatest_epoch = max( values %h1_epoch ) ; - print "h1_greatest_epoch $h1_greatest_epoch\n" ; - } - - #next FOLDER ; if( $delete2duplicates and not exists( $h2_folders_from_1_several{ $h2_fold } ) ) { my @h2_expunge ; @@ -1414,7 +1419,7 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { 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/ ? 1 : 0; + 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; @@ -1450,7 +1455,7 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { 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/ ? 1 : 0 ; + 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 }++ ; @@ -1535,14 +1540,14 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { if ( $usecache ) { $debugcache and print "touch $cache_dir/${h1_msg}_$h2_msg\n" ; touch( "$cache_dir/${h1_msg}_$h2_msg" ) - or die( "Couldn't 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( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; + 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'}; @@ -1566,7 +1571,7 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { 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( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; + 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; @@ -1600,6 +1605,7 @@ FOLDER: foreach my $h1_fold ( @h1_folders_wanted ) { $debug and print "Time: ", timenext(), " s\n"; } + sub total_bytes_max_reached { return( 0 ) if not $exitwhenover ; @@ -1610,59 +1616,6 @@ sub total_bytes_max_reached { } -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 { - my ( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) = @_ ; - $debug and print "Host1 flags $h1_fold/$h1_msg -> Host2 $h2_fold/$h2_msg\n"; - - 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" } || '' ; - - ( $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" ; - - # RFC 2060: This flag can not be altered by any client - $h1_flags =~ s@\\Recent\s?@@gi ; - $h1_flags = flags_regex( $h1_flags ) if @regexflag; - $h1_flags = flagsCase( $h1_flags ) if $flagsCase ; - $h1_flags = flags_filter( $h1_flags, $permanentflags2) if ( $permanentflags2 and $filterflags ) ; - - # 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 = 1 ; - ( $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" ; - $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 ( ! $dry and $diff and ! $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++; - } -} - print "++++ End looping on each folder\n"; $debug and print "Time: ", timenext(), " s\n"; @@ -1687,16 +1640,89 @@ exit_clean( 0 ) ; # 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 ) ; + + ( $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 ( ! $debug and $len > $sz*2 ) { + 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$//; + $str =~ s/\012?\015$//x; return "(len=$len) " . $str; } @@ -1722,22 +1748,24 @@ sub lost_connection { } sub max { - return(undef) if (0 == scalar(@_)); - my @sorted = sort { $a <=> $b } @_; - return(pop(@sorted)); + 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(! 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"); + 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 { @@ -1760,8 +1788,8 @@ sub check_lib_version { } sub module_version_str { - my( $module, $version ) = @_ ; - my $str = sprintf( "%-20s %s\n", $module, $version ) ; + my( $module_name, $module_version ) = @_ ; + my $str = sprintf( "%-20s %s\n", $module_name, $module_version ) ; return( $str ) ; } @@ -1821,14 +1849,14 @@ sub modules_VERSION { # Construct a command line copy with passwords replaced by MASKED. sub command_line_nopassword { - my @argv_copy = @_; + my @argv = @_; my @argv_nopassword; - return("@argv_copy") if $showpasswords ; - while (@argv_copy) { - my $arg = shift(@argv_copy); # option name or value - if ($arg =~ m/-password[12]/) { - shift(@argv_copy); # password value + 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 @@ -1852,7 +1880,7 @@ sub tests_command_line_nopassword { 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 { @@ -1871,25 +1899,27 @@ sub catch_exit { 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, $debugimap, $ssl, $tls) = @_; + my($host, $port, $mydebugimap, $ssl, $tls) = @_; my $imap = Mail::IMAPClient->new(); $imap->Ssl($ssl) if ($ssl); $imap->Tls($tls) if ($tls); $imap->Server($host); $imap->Port($port); - $imap->Debug($debugimap); + $imap->Debug($mydebugimap); $imap->connect() - or die_clean("Can not open imap connection on [$host]: $@\n"); + 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] ; @@ -1899,9 +1929,7 @@ sub connect_imap { } sub justconnect { - my $imap1 = (); - my $imap2 = (); - + $imap1 = connect_imap($host1, $port1, $debugimap1, $ssl1, $tls1); print "Host1 software: ", server_banner($imap1); print "Host1 capability: ", join(" ", $imap1->capability()), "\n"; @@ -1910,7 +1938,7 @@ sub justconnect { print "Host2 capability: ", join(" ", $imap2->capability()), "\n"; $imap1->logout(); $imap2->logout(); - + return( ) ; } sub relogin1 { @@ -1922,6 +1950,7 @@ sub relogin1 { $proxyauth1, $uid1, $split1) ; $relogin1-- if ( $relogin1 ) ; + return( ) ; } sub relogin2 { @@ -1933,12 +1962,13 @@ sub relogin2 { $proxyauth2, $uid2, $split2) ; $relogin2-- if ( $relogin2 ) ; + return( ) ; } sub relogin_imap { my($imap, $host, $port, $user, $domain, $password, - $debugimap, $timeout, $fastio, + $mydebugimap, $mytimeout, $fastio, $ssl, $tls, $authmech, $authuser, $reconnectretry, $proxyauth, $uid, $split) = @_; @@ -1946,7 +1976,7 @@ sub relogin_imap { $imap->logout( ) ; $imap = login_imap( $host, $port, $user, $domain, $password, - $debugimap, $timeout, $fastio, + $mydebugimap, $mytimeout, $fastio, $ssl, $tls, $authmech, $authuser, $reconnectretry, $proxyauth, $uid, $split ) ; @@ -1954,81 +1984,68 @@ sub relogin_imap { return( $imap ) ; } -sub login_imap { - my($host, $port, $user, $domain, $password, - $debugimap, $timeout, $fastio, - $ssl, $tls, $authmech, $authuser, $reconnectretry, - $proxyauth, $uid, $split ) = @_; - my ($imap); - - $imap = Mail::IMAPClient->new(); - - $imap->Ssl($ssl) if ($ssl); - $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($debugimap); - $timeout and $imap->Timeout($timeout); - $imap->Reconnectretry($reconnectretry) if ($reconnectretry); +sub login_imap { + + my @allargs = @_ ; + my($host, $port, $user, $domain, $password, + $mydebugimap, $mytimeout, $fastio, + $ssl, $tls, $authmech, $authuser, $reconnectretry, + $proxyauth, $uid, $split, $Side ) = @allargs ; + + my $side = lc( $Side ) ; + my $imap = init_imap( @allargs ) ; $imap->connect() - or die_clean("Failure: can not open imap connection on [$host] with user [$user]: $@\n"); - - print "Banner: ", server_banner($imap); + 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("Info: Assuming PREAUTH for host %s\n", $imap->Server ) ; + printf("%s: Assuming PREAUTH for %s\n", $Side, $imap->Server ) ; }else{ - die_clean( "Failure: error login on [$host] with user [$user] auth [PREAUTH]" ) ; + die_clean( "Failure: error login on $side [$host] with user [$user] auth [PREAUTH]" ) ; } } $imap->starttls( ) if ( $imap->Tls( ) ) ; - $imap->Ignoresizeerrors( $allowsizemismatch ) ; - - if ($imap->has_capability("AUTH=$authmech") - or $imap->has_capability($authmech) - ) { - printf("Info: host %s says it has CAPABILITY for AUTHENTICATE %s\n", - $imap->Server, $authmech); - } - else { - printf("Info: host %s says it has NO CAPABILITY for AUTHENTICATE %s\n", - $imap->Server, $authmech); - if ($authmech eq 'PLAIN') { - print "Info: frequently PLAIN is only supported with SSL, ", - "try --ssl or --tls options\n"; - } - } + authenticate_imap( $imap, @allargs ) ; - if ($proxyauth) { - $imap->Authmechanism(""); + 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"; + $imap->Authcallback(\&xoauth) if $authmech eq "XOAUTH" ; + $imap->Authcallback(\&plainauth) if $authmech eq "PLAIN" ; - if ($proxyauth) { - $imap->User($authuser) ; - } else { - $imap->User($user) ; - } - $imap->Domain($domain) if (defined($domain)); - $imap->Authuser($authuser); - $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" ; @@ -2055,12 +2072,61 @@ sub login_imap { } } - $split and $imap->Maxcommandlength( 10 * $split ) ; - - print "Info: success login on [$host] with user [$user] auth [$authmech]\n" ; - return( $imap ) ; + 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 init_imap { + my($host, $port, $user, $domain, $password, + $mydebugimap, $mytimeout, $fastio, + $ssl, $tls, $authmech, $authuser, $reconnectretry, + $proxyauth, $uid, $split ) = @_ ; + + my ( $imap ) ; + + $imap = Mail::IMAPClient->new() ; + + $imap->Ssl($ssl) if ($ssl); + $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); + $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; @@ -2086,7 +2152,7 @@ sub xoauth { # 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(/@/, $imap->User); + 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 @@ -2152,46 +2218,47 @@ sub server_banner { sub banner_imapsync { - my @argv_copy = @_; + my @argv = @_ ; my $banner_imapsync = join("", '$RCSfile: imapsync,v $ ', - '$Revision: 1.547 $ ', - '$Date: 2013/07/03 01:24:34 $ ', + '$Revision: 1.555 $ ', + '$Date: 2013/07/23 11:41:10 $ ', "\n",localhost_info(), "\n", "Command line used:\n", - "$0 ", command_line_nopassword(@argv_copy), "\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 _); + return(1) if (-d $dir and -r _ and -w _) ; # Trying to create it - mkpath($dir) or die "Error creating tmpdir $tmpdir : $!"; - die "Error with tmpdir $tmpdir : $!" if not (-d $dir and -r _ and -w _); - return(1); + 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 $pidfile = shift ; + my $pid_filename = shift ; - print "PID file is $pidfile\n" ; - if ( -e $pidfile and $pidfilelocking ) { - print "$pidfile already exists, another imapsync may be curently running. Aborting imapsync.\n" ; + 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 $pidfile ) { - print "$pidfile already exists, overwriting it\n" ; + if ( -e $pid_filename ) { + print "$pid_filename already exists, overwriting it\n" ; } - my $PIDFILE ; - open( $PIDFILE, '>', $pidfile ) or do { - print "Could not open $pidfile for writing" ; + my $FILE_HANDLE ; + open( $FILE_HANDLE, '>', $pid_filename ) or do { + print "Could not open $pid_filename for writing" ; return ; } ; - print $PIDFILE $PROCESS_ID ; - close $PIDFILE ; + print $FILE_HANDLE $PROCESS_ID ; + close $FILE_HANDLE ; return( $PROCESS_ID ) ; } @@ -2203,17 +2270,63 @@ sub exit_clean { exit( $status ) ; } -sub die_clean { +sub die_clean { + my @messages = @_ ; unlink( $pidfile ) ; - die @_ ; + 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 ) ) { @@ -2244,21 +2357,21 @@ sub examine_folder { sub create_folder { - my( $imap2, $h2_fold, $h1_fold ) = @_ ; + my( $imap, $h2_fold, $h1_fold ) = @_ ; print "Creating folder [$h2_fold] on host2\n"; if ( ( 'INBOX' eq uc( $h2_fold) ) - and ( $imap2->exists( $h2_fold ) ) ) { + and ( $imap->exists( $h2_fold ) ) ) { print "Folder [$h2_fold] already exists\n" ; return( 1 ) ; } if ( ! $dry ){ - if ( ! $imap2->create( $h2_fold ) ) { + if ( ! $imap->create( $h2_fold ) ) { print( "Couldn't create folder [$h2_fold] from [$h1_fold]: ", - $imap2->LastError( ), "\n" ); + $imap->LastError( ), "\n" ); $nb_errors++; # success if folder exists ("already exists" error) - return( 1 ) if $imap2->exists( $h2_fold ) ; + return( 1 ) if $imap->exists( $h2_fold ) ; # failure since create failed return( 0 ); }else{ @@ -2274,44 +2387,45 @@ sub create_folder { sub tests_folder_routines { - ok( !is_requested_folder('folder_foo') ); - ok( add_to_requested_folders('folder_foo') ); - ok( is_requested_folder('folder_foo') ); - ok( !is_requested_folder('folder_NO_EXIST') ); - ok( !remove_from_requested_folders('folder_foo'), "removed folder_foo"); - ok( !is_requested_folder('folder_foo') ); - my @f; - ok( @f = add_to_requested_folders('folder_bar', 'folder_toto'), "add result: @f"); - ok( is_requested_folder('folder_bar') ); - ok( is_requested_folder('folder_toto') ); - ok( remove_from_requested_folders('folder_toto') ); - ok( !is_requested_folder('folder_toto') ); + 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 ) = @_; - defined( $requested_folder{ $folder } ); + return( defined( $requested_folder{ $folder } ) ) ; } sub add_to_requested_folders { - my @wanted_folders = @_; + my @wanted_folders = @_ ; foreach my $folder ( @wanted_folders ) { - ++$requested_folder{ $folder }; + ++$requested_folder{ $folder } ; } - return( keys( %requested_folder ) ); + return( keys( %requested_folder ) ) ; } sub remove_from_requested_folders { - my @wanted_folders = @_; + my @wanted_folders = @_ ; foreach my $folder (@wanted_folders) { - delete $requested_folder{$folder}; + delete $requested_folder{$folder} ; } - return( keys(%requested_folder) ); + return( keys( %requested_folder ) ) ; } sub compare_lists { @@ -2342,10 +2456,10 @@ sub compare_lists { return $balance; } # each element equal until last indice of list_1 - return -1 if ($last_used_indice < $#$list_2_ref); + return -1 if ($last_used_indice < $#$list_2_ref) ; # same size, each element equal - return 0 + return 0 ; } sub tests_compare_lists { @@ -2395,33 +2509,35 @@ sub tests_compare_lists { 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); + 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 "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); + $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); + $imap->Server( ),"\n", + help_to_guess_prefix( $imap, $prefix_opt ) ; + exit_clean( 1 ) ; } + return( ) ; } @@ -2431,74 +2547,97 @@ sub get_separator { if ( defined( $sep_in ) ) { - print "Using [$sep_in] given by $sep_opt\n"; - $sep_out = $sep_in; - return($sep_out); + 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; + $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); + exit_clean( 1 ) ; } else{ print "No NAMESPACE capability in imap server ", $imap->Server(),"\n", - help_to_guess_sep($imap, $sep_opt); - exit_clean(1); + help_to_guess_sep( $imap, $sep_opt ) ; + exit_clean( 1 ) ; } + return( ) ; } sub help_to_guess_sep { - my($imap, $sep_opt) = @_; + my( $imap, $sep_opt ) = @_ ; - my $help = "Give the separator character with the $sep_opt option,\n" + 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"; + . "so try $sep_opt . or $sep_opt /\n" ; - return($help); + return( $help_to_guess_sep ) ; } sub help_to_guess_prefix { - my($imap, $prefix_opt) = @_; + my( $imap, $prefix_opt ) = @_ ; - my $help = "Give the prefix namespace with the $prefix_opt option,\n" + 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) + . 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); + return( $help_to_guess_prefix ) ; } sub folders_list_to_help { - my($imap) = @_; + my($imap) = @_ ; - my @folders = $imap->folders; - my $listing = join('', map { "[$_]\n" } @folders); - return $listing; - + my @folders = $imap->folders ; + my $listing = join('', map { "[$_]\n" } @folders) ; + return( $listing ) ; } -sub separator_invert { - # The separator we hope we'll never encounter: 00000000 + +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($h1_fold, $h1_sep, $h2_sep) = @_ ; - my $h2_fold = $h1_fold ; - $h2_fold =~ s@\Q$h2_sep@$o_sep@g ; - $h2_fold =~ s@\Q$h1_sep@$h2_sep@g ; - $h2_fold =~ s@\Q$o_sep@$h1_sep@g ; - $h2_fold =~ s,/,_,g if( $fixslash2 and '/' ne $h2_sep and '/' eq $h1_sep ) ; + $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 ) ; } @@ -2509,12 +2648,13 @@ $h1_prefix = $h2_prefix = ''; $h1_sep = '/'; $h2_sep = '.'; -$debug and print -"prefix1: [$h1_prefix] +$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'); @@ -2522,6 +2662,7 @@ 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]'); @@ -2543,6 +2684,7 @@ 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 = '/'; @@ -2552,69 +2694,76 @@ 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 -> 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 ($h2_fold); - my ($x_fold) = @_; + my ( $x_fold ) = @_ ; + my ( $h2_fold ) ; # first we remove the prefix - $x_fold =~ s/^\Q$h1_prefix\E//; + $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$/i)); + 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; - eval("\$h2_fold =~ $regextrans2"); - $debug and print "[$h2_fold_before] -> [$h2_fold] using re [$regextrans2]\n"; - die_clean("error: eval regextrans2 '$regextrans2': $@\n") if $@; + 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' ) ; - my( $left, $right ) ; 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, $right ) ; + my( $left_part, $right_part ) ; - ( $left, $right ) = $regex =~ m#^s/((?:[^/]|\\/)+)/((?:[^/]|\\/)+)/#; - return( '', '' ) if not $left ; - return( $left, $right ) ; + ( $left_part, $right_part ) = $regex =~ m{^s/((?:[^/]|\\/)+)/((?:[^/]|\\/)+)/}x; + return( '', '' ) if not $left_part ; + return( $left_part, $right_part ) ; } - - sub foldersizes { - my ( $side, $imap, $search, @folders ) = @_ ; + my ( $side, $imap, $search_cmd, @folders ) = @_ ; my $total_size = 0 ; my $total_nb = 0 ; - my $biggest = 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 ! exists( $h2_folders_all{ $folder } ) ) { + if ( 'Host2' eq $side and not exists( $h2_folders_all{ $folder } ) ) { print(" does not exist yet\n") ; next ; } - if ( 'Host1' eq $side and ! exists( $h1_folders_all{ $folder } ) ) { + if ( 'Host1' eq $side and not exists( $h1_folders_all{ $folder } ) ) { print( " does not exist\n" ) ; next ; } @@ -2628,9 +2777,9 @@ sub foldersizes { } my $hash_ref = { } ; - my @msgs = select_msgs( $imap, undef, $search ) ; + my @msgs = select_msgs( $imap, undef, $search_cmd ) ; $nb_msgs = scalar( @msgs ) ; - my $smax = 0 ; + my $biggest_in_folder = 0 ; @$hash_ref{ @msgs } = ( undef ) if @msgs ; if ( $nb_msgs > 0 and @msgs ) { if ( $abletosearch ) { @@ -2638,21 +2787,23 @@ sub foldersizes { }else{ $imap->fetch_hash( '1:999999', "RFC822.SIZE", $hash_ref ) or die_clean( "$@" ) ; } - #print map {$hash_ref->{$_}->{"RFC822.SIZE"}, " "} keys %$hash_ref ; - map { $stot += $hash_ref->{ $_ }->{ "RFC822.SIZE" } } keys %$hash_ref ; - $smax = max( map { $hash_ref->{ $_ }->{ "RFC822.SIZE" } } keys %$hash_ref ) ; - $biggest = max( $biggest, $smax ) ; + 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", $smax ) ; + 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, bytes_display_string( $biggest ) ) ; + 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 ) ; } @@ -2679,10 +2830,13 @@ sub timesince { sub tests_flags_regex { - my $string; + ok('' eq flags_regex(''), "flags_regex, null string ''"); ok('\Seen NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, nothing to do'); - ok('\Seen NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex,'); + + @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'); @@ -2722,9 +2876,9 @@ sub tests_flags_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/'"); + 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 *//"); + ok('REM REM REM REM REM ' eq flags_regex('REM REM REM REM REM jrdH8u'), "Keep only regex s/jrdH8u *//") ; @regexflag = ( 's/(.*)/$1 jrdH8u/', @@ -2776,24 +2930,27 @@ sub tests_flags_regex { 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"; - eval("\$h1_flags =~ $regexflag"); - die_clean("error: eval regexflag '$regexflag': $@\n") if $@; - $debugflags and print "regexflag $regexflag [$h1_flags_orig] -> [$h1_flags]\n"; + 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); + return( $h1_flags ) ; } sub acls_sync { - my($h1_fold, $h2_fold) = @_; - if ($syncacls) { + 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) @@ -2811,6 +2968,7 @@ sub acls_sync { } } } + return( ) ; } @@ -2828,21 +2986,23 @@ sub tests_permanentflags { 'permanentflags \Draft \Answered' ); ok('' eq permanentflags('Blabla'), 'permanentflags nothing'); + return( ) ; } sub permanentflags { my @lines = @_ ; foreach my $line (@lines) { - if ( $line =~ m{\[PERMANENTFLAGS \(([^)]+?)\)\]} ) { + if ( $line =~ m{\[PERMANENTFLAGS\s\(([^)]+?)\)\]}x ) { ( $debugflags or $debug ) and print "permanentflags: $line" ; my $permanentflags = $1 ; - if ( $permanentflags =~ m{\\\*} ) { + if ( $permanentflags =~ m{\\\*}x ) { $permanentflags = '' ; } return($permanentflags) ; - }; + } ; } + return( '' ) ; } sub tests_flags_filter { @@ -2855,25 +3015,25 @@ sub tests_flags_filter { 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, $allowed_flags ) = @_ ; - my @flags = split(/\s+/, $flags); - my %allowed_flags = map { $_ => 1 } split(' ', $allowed_flags ); - my @flags_out = map { exists $allowed_flags{$_} ? $_ : () } @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); + my $flags_out = join( ' ', @flags_out ) ; + #print "%%%$flags_out%%%\n" ; + return( $flags_out ) ; } sub flagsCase { my $flags = shift ; - my @flags = split( /\s+/, $flags ); + 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 ; @@ -2891,6 +3051,7 @@ sub tests_flagsCase { 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 { @@ -2914,18 +3075,19 @@ sub tests_ucsecond { 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 ) = @_ ; - my ( @msgs, @msgs_all, @max, @min, @union, @inter ) ; + my ( $imap, $msgs_all_hash_ref, $search_cmd ) = @_ ; + 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 ( ! defined( $maxage ) and ! defined( $minage ) and ! defined( $search ) ) + or ( not defined( $maxage ) and not defined( $minage ) and not defined( $search_cmd ) ) ) { if ( $abletosearch ) { $debugdev and print "Calling messages()\n" ; @@ -2942,15 +3104,25 @@ sub select_msgs { @{ $msgs_all_hash_ref }{ @msgs_all } = () ; } # return all messages - if ( ! defined( $maxage ) and ! defined( $minage ) and ! defined( $search ) ) { + if ( not defined( $maxage ) and not defined( $minage ) and not defined( $search_cmd ) ) { return( @msgs_all ) ; } } - if ( defined( $search ) ) { - @msgs = $imap->search( $search ) ; + 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_age { + my( $imap ) = @_ ; + + my( @max, @min, @msgs, @inter, @union ) ; if ( defined( $maxage ) ) { @max = $imap->sentsince( $timestart_int - 86400 * $maxage ) ; @@ -2958,7 +3130,7 @@ sub select_msgs { if ( defined($minage ) ) { @min = $imap->sentbefore( $timestart_int - 86400 * $minage ) ; } - SWITCH: { + SWITCH: { unless( defined( $minage ) ) { @msgs = @max ; last SWITCH } ; unless( defined( $maxage ) ) { @msgs = @min ; last SWITCH } ; my ( %union, %inter ) ; @@ -2971,6 +3143,7 @@ sub select_msgs { if ( $minage > $maxage ) { @msgs = @union ; last SWITCH } ; } + return( @msgs ); } @@ -3007,7 +3180,7 @@ 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) { + 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; @@ -3027,10 +3200,10 @@ sub message_exists { my( $imap, $msg ) = @_ ; return( 1 ) if not $imap->Uid( ) ; - my $search ; - ( $search ) = $imap->search( "UID $msg" ) ; + my $search_uid ; + ( $search_uid ) = $imap->search( "UID $msg" ) ; #print "$search ? $msg\n" ; - return( 1 ) if ( $search eq $msg ) ; + return( 1 ) if ( $search_uid eq $msg ) ; return( 0 ) ; } @@ -3046,12 +3219,11 @@ sub copy_message { my $h1_idate = $h1_fir_ref->{$h1_msg}->{"INTERNALDATE"} || '' ; - if (size_filtered( $h1_size, $h1_msg, $h1_fold, $h2_fold ) ) { + if ( size_filtered( $h1_size, $h1_msg, $h1_fold, $h2_fold ) ) { $h1_nb_msg_processed +=1 ; return( ) ; } - my $string; 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 ) ; @@ -3060,9 +3232,46 @@ sub copy_message { $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 ) ; - $string = $imap1->message_string($h1_msg); + # 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" ; @@ -3077,29 +3286,15 @@ sub copy_message { return( ) ; } - if (@regexmess) { - $string = regexmess($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"; - 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"; + 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"} ) { @@ -3107,24 +3302,141 @@ sub copy_message { $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?@@gi; - $h1_flags = flags_regex($h1_flags) if @regexflag; + $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 ) ; - my $new_id; - $debug and print "msg $h1_fold/$h1_msg date [$h1_date] flags [$h1_flags] size [$h1_size]\n"; - $h1_date = undef if ($h1_date eq ""); + 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 ) = @_ ; - unless ($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); - unless($new_id){ - no warnings 'uninitialized'; - print "- msg $h1_fold/$h1_msg {$string_len} couldn't append (Subject:[". - $imap1->subject($h1_msg)."]) to folder $h2_fold: ", - $imap2->LastError || '', "\n"; + 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 ; @@ -3134,34 +3446,28 @@ sub copy_message { # good # $new_id is an id if the IMAP server has the # UIDPLUS capability else just a ref - if ( $new_id !~ m{^\d+$} ) { + 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_start, $nb_msg_transferred ) ; - #my $eta = eta( $time_spent, $nb_msg_transferred, $h1_nb_msg_start ) ; + 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+$} ) { + 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 die( "Couldn't touch $cache_dir/${h1_msg}_$new_id" ) ; + or croak( "Couldn't touch $cache_dir/${h1_msg}_$new_id" ) ; } if ( $delete ) { - print "msg $h1_fold/$h1_msg deleted on host1\n"; - unless($dry) { - $imap1->delete_message($h1_msg); - $h1_nb_msg_deleted += 1; - $imap1->expunge() if ( $expunge or $expunge1 ); - } + delete_message_on_host1( $h1_msg, $h1_fold ) ; } #print "PRESS ENTER" and my $a = <> ; return( $new_id ) ; @@ -3171,38 +3477,50 @@ sub copy_message { $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_spent, $h1_nb_msg_processed, $h1_nb_msg_start, $nb_msg_transferred ) = @_ ; - - my $time_remaining = time_remaining( @_ ) ; - my $nb_msg_remaining = $h1_nb_msg_start - $h1_nb_msg_processed ; + + 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( $time_spent, $h1_nb_msg_processed, $h1_nb_msg_start, $nb_msg_transferred ) = @_ ; + my( $my_time_spent, $h1_nb_processed, $h1_nb_msg_start, $nb_transferred ) = @_ ; - my $time_remaining = ( $time_spent / $nb_msg_transferred ) * ( $h1_nb_msg_start - $h1_nb_msg_processed ) ; + 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( ) ; } @@ -3281,12 +3599,13 @@ sub tests_cache_map { 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/g ; + $cache_dir =~ s/([;<>\*\|`&\$!#\(\)\[\]\{\}:'"\\])/\\$1/xg ; #print "cache_dir_fix: $cache_dir\n" ; return( $cache_dir ) ; } @@ -3296,13 +3615,19 @@ sub tests_cache_dir_fix { 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 { - $debugcache and print "Entering get_cache\n"; 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"; @@ -3331,8 +3656,8 @@ sub get_cache { sub tests_get_cache { - ok( ! get_cache('/cache_no_exist'), 'get_cache: /cache_no_exist' ); - ok( ( ! -d 'W/tmp/cache/F1/F2' or rmtree( 'W/tmp/cache/F1/F2' )), 'get_cache: rmtree W/tmp/cache/F1/F2' ) ; + 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( @@ -3381,7 +3706,7 @@ sub tests_get_cache { # strange files #$debugcache = 1 ; $maxage = undef ; - ok( ( ! -d 'W/tmp/cache/rr\uee' or rmtree( 'W/tmp/cache/rr\uee' )), 'get_cache: rmtree W/tmp/cache/rr\uee' ) ; + 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( @@ -3399,8 +3724,8 @@ sub tests_get_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_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 => '' } ; @@ -3414,53 +3739,52 @@ sub tests_get_cache { 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 ( $uid1, $uid2 ) ; + my ( $cache_uid1, $cache_uid2 ) ; return( ( undef, undef ) ) if ( ! $file ) ; - if ( $file =~ m{(?:^|/)(\d+)_(\d+)$} ) { - $uid1 = $1 ; - $uid2 = $2 ; + if ( $file =~ m{(?:^|/)(\d+)_(\d+)$}x ) { + $cache_uid1 = $1 ; + $cache_uid2 = $2 ; } - return( $uid1, $uid2 ) ; + return( $cache_uid1, $cache_uid2 ) ; } sub tests_match_a_cache_file { - my ( $uid1, $uid2 ) ; - ok( ( $uid1, $uid2 ) = match_a_cache_file( ), 'match_a_cache_file: no arg' ) ; - ok( ! defined( $uid1 ), 'match_a_cache_file: no arg 1' ) ; - ok( ! defined( $uid2 ), 'match_a_cache_file: no arg 2' ) ; + 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( ( $uid1, $uid2 ) = match_a_cache_file( '' ), 'match_a_cache_file: empty arg' ) ; - ok( ! defined( $uid1 ), 'match_a_cache_file: empty arg 1' ) ; - ok( ! defined( $uid2 ), 'match_a_cache_file: empty 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( ( $uid1, $uid2 ) = match_a_cache_file( '000_000' ), 'match_a_cache_file: 000_000' ) ; - ok( '000' eq $uid1, 'match_a_cache_file: 000_000 1' ) ; - ok( '000' eq $uid2, 'match_a_cache_file: 000_000 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( ( $uid1, $uid2 ) = match_a_cache_file( '123_456' ), 'match_a_cache_file: 123_456' ) ; - ok( '123' eq $uid1, 'match_a_cache_file: 123_456 1' ) ; - ok( '456' eq $uid2, 'match_a_cache_file: 123_456 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( ( $uid1, $uid2 ) = match_a_cache_file( '/tmp/truc/123_456' ), 'match_a_cache_file: /tmp/truc/123_456' ) ; - ok( '123' eq $uid1, 'match_a_cache_file: /tmp/truc/123_456 1' ) ; - ok( '456' eq $uid2, 'match_a_cache_file: /tmp/truc/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( ( $uid1, $uid2 ) = match_a_cache_file( '/lala123_456' ), 'match_a_cache_file: NO /lala123_456' ) ; - ok( ! $uid1, 'match_a_cache_file: /lala123_456 1' ) ; - ok( ! $uid2, 'match_a_cache_file: /lala123_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( ( $uid1, $uid2 ) = match_a_cache_file( 'la123_456' ), 'match_a_cache_file: NO la123_456' ) ; - ok( ! $uid1, 'match_a_cache_file: la123_456 1' ) ; - ok( ! $uid2, 'match_a_cache_file: la123_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 { @@ -3471,14 +3795,14 @@ sub clean_cache { $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 ( $uid1, $uid2 ) = match_a_cache_file( $file ) ; - $debugcache and print "u1: $uid1 u2: $uid2 c12: ", $cache_1_2_ref->{ $uid1 } || '', "\n" ; -# or ( ! exists( $cache_1_2_ref->{ $uid1 } ) ) -# or ( ! ( $uid2 == $cache_1_2_ref->{ $uid1 } ) ) - if ( ( ! defined( $uid1 ) ) - or ( ! defined( $uid2 ) ) - or ( ! exists( $h1_msgs_all_hash_ref->{ $uid1 } ) ) - or ( ! exists( $h2_msgs_all_hash_ref->{ $uid2 } ) ) + 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 "$!" ; @@ -3491,7 +3815,7 @@ sub clean_cache { sub tests_clean_cache { - ok( ( ! -d 'W/tmp/cache/G1/G2' or rmtree( 'W/tmp/cache/G1/G2' )), 'clean_cache: rmtree W/tmp/cache/G1/G2' ) ; + 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( @@ -3537,11 +3861,12 @@ sub tests_clean_cache { 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( ( ! -d 'W/tmp/cache/G1/G2' or rmtree( 'W/tmp/cache/G1/G2' )), 'clean_cache_2: rmtree W/tmp/cache/G1/G2' ) ; + 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( @@ -3591,6 +3916,7 @@ sub tests_clean_cache_2 { 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( ) ; } @@ -3601,6 +3927,7 @@ sub tests_mkpath { 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 { @@ -3611,7 +3938,7 @@ sub tests_touch { 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( ) ; } @@ -3620,7 +3947,7 @@ sub touch { my $failures = 0 ; foreach my $file ( @files ) { - my $fh = new IO::File ; + my $fh = IO::File->new ; if ( $fh->open(">> $file" ) ) { $fh->close ; }else{ @@ -3636,17 +3963,18 @@ 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 $sep1 = $h1_sep || '/'; - my $sep2 = $h2_sep || '/'; + my $sep_1 = $h1_sep || '/'; + my $sep_2 = $h2_sep || '/'; - #print "$cache_dir h1_fold $h1_fold sep1 $sep1 h2_fold $h2_fold sep2 $sep2\n"; - $h1_fold = convert_sep_to_slash( $h1_fold, $sep1 ) ; - $h2_fold = convert_sep_to_slash( $h2_fold, $sep2 ) ; + #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 ) ; @@ -3657,7 +3985,7 @@ sub cache_folder { sub filter_forbidden_characters { my $string = shift ; - $string =~ s{[\Q*|?:"<>\E]}{_}g ; + $string =~ s{[\Q*|?:"<>\E]}{_}xg ; return ( $string ) ; } @@ -3668,13 +3996,13 @@ 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' ); - + return( ) ; } sub convert_sep_to_slash { my ( $folder, $sep ) = @_ ; - $folder =~ s{\Q$sep\E}{/}g ; + $folder =~ s{\Q$sep\E}{/}xg ; return( $folder ) ; } @@ -3687,12 +4015,16 @@ sub tests_convert_sep_to_slash { 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"); @@ -3739,52 +4071,187 @@ sub tests_regexmess { ok( -'Date: Sat, 10 Jul 2010 05:34:45 -0700 -From: - -Hello, -Bye.' - eq regexmess( -'From zzz +<<'EOM' Date: Sat, 10 Jul 2010 05:34:45 -0700 From: Hello, -Bye.' +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 ), - 'From mbox 5 remove'); + '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"; - eval("\$string =~ $regexmess"); - die_clean("error: eval regexmess '$regexmess': $@\n") if $@; + 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); + 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 ) = @_ ; - if ( abs( $bytes ) < ( 1024 * 1024 ) ) { - return sprintf( "%.2f KiB", $bytes / 1024) ; - } elsif ( abs( $bytes ) < ( 1024 * 1024 * 1024 ) ) { - return sprintf( "%.2f MiB", $bytes / (1024 * 1024) ) ; - } elsif ( abs( $bytes ) < ( 1024 * 1024 * 1024 * 1024) ) { - return sprintf("%.2f GiB", $bytes / (1024 * 1024 * 1024) ) ; - } elsif ( abs( $bytes ) < ( 1024 * 1024 * 1024 * 1024 * 1024) ) { - return sprintf( "%.2f TiB", $bytes / (1024 * 1024 * 1024 * 1024) ) ; - } else { - return sprintf( "%.2f PiB", $bytes / (1024 * 1024 * 1024 * 1024 * 1024) ) ; - } - # if you have exabytes (EiB) of email to transfer, you have too much email + 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( ); - $timediff = $timeend - $timestart ; + my $timediff = $timeend - $timestart ; my $timeend_str = localtime( $timeend ) ; @@ -3833,7 +4300,7 @@ sub stats { 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_start, + 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, @@ -3844,171 +4311,13 @@ sub stats { print $warn_release, "\n" ; print thank_author(); + return( ) ; } sub thank_author { return("Homepage: http://imapsync.lamiral.info/\n"); } -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/) { - 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, - "regextrans2=s" => \@regextrans2, - "regexmess=s" => \@regexmess, - "regexflag=s" => \@regexflag, - "filterflags!" => \$filterflags, - "flagsCase!" => \$flagsCase, - "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, - "skipsize!" => \$skipsize, - "allowsizemismatch!" => \$allowsizemismatch, - "fastio1!" => \$fastio1, - "fastio2!" => \$fastio2, - "ssl1!" => \$ssl1, - "ssl2!" => \$ssl2, - "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, - ); - - $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 ! $numopt) ; - - # don't go on if options are not all known. - exit(EX_USAGE()) unless ($opt_ret) ; - -} - sub load_modules { @@ -4026,21 +4335,20 @@ sub load_modules { and (not $help)); #require Data::Dumper if ($debug); + return( ) ; } sub parse_header_msg { - my ($imap, $m_uid, $s_heads, $s_fir, $s, $s_hash) = @_; + 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 "$s uid $m_uid head nb pass one: ", $headnum, "\n"; - - my $headstr; + $debug and print "$side uid $m_uid head nb pass one: ", $headnum, "\n"; if ( ( ! $headnum ) and ( $wholeheaderifneeded ) ){ - print "$s uid $m_uid no header by parse_headers so taking whole header with BODY.PEEK[HEADER]\n" ; + 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; @@ -4048,56 +4356,31 @@ sub parse_header_msg { $head = decompose_header( $whole_header ) ; $headnum = scalar( keys( %$head ) ) ; - $debug and print "$s uid $m_uid head nb pass two: ", $headnum, "\n"; + $debug and print "$side uid $m_uid head nb pass two: ", $headnum, "\n"; } #require Data::Dumper ; #print Data::Dumper->Dump( [ $head, \%useheader ] ) ; - foreach my $h (sort keys(%$head)){ - next if ( ! exists( $useheader{ uc( $h ) } ) - and ! exists( $useheader{ 'ALL' } ) - ) ; - foreach my $val (sort @{$head->{$h}}) { - # no 8-bit data in headers ! - $val =~ s/[\x80-\xff]/X/g; - - # remove the first blanks (dbmail bug ?) - $val =~ s/^\s*(.+)$/$1/; - - # change tabulations to space (Gmail bug on with "Received:" on multilines) - $val =~ s/\t/ /g ; - - # and uppercase header line - # (dbmail and dovecot) - - my $H = uc("$h: $val"); - # show stuff in debug mode - $debug and print "$s uid $m_uid header [$H]", "\n"; - - if ($skipheader and $H =~ m/$skipheader/i) { - $debug and print "$s uid $m_uid skipping header [$H]\n"; - next; - } - $headstr .= "$H"; - } - } - - if ( ( ! $headstr) and ( $addheader ) and ( $s eq "Host1" )){ + 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 ); + 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 "$s uid $m_uid sig $m_md5 size $size idate $idate\n"; + $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"; @@ -4112,6 +4395,74 @@ sub parse_header_msg { $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( ) ; } @@ -4144,6 +4495,7 @@ sub string_to_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 { @@ -4151,13 +4503,13 @@ sub tests_is_a_release_number { 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; - $number =~ m{\d\.\d+}; + return( $number =~ m{\d\.\d+}xo ) ; } sub check_last_release { @@ -4177,17 +4529,23 @@ sub check_last_release { } } -sub imapsync_version { - my $rcs = '$Id: imapsync,v 1.547 2013/07/03 01:24:34 gilles Exp gilles $ '; - $rcs =~ m/,v (\d+\.\d+)/; - my $VERSION = ($1) ? $1: "UNKNOWN"; - return($VERSION); +sub imapsync_version { + my $rcs_imapsync = '$Id: imapsync,v 1.555 2013/07/23 11:41:10 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'); + ok('blabla' ne imapsync_basename(), '! imapsync_basename: blabla'); + return( ) ; } sub imapsync_basename { @@ -4204,11 +4562,12 @@ sub imapsync_version_public { . sprintf("%vd", $PERL_VERSION) . ", Mail::IMAPClient $Mail::IMAPClient::VERSION" . " $imapsync_basename"; - my $sock = new IO::Socket::INET ( + my $sock = IO::Socket::INET->new( PeerAddr => 'imapsync.lamiral.info', PeerPort => '80', - Proto => 'tcp'); - return('unknown') if not $sock; + 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", @@ -4233,21 +4592,22 @@ sub not_long_imapsync_version_public { }else{ POSIX::sigaction(SIGALRM, - POSIX::SigAction->new(sub { die "alarm" })) + POSIX::SigAction->new(sub { croak "alarm" })) or print "Error setting SIGALRM handler: $!\n"; } - eval { - - alarm(3); + my $ret = eval { + alarm(3) ; { $val = imapsync_version_public( ) ; - #sleep 4; - #print "End of $func\n"; + #sleep 4 ; + #print "End of imapsync_version_public\n" ; } - alarm(0); - }; - if ($@) { + alarm(0) ; + 1 ; + } ; + #print "eval [$ret]\n" ; + if ( ( not $ret ) or $@ ) { #print "$@"; if ($@ =~ /alarm/) { # timed out @@ -4257,7 +4617,7 @@ sub not_long_imapsync_version_public { return('unknown'); # propagate unexpected errors } }else { - # didn't + # Good! return($val); } } @@ -4273,18 +4633,642 @@ sub localhost_info { "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_1 ); +} + +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{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' ) ; + 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|\E))/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 $warn_release =''; - $warn_release = check_last_release() if (not defined($releasecheck)); + my $imapsync_release = ''; + $imapsync_release = check_last_release() if (not defined($releasecheck)); my $escape_char = ( 'MSWin32' eq $OSNAME ) ? '^' : '\\'; - print < : 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. @@ -4486,14 +5473,15 @@ $0 $escape_char $localhost_info $rcs -$warn_release +$imapsync_release $thank EOF + return( 1 ) ; } sub usage_complete { - print < : Don't take into account header keyword matching ex: --skipheader 'X.*' @@ -4511,501 +5499,174 @@ sub usage_complete { is the number of messages handled per request. default is like --split1 500. --split2 : same thing on host2. ---timeout : imap connect timeout. - +--timeout : imap connect timeout. EOF + return( ) ; } -sub memory_consumption { - # memory consumed by imapsync until now in bytes - return( ( memory_consumption_of_pids( ) )[0] ); -} -sub memory_consumption_of_pids { - my @PID = (@_) ? @_ : ($PROCESS_ID); +sub get_options { + my $numopt = scalar(@ARGV); + my $argv = join("¤", @ARGV); - #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 }; - shift @ps; # First line is column name "VSZ" - chomp @ps; - # convert to - @val = map { $_ * 1024 } @ps; - return(@val); + $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, + "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"; -sub memory_consumption_of_pids_win32 { - # Windows - my @PID = @_; - my %PID; - # hash of pids as key values - map { $PID{$_}++ } @PID; + # just the version + print imapsync_version(), "\n" and exit if ($version) ; - # Does not work but should reading the tasklist documentation - #@ps = qx{ tasklist /FI "PID eq @PID" }; - - my @ps = qx{ 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); - } + if ($tests) { + $test_builder->no_ending(0); + tests(); + exit; } - return(@val); -} - -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' )"); -} - -sub remove_Ko { - my $string = shift; - if ($string =~ /^(.*) Ko$/) { - return($1); - }else{ - return($string); + if ($tests_debug) { + $test_builder->no_ending(0); + tests_debug(); + exit; } -} - -sub remove_qq { - my $string = shift; - if ($string =~ /^"(.*)"$/) { - 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()), "\n"); - ok(print join("\n", memory_consumption_of_pids('1')), "\n"); - ok(print join("\n", memory_consumption_of_pids('1', $$)), "\n"); - - ok(print memory_consumption_ratio(), "\n"); - ok(print memory_consumption_ratio(1), "\n"); - ok(print memory_consumption_ratio(10), "\n"); - ok(print memory_consumption(), "\n"); -} + $help = 1 if ! $numopt; + load_modules(); -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); - - if ( $d =~ m{(\d?)(\d-...-\d{4})( \d{2}:\d{2}:\d{2})( (?:\+|-)\d{4})?}o ) { - #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; - }elsif ($d =~ m{(?:\w{3,}, )?(\d{1,2}),?\s+(\w{3,})\s+(\d{2,4})\s+(\d{1,2})(?::|\.)(\d{1,2})(?:(?::|\.)(\d{1,2}))?\s*((?:\+|-)\d{4})?}o ) { - # 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 =~ /^[789]/; - $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"; - - }elsif ($d =~ m{(?:.{3}) (...)\s+(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2}) (?:\w{3})?\s?(\d{4})}o ) { - # 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"; - - }elsif ($d =~ m{(\d{2})/(\d{2})/(\d{2}) (\d{2}):(\d{2}):(\d{2})}o ) { - # 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"; - - }elsif ($d =~ m{\w{6,}, (\w{3})\w+\s+(\d{1,2}), (\d{4}) (\d{2}):(\d{2}) (AM|PM)}o ) { - # 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"; - - }elsif ($d =~ m{(\w{3}) (\d{1,2}) (\d{4}) (\d{2}):(\d{2}):(\d{2}) ((?:\+|-)\d{4})}o ) { - # 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"; - - }elsif ($d =~ m{(\d{1,2})-(\w{3})-(\d{4})}o ) { - # 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"; - - }else{ - # unknown/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'); - -} - - -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}'); - -} - -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_1, %h2_folders_not_in_1); - @h2_folders_not_in_1 = list_keys_in_2_not_in_1( \%h1_folders_all, \%h2_folders_all); - map { $h2_folders_not_in_1{$_} = 1} @h2_folders_not_in_1; - @h2_folders_not_in_1 = list_keys_in_2_not_in_1( \%h2_folders_from_1_all, \%h2_folders_not_in_1); - - return( reverse @h2_folders_not_in_1 ); -} - -sub delete_folders_in_2_not_in_1 { - - my $dry_message = ''; - $dry_message = "\t(not really since --dry mode)" if $dry; - 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" ; - } - } -} - - -sub extract_header { - my $string = shift ; - - my ( $header ) = split( /\n\n/, $string ) ; - #print "[$header]\n" ; - return( $header ) ; -} - -sub tests_extract_header { - ok( -'Message-Id: <20100428101817.A66CB162474E@plume.est.belle> -Date: Wed, 28 Apr 2010 12:18:17 +0200 (CEST) -From: gilles@louloutte.dyndns.org (Gilles LAMIRAL)' -eq extract_header( -'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 -' ), 'extract_header: 1') ; - -} - -sub decompose_header{ - my $string = shift ; - - my $header = { } ; - - my ($key, $val ) ; - my @line = split( /\n|\r\n/, $string ) ; - foreach my $line ( @line ) { - #print "DDD $line\n" ; - if( $line =~ m/(^[^ :]+): (.*)/ ) { - $key = $1 ; - $val = $2 ; - #print "DDD [$key] [$val]\n" ; - push( @{ $header->{ $key } }, $val ) ; - }elsif( $line =~ m/^(\s+)(.*)/ ) { - $val = $2 ; - #print "DDD only [$val]\n" ; - @{ $header->{ $key } }[ -1 ] .= " $val" if $key ; - }else{ - next ; - } - } - #require Data::Dumper ; - #print Data::Dumper->Dump( [ $header ] ) ; - - return( $header ) ; -} - - -sub tests_decompose_header{ - - my $header_dec ; - - $header_dec = decompose_header( -'KEY_1: VAL_1 -KEY_2: VAL_2 - VAL_2_+ - VAL_2_++ -KEY_3: VAL_3 -KEY_1: VAL_1_other -' - ) ; - - 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_++' ) ; - - - $header_dec = decompose_header( -'Message-Id: <20100428101817.A66CB162474E@plume.est.belle> -Date: Wed, 28 Apr 2010 12:18:17 +0200 (CEST) -From: gilles@louloutte.dyndns.org (Gilles LAMIRAL)' - ) ; - - ok( '<20100428101817.A66CB162474E@plume.est.belle>' - eq $header_dec->{ 'Message-Id' }[0], 'decompose_header: 1' ) ; - - $header_dec = decompose_header( -'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' - ) ; - 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( -'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)' - ) ; - 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( -' KEY_1: VAL_1 -KEY_2: VAL_2 - VAL_2_+ - VAL_2_++ -KEY_3: VAL_3 -KEY_1: VAL_1_other -' - ) ; - - 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_++' ) ; -} - -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{2})-([A-Z][a-z]{2})-(\d{4}) (\d{2}):(\d{2}):(\d{2}) ((?:\+|-))(\d{2})(\d{2})}o ) { - #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' ) ; -} - -sub add_header { - my $uid = shift || 'mistake' ; - my $header = 'Message-Id: <' . $uid . '@imapsync>' ; - return( $header ) ; -} - -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' ) ; + # 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( ) ; } @@ -5013,8 +5674,9 @@ sub tests_debug { SKIP: { skip "No test in normal run" if ( not $tests_debug ); - tests_decompose_regex( ) ; + tests_subject( ) ; } + return( ) ; } sub tests { @@ -5027,6 +5689,7 @@ sub tests { tests_flags_regex(); tests_permanentflags(); tests_flags_filter( ) ; + tests_separator_invert( ) ; tests_imap2_folder_name(); tests_command_line_nopassword(); tests_good_date(); @@ -5054,40 +5717,51 @@ sub tests { 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( ) ; } + return( ) ; } + # IMAPClient 3.xx ads package Mail::IMAPClient; sub Tls { - my $self = shift; - - if (@_) { $self->{TLS} = shift } + my $self = shift ; + my $value = shift ; + if ( defined( $value ) ) { $self->{TLS} = $value } return $self->{TLS}; } sub Reconnect_counter { - my $self = shift; + my $self = shift ; + my $value = shift ; $self->{Reconnect_counter} = 0 if ( not defined( $self->{Reconnect_counter} ) ) ; - if (@_) { $self->{Reconnect_counter} = shift } - return $self->{Reconnect_counter}; + if ( defined( $value ) ) { $self->{Reconnect_counter} = $value } + return( $self->{Reconnect_counter} ) ; } sub Banner { - my $self = shift; - - if (@_) { $self->{BANNER} = shift } - return $self->{BANNER}; + my $self = shift ; + my $value = shift ; + if ( defined( $value ) ) { $self->{ BANNER } = $value } + return $self->{ BANNER }; } sub capability_update { - my $self = shift; + my $self = shift ; - delete $self->{CAPABILITY}; - $self->capability; + delete $self->{CAPABILITY} ; + return( $self->capability ) ; } diff --git a/index.shtml b/index.shtml index 923dd9f..f7d0bb8 100644 --- a/index.shtml +++ b/index.shtml @@ -5,7 +5,7 @@ Official imapsync migration tool ( release <!--#exec cmd="cat ./VERSION"--> ) - + @@ -81,23 +81,23 @@ for bidirectionnal (2 ways) synchronizations.

Alternatives to imapsync are listed in the Similar softwares section.

-

Facts and figures for 2011 and 2012

+

Facts and figures for 2011-2013

  • 4000 to 5000 users per month (34000 users a year)
  • 6 to 25 millions mailboxes transfers per month, -total is 93 millions for 2011, 91 millions for 2012.
  • +total is 93 millions for 2011, 91 millions for 2012, 66 millions for half 2013
  • Operating systems run by imapsync users:
      -
    • Linux: 67%
    • -
    • Win32: 16%
    • -
    • Darwin: 9%
    • -
    • FreeBSD: 7%
    • -
    • Solaris: 0.3%
    • -
    • OpenBSD: 0.03%
    • -
    • Other: 0.69%
    • +
    • Linux: 72%
    • +
    • Win32: 13%
    • +
    • Darwin: 6%
    • +
    • FreeBSD: 8%
    • +
    • Solaris: 0.2%
    • +
    • OpenBSD: 0.02%
    • +
    • Other: 0.6%
  • Highest use rate: about 21 millions of IMAP mailbox transfers (in a single month)
  • @@ -117,7 +117,7 @@ total is 93 millions for 2011, 91 millions for 2012. +
      +
    • 1.555 Better Office365 and Mailenable handling
    • +
    • Enhancement: Added option --messageidnodomain to fix Mailenable bug changing the domain part of Message-Id header, and avoid duplicates
    • +
    • Enhancement: Added option --syncflagsaftercopy to fix Mailenable bug not getting the flags with the APPEND
    • +
    • Enhancement: Added option --maxlinelength to skip messages whose max line length is over a number of bytes. + Exchange 2013 and Office365 need --maxlinelength 1000 (which is a RFC2822 must) to avoid disconnections.
    • +
    • Enhancement:
    • +
    • Usability: Added back the banner of IMAP servers, ie, the first line given after the connection established.
    • +
    • Usability: Added --fixInboxINBOX, turned on by default, to map automatically Inbox INBOX folder names.
    • +
    • Usability: IMAP server removing consecutive spaces on the header part doesn't generate duplicates (MailEnable does that)
    • +
    • Usability:
    • +
    • Usability:
    • +
    • Usability:
    • +
    • Bug fix: Better output of mailbox sizes in human style (could be 1024.00 Kib, now it is 1.000 Mib). Changed bytes_display_string().
    • +
    • Bug fix: Option --debugflags now prints flags on first sync (the copy) and also the PERMANENTFLAGS outpout.
    • +
    • Bug fix:
    • +
    • Bug fix:
    • +
    • Refactoring: Fixed nearly 200 perlcritic at level 3, all level 4. Still 5 eval "" at level 5 and 12 critics at level 3. Nobody cares but me.
    • +
    • Refactoring:
    • +
    • Refactoring:
    • +
    • Refactoring:
    • +
    +
    • 1.547 Nothing important except imapsync.exe supports also XOAUTH.
    • @@ -699,6 +722,7 @@ I like it.
      • imap_tools: http://www.athensfbc.com/imap_tools
      • +
      • imaputils: http://code.google.com/p/imaputils/ (imap_tools fork)
      • offlineimap: https://github.com/nicolas33/offlineimap
      • mbsync: http://isync.sourceforge.net/
      • mailsync: http://mailsync.sourceforge.net/
      • @@ -722,6 +746,7 @@ I don't think they use imapsync. Prices are given par mailbox and may be outdated (december 2011).

          +
        • Shuttlecloud 0 USD: http://shuttlecloud.com/
        • Ovh imapcopy (French) 0 USD: https://ssl0.ovh.net/fr/imapcopy/
        • Movemymail free for the first and 5 USD thereafter: https://movemymail.net .
        • Mailbox Mover 7 USD: https://mailboxmover.com/
        • @@ -758,7 +783,7 @@ alt="Viewable With Any Browser" /> This document last modified on -($Id: index.shtml,v 1.169 2013/07/03 02:13:03 gilles Exp gilles $) +($Id: index.shtml,v 1.171 2013/07/23 11:45:36 gilles Exp gilles $)

          diff --git a/perlcritic.out b/perlcritic.out deleted file mode 100644 index 1f27185..0000000 --- a/perlcritic.out +++ /dev/null @@ -1,103 +0,0 @@ -Pragma "constant" used at line 570, column 1. See page 55 of PBP. (Severity: 4) -Subroutine "EX_USAGE" does not end with "return" at line 709, column 9. See page 197 of PBP. (Severity: 4) -Magic variable "$SIG" should be assigned as "local" at line 719, column 13. See pages 81,82 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 838, column 6. See page 70 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 843, column 6. See page 70 of PBP. (Severity: 4) -Expression form of "grep" at line 1041, column 26. See page 169 of PBP. (Severity: 4) -Expression form of "grep" at line 1050, column 26. See page 169 of PBP. (Severity: 4) -Expression form of "map" at line 1129, column 28. See page 169 of PBP. (Severity: 4) -Expression form of "map" at line 1130, column 28. See page 169 of PBP. (Severity: 4) -Expression form of "map" at line 1134, column 3. See page 169 of PBP. (Severity: 4) -Expression form of "map" at line 1141, column 3. See page 169 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 1192, column 6. See page 70 of PBP. (Severity: 4) -Subroutine "sync_flags" does not end with "return" at line 1625, column 1. See page 197 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 1659, column 7. See page 70 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 1694, column 14. See page 70 of PBP. (Severity: 4) -Always unpack @_ first at line 1724, column 1. See page 178 of PBP. (Severity: 4) -Subroutine "tests_max" does not end with "return" at line 1730, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_command_line_nopassword" does not end with "return" at line 1840, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "catch_exit" does not end with "return" at line 1869, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "catch_continue" does not end with "return" at line 1876, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "justconnect" does not end with "return" at line 1901, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "relogin1" does not end with "return" at line 1916, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "relogin2" does not end with "return" at line 1927, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "banner_imapsync" does not end with "return" at line 2153, column 1. See page 197 of PBP. (Severity: 4) -Always unpack @_ first at line 2206, column 1. See page 178 of PBP. (Severity: 4) -Subroutine "missing_option" does not end with "return" at line 2211, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_folder_routines" does not end with "return" at line 2276, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "is_requested_folder" does not end with "return" at line 2292, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_compare_lists" does not end with "return" at line 2351, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "get_prefix" does not end with "return" at line 2402, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "get_separator" does not end with "return" at line 2428, column 1. See page 197 of PBP. (Severity: 4) -Always unpack @_ first at line 2491, column 1. See page 178 of PBP. (Severity: 4) -Subroutine "tests_imap2_folder_name" does not end with "return" at line 2506, column 1. See page 197 of PBP. (Severity: 4) -Always unpack @_ first at line 2558, column 1. See page 178 of PBP. (Severity: 4) -Expression form of "eval" at line 2574, column 3. See page 161 of PBP. (Severity: 5) -Subroutine "tests_decompose_regex" does not end with "return" at line 2581, column 1. See page 197 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 2613, column 22. See page 70 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 2617, column 22. See page 70 of PBP. (Severity: 4) -Subroutine "tests_flags_regex" does not end with "return" at line 2680, column 1. See page 197 of PBP. (Severity: 4) -Expression form of "eval" at line 2787, column 3. See page 161 of PBP. (Severity: 5) -Subroutine "acls_sync" does not end with "return" at line 2794, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_permanentflags" does not end with "return" at line 2817, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "permanentflags" does not end with "return" at line 2833, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_flags_filter" does not end with "return" at line 2848, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_flagsCase" does not end with "return" at line 2885, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_ucsecond" does not end with "return" at line 2908, column 1. See page 197 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 2928, column 14. See page 70 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 2945, column 22. See page 70 of PBP. (Severity: 4) -Warnings disabled at line 3124, column 4. See page 431 of PBP. (Severity: 4) -Always unpack @_ first at line 3177, column 1. See page 178 of PBP. (Severity: 4) -Subroutine "tests_time_remaining" does not end with "return" at line 3199, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_cache_map" does not end with "return" at line 3250, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_cache_dir_fix" does not end with "return" at line 3294, column 1. See page 197 of PBP. (Severity: 4) -Always unpack @_ first at line 3302, column 1. See page 178 of PBP. (Severity: 4) -Subroutine "tests_get_cache" does not end with "return" at line 3332, column 1. See page 197 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 3335, column 8. See page 70 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 3384, column 8. See page 70 of PBP. (Severity: 4) -Subroutine "tests_match_a_cache_file" does not end with "return" at line 3433, column 1. See page 197 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 3475, column 3. See page 70 of PBP. (Severity: 4) -Subroutine "tests_clean_cache" does not end with "return" at line 3492, column 1. See page 197 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 3494, column 8. See page 70 of PBP. (Severity: 4) -Subroutine "tests_clean_cache_2" does not end with "return" at line 3542, column 1. See page 197 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 3544, column 8. See page 70 of PBP. (Severity: 4) -Subroutine "tests_mkpath" does not end with "return" at line 3598, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_touch" does not end with "return" at line 3606, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "new" called using indirect syntax at line 3623, column 13. See page 349 of PBP. (Severity: 4) -Subroutine "tests_cache_folder" does not end with "return" at line 3634, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_filter_forbidden_characters" does not end with "return" at line 3664, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_convert_sep_to_slash" does not end with "return" at line 3681, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_regexmess" does not end with "return" at line 3693, column 1. See page 197 of PBP. (Severity: 4) -Expression form of "eval" at line 3762, column 3. See page 161 of PBP. (Severity: 5) -Subroutine "stats" does not end with "return" at line 3785, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "get_options" does not end with "return" at line 3853, column 1. See page 197 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 4005, column 30. See page 70 of PBP. (Severity: 4) -Subroutine "load_modules" does not end with "return" at line 4013, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "parse_header_msg" does not end with "return" at line 4033, column 1. See page 197 of PBP. (Severity: 4) -Mixed high and low-precedence booleans at line 4058, column 27. See page 70 of PBP. (Severity: 4) -Subroutine "string_to_file" does not end with "return" at line 4142, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_is_a_release_number" does not end with "return" at line 4149, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "is_a_release_number" does not end with "return" at line 4157, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_imapsync_basename" does not end with "return" at line 4187, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "new" called using indirect syntax at line 4207, column 13. See page 349 of PBP. (Severity: 4) -Subroutine "usage" does not end with "return" at line 4281, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "usage_complete" does not end with "return" at line 4495, column 1. See page 197 of PBP. (Severity: 4) -Always unpack @_ first at line 4524, column 1. See page 178 of PBP. (Severity: 4) -Subroutine "memory_consumption_of_pids" does not end with "return" at line 4524, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_remove_not_num" does not end with "return" at line 4581, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_memory_consumption" does not end with "return" at line 4615, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_good_date" does not end with "return" at line 4731, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_list_keys_in_2_not_in_1" does not end with "return" at line 4764, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "delete_folders_in_2_not_in_1" does not end with "return" at line 4801, column 1. See page 197 of PBP. (Severity: 4) -Expression form of "eval" at line 4806, column 43. See page 161 of PBP. (Severity: 5) -Expression form of "eval" at line 4810, column 45. See page 161 of PBP. (Severity: 5) -Subroutine "tests_extract_header" does not end with "return" at line 4834, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_decompose_header" does not end with "return" at line 4879, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_epoch" does not end with "return" at line 4991, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_add_header" does not end with "return" at line 5005, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests_debug" does not end with "return" at line 5012, column 1. See page 197 of PBP. (Severity: 4) -Subroutine "tests" does not end with "return" at line 5020, column 1. See page 197 of PBP. (Severity: 4) -Always unpack @_ first at line 5065, column 1. See page 178 of PBP. (Severity: 4) -Always unpack @_ first at line 5072, column 1. See page 178 of PBP. (Severity: 4) -Always unpack @_ first at line 5080, column 1. See page 178 of PBP. (Severity: 4) -Subroutine "capability_update" does not end with "return" at line 5087, column 1. See page 197 of PBP. (Severity: 4) diff --git a/perlcritic_1.out b/perlcritic_1.out new file mode 100644 index 0000000..36f8aa0 --- /dev/null +++ b/perlcritic_1.out @@ -0,0 +1,1948 @@ +Code is not tidy at line 1, column 1. See page 33 of PBP. (Severity: 1) +Check the spelling in your POD: NAME imapsync IMAP sync copy tool mailboxes between two imap servers Good at than different server supported with success few failures To synchronize account foo to password INSTALL can be available directly the following FreeBSD Debian Ubuntu Gentoo Fedora NetBSD Darwin Mandriva OpenBSD get of each just run like this The list command is allowing incremental recursive transfer from one mailbox another By default all folders transferred recursively flags synced too We sometimes need This called good because it reduces amount by not transferring given already both sides Same headers done only All preserved unread will stay read deleted You any time restart later works well bad decide delete after successful feature when migrating since side that implies also expunge so marked host really you noexpunge avoid don't see real world scenario want keep used deletes folder adequate maintaining accounts synchronization where plays independently offlineimap written Goerzen mbsync Michael Elkins ways synchronizations invoke help HISTORY wrote enterprise basystemes paid install new without losing huge old located away remote low bandwidth link imapcp could had verify every was started life patch comes perl tarball directory EXAMPLE While working parameters please induced Nothing way buddy Then max's updated buddy's SECURITY passfile instead give safer With your using ps auxwwww Using dangerous auxwwwwe So saving protected rw best imasync totally against sniffers network passwords may plain text CRAM-MD ssl tls enable encryption authenticate typically admin authorized someone else which means know user's personal Specify authuser adminuser authmech PLAIN now SOMETHING work behavior Authenticate When proxyauth masquerade Can OAUTH transfering Google Apps key domain It does free edition STATUS status return everything went Otherwise exits non-zero unreliable connection loop Bourne shell LICENSE always cover NOLIMIT License See included limit anything license MAILING-LIST mailing-list write address subscribe send even empty then reply unsubscribe person consider anyone post pseudonym private Thank AUTHOR Feedback very often welcome earns his writing installing configuring teaching sold its author maintening supporting over decades BUG GUIDELINES Help follow guidelines bugs requests Before reporting FAQ TODO Upgrade last release maybe bug fixed Mail-IMAPClient Perl Make title word my spam filter won't Don't email problem made keywords summary line uppercase I'll Windows haven't yet include Most those found begining easy debug One paper How Ask Way forget SERVERS Failure stories reported Success names alphabetic order Please story users lines they useful Example justconnect HUGE Pay special subscribed maxage maxsize useuid usecache many migrate think little program Write file.txt example containing separator contains batch replaced nothing Welcome programming Hacking Feel hack permits Entries SIMILAR Exp at line 1, column 1. See page 148 of PBP. (Severity: 1) +Missing "REQUIRED ARGUMENTS" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) +Missing "DIAGNOSTICS" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) +Missing "CONFIGURATION" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) +Missing "DEPENDENCIES" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) +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 (326) 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 546, column 3. See page 79 of PBP. (Severity: 2) +File lexical variable "$debugLIST" is not all lower case or all upper case at line 573, 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 573, 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 573, column 1. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 574, column 41. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 576, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 579, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 582, column 28. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 589, column 28. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 592, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 598, column 40. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 600, column 18. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 603, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 607, column 29. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 608, column 18. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 618, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 619, column 29. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 622, column 43. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 624, column 39. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 625, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 663, column 8. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 701, 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 704, column 10. Unnamed numeric literals make code less maintainable. (Severity: 2) +Builtin function called with parentheses at line 716, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 717, column 18. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 720, column 21. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 721, column 1. See pages 208,278 of PBP. (Severity: 1) +Quotes used with an empty string at line 727, 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 755, 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 756, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 765, column 15. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 765, column 36. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 766, column 21. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 766, column 44. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 772, column 25. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 777, column 24. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 777, column 46. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 779, column 1. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 781, column 1. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 784, column 25. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 788, column 23. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 791, 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 794, 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 795, column 13. Unnamed numeric literals make code less maintainable. (Severity: 2) +Useless interpolation of literal string at line 797, 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 798, 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 798, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) +Useless interpolation of literal string at line 800, 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 801, 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 801, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 803, column 31. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 804, column 12. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 817, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 818, column 5. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 818, column 10. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 818, column 46. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 825, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 826, column 26. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 836, column 9. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 842, 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 843, column 21. Unnamed numeric literals make code less maintainable. (Severity: 2) +Builtin function called with parentheses at line 846, column 23. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 848, column 17. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 850, column 22. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 851, column 18. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 857, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 862, column 2. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 862, column 8. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 868, column 2. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 868, column 8. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 871, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 874, column 5. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 879, column 5. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 886, column 5. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 893, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 894, column 14. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 897, column 24. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 901, column 24. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 907, column 1. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 908, column 1. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 910, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 911, column 17. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 912, column 22. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 916, column 13. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 917, column 13. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 919, column 21. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 920, column 21. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 922, column 16. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 922, column 30. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 922, column 44. See page 51 of PBP. (Severity: 1) +Postfix control "unless" used at line 922, column 57. See pages 96,97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 927, column 34. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 933, column 1. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 934, column 1. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 940, column 16. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 946, column 16. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 949, column 19. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 950, column 50. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 952, column 22. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 953, column 22. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 957, column 26. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 959, column 20. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 960, column 21. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 964, column 27. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 964, column 49. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 965, column 20. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 972, column 66. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 978, column 66. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 984, column 18. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 985, column 18. See page 51 of PBP. (Severity: 1) +Postfix control "unless" used at line 989, column 43. See pages 96,97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 990, column 1. See pages 208,278 of PBP. (Severity: 1) +Postfix control "unless" used at line 991, column 43. See pages 96,97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 992, column 1. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 994, column 1. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 994, column 7. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 994, column 34. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 994, column 34. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 995, column 1. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 995, column 7. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 995, column 34. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 995, column 34. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 998, column 15. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1005, column 73. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1006, column 46. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1007, column 34. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1008, column 54. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1009, column 28. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1028, column 2. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1029, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1031, column 5. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1031, column 39. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1033, column 6. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1036, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1039, column 29. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1041, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1043, column 6. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1051, column 10. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1058, column 6. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1060, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1060, column 33. See page 237 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1062, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1066, column 6. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1068, column 32. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1069, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1069, column 33. See page 237 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1071, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1078, column 22. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1080, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1086, column 29. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1096, column 21. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1100, column 40. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1101, column 40. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1103, column 27. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1104, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1105, column 43. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1108, column 1. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1109, column 1. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1126, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1127, column 34. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1137, column 58. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1138, column 55. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1139, column 11. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 1143, column 15. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1145, column 1. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1145, column 6. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1150, column 1. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1150, column 6. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1151, column 3. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1151, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1152, column 25. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1152, column 62. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1153, column 3. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1158, column 1. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1158, column 42. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1161, column 32. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1164, column 1. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1179, column 2. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1184, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1185, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1186, column 9. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1189, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1191, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1194, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1195, column 57. 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) +Return value of flagged function ignored - print at line 1205, column 3. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1206, column 3. See page 97 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1210, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1212, column 22. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1213, column 3. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1214, column 3. See page 97 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1216, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1225, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1226, column 26. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1231, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1235, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1236, column 26. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1241, column 1. Don't use whitespace at the end of lines. (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) +Quotes used with an empty string at line 1246, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1247, column 50. See page 53 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1253, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1255, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1257, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1257, column 9. See page 51 of PBP. (Severity: 1) +Double-sigil dereference at line 1257, column 39. See page 228 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1257, column 70. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 1259, column 50. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1261, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1264, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1268, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 1269, column 49. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1270, column 30. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1271, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1277, column 1. Don't use whitespace at the end of lines. (Severity: 1) +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 1284, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1288, column 57. See pages 93,94 of PBP. (Severity: 2) +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 1294, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1298, column 77. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1301, column 2. See page 228 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1302, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1305, column 48. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1305, column 57. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1305, column 73. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1306, column 5. See pages 93,94 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1308, column 49. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1308, column 58. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1308, column 74. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1309, column 3. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1312, column 2. See page 97 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1315, column 21. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1315, column 53. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1323, column 9. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1324, column 38. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1325, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1332, column 4. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1334, column 38. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1341, column 36. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1343, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 1345, column 19. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1346, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1348, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1350, column 79. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1354, column 2. See page 228 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1355, column 51. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1355, column 60. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1355, column 76. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1356, column 4. See pages 93,94 of PBP. (Severity: 2) +Found "\t" 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 1362, column 37. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1363, column 9. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1364, column 25. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1370, column 4. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1373, column 36. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1375, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1376, column 9. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1376, column 107. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1377, column 10. See pages 93,94 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1378, column 19. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1382, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1383, column 32. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1384, column 53. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1385, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1387, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1388, column 32. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1389, column 53. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1391, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1392, column 33. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1396, column 4. 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) +Postfix control "if" used at line 1397, column 33. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1398, column 4. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1405, column 4. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1406, column 39. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1409, column 18. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1410, column 38. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1413, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1414, column 23. See page 13 of PBP. (Severity: 1) +"unless" block used at line 1419, column 4. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1419, column 12. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1421, column 45. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1421, column 45. See page 51 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1422, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1422, column 31. See page 237 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1423, column 5. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1424, column 7. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1425, column 5. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 1425, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1426, column 5. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1433, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1434, column 25. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 1434, column 52. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1435, column 4. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1442, column 4. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1443, column 39. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1446, column 18. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1447, column 38. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1451, column 19. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1452, column 10. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1456, column 4. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1456, column 13. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1457, column 49. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1457, column 49. See page 51 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1458, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1458, column 31. See page 237 of PBP. (Severity: 2) +"unless" block used at line 1459, column 5. 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) +Found "\N{SPACE}" at the end of the line at line 1472, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1474, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1477, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1478, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1481, column 25. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1484, column 38. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1487, column 34. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1488, column 41. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 1488, column 70. See pages 93,94 of PBP. (Severity: 2) +Code structure is deeply nested at line 1489, column 41. Consider refactoring. (Severity: 3) +"unless" block used at line 1489, column 41. See page 97 of PBP. (Severity: 2) +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 1499, column 4. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1500, column 39. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1503, column 18. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1504, column 38. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1507, column 59. Don't use whitespace at the end of lines. (Severity: 1) +"unless" block used at line 1522, column 3. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1522, column 11. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1525, column 42. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1526, column 26. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1539, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1542, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1546, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 1557, column 47. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1558, column 44. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 1558, column 59. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1559, column 4. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1560, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1563, column 23. See pages 93,94 of PBP. (Severity: 2) +Found "\t" 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 1579, column 56. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1581, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1589, column 34. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1590, column 18. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 1595, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1597, column 3. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1598, column 3. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1601, column 3. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 1602, column 3. See page 97 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1605, column 19. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1613, column 10. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1615, column 10. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1619, column 1. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1620, column 18. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1627, column 51. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1628, column 51. See page 51 of PBP. (Severity: 1) +Postfix control "unless" used at line 1631, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1632, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 1636, column 17. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 1646, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Too many arguments at line 1656, column 1. See page 182 of PBP. (Severity: 3) +Useless interpolation of literal string at line 1659, column 41. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1663, column 45. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1663, column 58. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1664, column 45. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1664, column 58. See page 53 of PBP. (Severity: 2) +Too many arguments at line 1671, column 1. See page 182 of PBP. (Severity: 3) +Found "\N{SPACE}" at the end of the line at line 1673, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1676, column 9. See pages 208,278 of PBP. (Severity: 1) +Too many arguments at line 1681, column 1. See page 182 of PBP. (Severity: 3) +Found "\N{SPACE}" at the end of the line at line 1684, column 31. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1689, column 31. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1692, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1694, column 22. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1694, column 28. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1695, column 22. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1695, column 28. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1698, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1704, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 1707, column 26. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1717, column 28. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1717, column 28. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1719, column 19. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1721, column 27. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1722, column 27. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1723, column 31. See page 51 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1725, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1725, column 17. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 1735, column 55. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1735, column 55. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1736, column 74. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1736, column 74. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1741, column 17. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1741, column 17. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1741, column 58. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1742, column 17. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1742, column 17. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1752, column 28. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1754, column 10. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1758, column 21. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1759, column 21. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1760, column 21. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1761, column 12. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1761, column 34. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1762, column 28. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1763, column 28. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1764, column 32. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1765, column 23. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1765, column 34. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1766, column 18. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1766, column 25. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1766, column 36. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1773, column 23. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1773, column 23. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1773, column 28. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1775, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1781, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1781, column 9. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1786, column 16. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1792, column 12. See page 13 of PBP. (Severity: 1) +Subroutine "modules_VERSION" is not all lower case or all upper case at line 1796, column 1. See pages 45,46 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1801, column 77. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1801, column 77. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1802, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1804, column 65. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1804, column 65. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1805, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1807, column 73. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1807, column 73. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1808, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1810, column 77. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1810, column 77. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1811, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1813, column 76. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1813, column 76. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1814, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1816, column 68. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1816, column 68. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1817, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1819, column 67. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1819, column 67. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1820, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1822, column 77. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1822, column 77. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1823, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1825, column 79. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1825, column 79. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1826, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1828, column 71. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1828, column 71. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1829, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1831, column 69. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1831, column 69. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1832, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1834, column 65. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1834, column 65. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1835, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1837, column 67. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1837, column 67. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1838, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1840, column 67. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1840, column 67. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1841, column 2. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1843, column 69. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 1843, column 69. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1844, column 2. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1854, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1857, column 13. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 1858, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1858, column 15. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1859, column 4. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1860, column 4. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1860, column 33. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 1862, column 4. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 1870, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1874, column 43. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 1877, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1881, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 1888, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1899, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1907, column 2. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 1916, column 19. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1917, column 19. See pages 93,94 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 1922, column 17. See page 79 of PBP. (Severity: 2) +Postfix control "if" used at line 1927, column 29. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 1934, column 2. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1934, column 8. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1935, column 2. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1935, column 8. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1935, column 35. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1935, column 35. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1937, column 2. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1937, column 8. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 1938, column 2. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 1938, column 8. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 1938, column 35. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 1938, column 35. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1947, column 48. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1951, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1952, column 14. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 1959, column 48. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 1963, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1964, column 14. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 1968, column 1. See page 182 of PBP. (Severity: 3) +Found "\N{SPACE}" at the end of the line at line 1970, column 45. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1971, column 39. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1978, column 43. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1979, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 1983, column 35. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 1983, column 38. See page 13 of PBP. (Severity: 1) +Local lexical variable "$Side" is not all lower case or all upper case at line 1991, column 2. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1991, column 45. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 1992, column 39. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 1996, column 13. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 2000, column 17. See page 79 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2001, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2004, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2009, column 4. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 2015, column 22. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2016, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2018, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2019, column 2. See pages 208,278 of PBP. (Severity: 1) +Too many arguments at line 2024, column 1. See page 182 of PBP. (Severity: 3) +Local lexical variable "$Side" is not all lower case or all upper case at line 2026, column 2. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2027, column 52. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2028, column 39. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2035, column 38. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2035, column 38. See page 51 of PBP. (Severity: 1) +Postfix control "unless" used at line 2038, column 51. See pages 96,97 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2041, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 2042, column 32. See pages 93,94 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2042, column 48. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 2043, column 35. See pages 93,94 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2043, column 51. See page 51 of PBP. (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) +Postfix control "if" used at line 2046, column 32. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2046, column 36. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2049, column 1. Don't use whitespace at the end of lines. (Severity: 1) +"unless" block used at line 2050, column 2. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2053, column 3. See page 13 of PBP. (Severity: 1) +File handle for "print" or "printf" is not braced at line 2058, column 4. See page 217 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2058, column 4. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2060, column 3. See pages 208,278 of PBP. (Severity: 1) +Quotes used with an empty string at line 2061, column 24. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2061, column 24. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2070, column 25. See page 13 of PBP. (Severity: 1) +Local lexical variable "$Side" is not all lower case or all upper case at line 2080, column 2. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2081, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2085, column 3. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2087, column 3. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2089, column 3. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2092, column 4. See pages 208,278 of PBP. (Severity: 1) +Too many arguments at line 2099, column 1. See page 182 of PBP. (Severity: 3) +Found "\N{SPACE}" at the end of the line at line 2100, column 45. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2101, column 39. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2106, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2108, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 2109, column 19. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2110, column 19. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2122, column 41. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2125, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2135, column 22. See page 13 of PBP. (Severity: 1) +Numeric escapes in interpolated string at line 2135, column 30. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 2137, column 41. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2137, column 41. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2147, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2149, column 22. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2150, column 19. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2150, column 27. See page 51 of PBP. (Severity: 1) +Local lexical variable "$URLparm" is not all lower case or all upper case at line 2151, column 9. See pages 45,46 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2151, column 23. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2151, column 31. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2152, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2155, column 26. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 2155, column 32. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2155, column 32. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2157, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2164, column 39. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2168, column 65. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2168, column 65. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2169, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2171, column 25. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2171, column 25. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2174, column 39. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2174, column 39. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2176, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2179, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2183, column 82. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2183, column 82. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2184, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2186, column 63. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2187, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2190, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2192, column 32. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2192, column 32. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2192, column 45. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2192, column 45. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2192, column 61. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2192, column 61. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2195, column 22. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2195, column 22. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2198, column 39. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2198, column 39. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2200, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2203, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2205, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2207, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2209, column 41. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2209, column 41. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2222, column 24. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2222, column 29. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2222, column 29. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2222, column 32. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2223, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2224, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2225, column 5. See page 51 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 2228, column 5. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2237, column 26. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2238, column 8. See page 79 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2243, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2245, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2246, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2248, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2249, column 17. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2250, column 3. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2252, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2255, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2256, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2259, column 1. Don't use whitespace at the end of lines. (Severity: 1) +File handle for "print" or "printf" is not braced at line 2260, column 2. See page 217 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2260, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of "close" ignored at line 2261, column 2. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 2261, column 2. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2262, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2264, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2269, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2270, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2275, column 2. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2277, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Magic punctuation variable used in interpolated string at line 2281, 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 2286, column 1. See pages 45,46 of PBP. (Severity: 1) +Quotes used with an empty string at line 2289, column 14. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2291, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2292, column 79. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 2293, column 79. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2294, 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 2299, column 1. See pages 45,46 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2302, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2303, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2304, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2305, column 6. See page 53 of PBP. (Severity: 2) +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) +Quotes used with an empty string at line 2307, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2308, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2309, column 6. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2310, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2311, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2312, column 25. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 2313, column 6. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2314, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2315, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2316, column 25. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 2317, column 6. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2318, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2319, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2320, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2321, column 6. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2322, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2323, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2324, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2325, column 6. See page 53 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 2333, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2333, column 8. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2347, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2347, column 8. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2361, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2362, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2363, column 27. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2365, column 17. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2370, column 4. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2370, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2408, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2409, column 10. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2415, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2419, column 10. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2424, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2428, column 10. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2433, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2434, column 22. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2434, column 48. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2435, column 22. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2435, column 52. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2436, column 21. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2437, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2438, column 10. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2439, column 10. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 2446, column 28. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2448, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 2450, column 26. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2451, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 2459, column 36. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2460, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2467, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2469, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2483, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2484, column 46. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2485, column 46. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2486, column 46. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2487, column 46. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2488, column 46. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2489, column 46. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2490, column 46. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2493, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2494, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2495, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2496, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2497, column 43. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2499, column 50. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2503, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2504, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2504, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2505, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2505, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2506, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2506, column 34. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2507, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2507, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2508, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2508, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2509, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2509, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2509, column 38. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2510, column 26. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2510, column 32. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2510, column 32. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2510, column 37. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2510, column 47. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2510, column 52. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2511, column 31. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2511, column 37. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2511, column 37. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2511, column 42. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2511, column 52. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2511, column 57. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2520, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2522, column 7. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2523, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2528, column 30. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2534, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2534, column 8. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2535, column 5. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2535, column 47. Don't use whitespace at the end of lines. (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) +Found "\t" at the end of the line at line 2548, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2549, column 7. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2550, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2555, column 29. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2558, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2558, column 8. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2559, column 5. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2559, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2560, column 22. See page 51 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 2566, column 5. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2566, column 47. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2576, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2582, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2588, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with a noisy string at line 2593, column 49. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2594, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2603, column 16. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2603, column 21. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2610, column 11. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2611, column 11. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2611, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2612, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2612, column 42. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2613, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2614, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2614, column 30. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2614, column 34. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2614, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2615, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2615, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2616, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2616, column 51. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2617, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2617, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2618, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2618, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2619, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2619, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2620, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2620, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2622, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2622, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2624, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2624, column 55. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2632, column 27. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2632, column 54. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2632, column 86. See page 13 of PBP. (Severity: 1) +Numeric escapes in interpolated string at line 2634, column 12. See page 56 of PBP. (Severity: 2) +Use only '//' or '{}' to delimit regexps at line 2637, column 14. See page 246 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 2637, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2637, column 14. See page 237 of PBP. (Severity: 2) +Use only '//' or '{}' to delimit regexps at line 2638, column 14. See page 246 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 2638, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2638, column 14. See page 237 of PBP. (Severity: 2) +Use only '//' or '{}' to delimit regexps at line 2639, column 14. See page 246 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 2639, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2639, column 14. See page 237 of PBP. (Severity: 2) +Use only '//' or '{}' to delimit regexps at line 2640, column 21. See page 246 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 2640, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2640, column 21. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 2640, column 30. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2640, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2640, column 74. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2642, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2647, column 27. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2648, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2649, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2660, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2660, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2667, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2667, column 28. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 2677, column 17. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2678, column 45. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2682, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2682, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2689, column 11. 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 an empty string at line 2691, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2691, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2698, column 14. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2712, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2712, column 13. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2717, column 34. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "unless" used at line 2718, column 4. See pages 96,97 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2718, column 26. See page 51 of PBP. (Severity: 1) +Use 'eq' or hash instead of fixed-pattern regexps at line 2718, column 62. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2718, column 62. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2718, column 62. See page 237 of PBP. (Severity: 2) +Expression form of "eval" at line 2724, column 13. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 2724, column 13. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2726, column 28. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used at line 2726, column 49. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2727, column 14. See page 79 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 2735, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2735, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2736, column 28. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2744, column 42. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2744, column 42. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 2745, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2745, column 21. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2756, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 2757, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2761, column 3. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2762, column 47. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2763, column 11. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2763, column 11. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2766, column 47. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2767, column 11. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2767, column 11. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2770, column 1. Don't use whitespace at the end of lines. (Severity: 1) +"unless" block used at line 2771, column 3. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 2772, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2772, column 9. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2778, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2781, column 14. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 2783, column 3. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 2783, column 35. See pages 93,94 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2786, column 32. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2786, column 71. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2786, column 71. See page 79 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2788, column 57. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 2788, column 98. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2788, column 98. See page 79 of PBP. (Severity: 2) +Double-sigil dereference at line 2790, column 15. See page 228 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2791, column 59. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2796, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 2797, column 3. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2797, column 11. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2798, column 3. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2798, column 11. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2799, column 3. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2804, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2805, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2806, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2807, column 2. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2832, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2833, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2834, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2834, column 23. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2834, column 28. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2835, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2835, column 42. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 2838, column 19. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 2838, column 41. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2839, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2841, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2841, column 35. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2841, column 59. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2842, column 16. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2843, column 37. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2843, column 61. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2843, column 91. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2844, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2846, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2847, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2847, column 37. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2847, column 92. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2848, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2850, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2850, column 41. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2850, column 120. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2851, column 5. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2851, column 43. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2851, column 133. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2853, column 16. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2854, column 67. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2856, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2857, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2858, column 64. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2859, column 51. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2860, column 43. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2862, column 16. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2863, column 55. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2864, column 64. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2865, column 52. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2867, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2868, column 16. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2868, column 49. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2869, column 2. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2870, column 63. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2871, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2872, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2873, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2874, column 83. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2875, column 61. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2876, column 72. See page 51 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) +String *may* require interpolation at line 2878, column 16. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2879, column 77. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2881, column 78. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2882, column 1. Don't use whitespace at the end of lines. (Severity: 1) +List declaration without trailing comma at line 2883, column 15. See page 17 of PBP. (Severity: 1) +String *may* require interpolation at line 2884, column 2. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2885, column 2. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2885, column 42. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2886, column 2. 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) +Useless interpolation of literal string at line 2890, column 63. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2891, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2892, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2893, column 59. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2894, column 83. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2895, column 61. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2896, column 72. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2897, column 5. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2897, column 48. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2898, column 1. Don't use whitespace at the end of lines. (Severity: 1) +List declaration without trailing comma at line 2899, column 15. See page 17 of PBP. (Severity: 1) +String *may* require interpolation at line 2900, column 2. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 2901, column 2. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2901, column 80. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2902, column 2. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2905, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2906, column 28. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2907, column 17. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2907, column 67. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2908, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2908, column 23. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2908, column 28. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 2909, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2909, column 7. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2910, column 17. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2910, column 48. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2911, column 46. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2912, column 65. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2913, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 2914, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2916, column 2. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2918, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2919, column 28. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2920, column 17. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2920, column 67. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2921, column 2. 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) +Quotes used with an empty string at line 2923, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2923, column 23. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 2923, column 28. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2924, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2925, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2925, column 7. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 2926, column 17. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2926, column 47. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2927, column 2. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 2928, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2929, column 46. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2930, column 64. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 2931, 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) +Expression form of "eval" at line 2941, column 13. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 2941, column 13. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used at line 2943, column 45. See page 79 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 2944, column 4. See pages 208,278 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 2944, column 10. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2955, column 14. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2957, column 14. See page 79 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2958, column 15. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 2958, column 37. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2958, column 49. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 2958, column 54. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 2959, column 26. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 2960, column 35. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 2961, column 4. See pages 208,278 of PBP. (Severity: 1) +"unless" block used at line 2964, column 4. See page 97 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 2965, column 5. See pages 208,278 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 2967, column 16. See page 79 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 2976, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2978, column 5. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 2978, column 82. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2980, column 95. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2982, column 23. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 2983, column 32. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 2988, column 5. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2996, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2996, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2999, column 28. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2999, column 28. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3000, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3005, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3011, column 6. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3014, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3016, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3023, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3024, column 14. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 3024, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3024, column 21. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3025, column 38. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3025, column 44. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3028, column 18. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3028, column 24. See page 53 of PBP. (Severity: 2) +Subroutine "flagsCase" is not all lower case or all upper case at line 3033, column 1. See pages 45,46 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3035, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3036, column 14. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 3036, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3036, column 21. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3037, column 34. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3037, column 40. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3038, column 53. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3038, column 78. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3040, column 18. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3040, column 24. See page 53 of PBP. (Severity: 2) +Subroutine "tests_flagsCase" is not all lower case or all upper case at line 3045, column 1. See pages 45,46 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3051, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3060, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3061, column 31. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3062, column 41. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 3062, column 67. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3062, column 77. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3063, column 41. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3063, column 69. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3084, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3089, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3090, column 18. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3090, column 45. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3090, column 72. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3095, column 23. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3097, column 49. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3097, column 88. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3100, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3101, column 49. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3102, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3103, column 22. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3107, column 26. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3107, column 53. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3107, column 80. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3111, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3112, column 14. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3124, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3126, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3127, column 7. See page 13 of PBP. (Severity: 1) +Long number not separated with underscores at line 3128, column 45. See page 59 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3130, column 7. See page 13 of PBP. (Severity: 1) +Long number not separated with underscores at line 3131, column 46. See page 59 of PBP. (Severity: 2) +"unless" block used at line 3134, column 3. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3134, column 11. See page 13 of PBP. (Severity: 1) +"unless" block used at line 3135, column 3. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3135, column 11. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3136, column 26. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3138, column 12. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3139, column 12. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3144, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3156, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3167, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3170, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3171, column 7. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3181, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 3182, column 22. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 3184, column 3. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 3190, column 3. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3202, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Subroutine "copy_message" with high complexity score (21) at line 3211, column 1. Consider refactoring. (Severity: 3) +Too many arguments at line 3211, column 1. See page 182 of PBP. (Severity: 3) +Found "\t" at the end of the line at line 3213, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3217, column 42. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 3217, column 60. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 3218, column 42. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 3218, column 54. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 3219, column 42. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 3219, column 61. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3220, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3221, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3226, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 3227, column 7. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 3227, column 41. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 3228, column 2. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 3228, column 95. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3230, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3238, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3240, column 16. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3240, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 3244, column 11. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3244, column 88. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3251, column 31. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3256, column 31. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 3259, column 19. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3259, column 35. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 3259, column 35. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3260, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3267, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Too many arguments at line 3271, column 1. See page 182 of PBP. (Severity: 3) +Found "\N{SPACE}" at the end of the line at line 3273, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3275, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3276, column 60. See page 53 of PBP. (Severity: 2) +"unless" block used at line 3278, column 2. See page 97 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3278, column 11. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3281, column 24. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3283, column 34. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3288, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3292, column 28. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 3293, column 18. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3294, column 80. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3300, column 62. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3307, column 25. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3308, column 3. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 3308, column 3. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3308, column 17. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3311, column 49. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 3311, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3319, column 16. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 3319, column 16. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3327, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3329, column 41. See page 51 of PBP. (Severity: 1) +Use only '//' or '{}' to delimit regexps at line 3341, column 15. See page 246 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 3341, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3341, column 15. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3346, column 37. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3347, column 64. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3348, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3354, column 16. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3355, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3358, column 60. Don't use whitespace at the end of lines. (Severity: 1) +Subroutine "tests_subject" does not end with "return" at line 3365, column 1. See page 197 of PBP. (Severity: 4) +Quotes used with an empty string at line 3366, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3366, column 21. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 3369, column 63. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 3406, column 6. See page 53 of PBP. (Severity: 2) +Too many arguments at line 3428, column 1. See page 182 of PBP. (Severity: 3) +Found "\t" at the end of the line at line 3430, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3437, column 58. See page 53 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 3438, column 4. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3439, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 3449, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3449, column 20. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3460, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3461, column 4. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3461, column 70. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3463, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 3464, column 75. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3464, column 75. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3466, column 44. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 3489, column 2. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 3493, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3501, column 10. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3502, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3506, column 17. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3506, column 26. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3520, column 41. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3521, column 42. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3522, column 42. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3530, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3533, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3534, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3534, column 22. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3535, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3535, column 22. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3536, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3537, column 26. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3540, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3541, column 72. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3546, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3551, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3554, column 6. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3562, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3564, column 12. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3588, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3591, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3594, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3595, column 37. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3608, column 23. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3608, column 23. See page 237 of PBP. (Severity: 2) +String *may* require interpolation at line 3616, column 6. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3616, column 32. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3616, column 43. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3617, column 6. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3617, column 37. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3617, column 50. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3626, column 16. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3633, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 3635, column 50. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3638, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3641, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 3642, column 18. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3642, column 25. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3643, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3644, column 38. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3646, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3648, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3658, column 1. Don't use whitespace at the end of lines. (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 3675, column 1. 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) +Found "\N{SPACE}" at the end of the line at line 3681, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3682, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3682, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3682, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3682, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3682, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 90. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3684, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3687, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3688, column 37. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3695, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3704, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3705, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 3709, column 15. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3709, column 47. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3709, column 72. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3710, column 14. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3710, column 38. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3711, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3724, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3729, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3730, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3730, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3730, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3730, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3730, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 87. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3732, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 3733, column 33. See page 51 of PBP. (Severity: 1) +Double-sigil dereference at line 3734, column 34. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3735, column 34. See page 228 of PBP. (Severity: 2) +String *may* require interpolation at line 3738, column 9. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3739, column 9. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3740, column 11. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 3741, column 11. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3748, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 3750, column 16. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3750, column 16. See page 237 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3762, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3763, column 47. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3766, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3770, 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 3794, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 3795, column 78. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3796, column 21. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3799, column 19. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 3799, column 102. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 3802, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3803, column 14. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 3808, column 4. See page 13 of PBP. (Severity: 1) +Quotes used with a noisy string at line 3808, column 29. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3808, column 29. See page 79 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3811, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3820, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3833, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3840, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3845, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3847, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3848, column 24. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3850, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3852, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3853, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3854, column 24. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3857, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3871, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3884, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3891, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3896, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3898, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3899, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3900, column 24. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3902, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 3904, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3905, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3906, column 24. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 3908, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3909, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3910, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 3912, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 3926, column 25. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 3928, column 52. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3948, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 3954, column 18. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 3971, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with a noisy string at line 3972, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3973, column 25. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 3974, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3978, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 3987, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 3988, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3988, column 20. See page 237 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4004, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4005, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4005, column 13. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4011, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4011, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4011, column 36. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4012, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4013, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4016, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4017, column 60. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4023, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4024, column 5. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4024, column 27. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4024, column 38. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4027, column 11. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4027, column 30. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4027, column 45. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4028, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4030, column 5. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4030, column 27. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4030, column 38. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4031, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4033, column 35. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4034, column 51. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4035, column 5. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4036, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4038, column 15. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4038, column 17. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4039, column 15. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4041, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4042, column 15. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4042, column 46. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4043, column 15. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4045, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4046, column 22. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4046, column 53. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4047, column 22. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4049, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4050, column 31. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4050, column 62. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4051, column 31. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4053, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4054, column 15. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 4055, column 15. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4055, column 17. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4056, column 15. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4058, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4059, column 15. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4059, column 17. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4060, column 15. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4062, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4063, column 22. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4063, column 53. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4064, column 22. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4066, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4068, column 15. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4068, column 15. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 4068, column 31. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4068, column 62. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4069, column 31. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4071, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 4093, column 14. See page 51 of PBP. (Severity: 1) +Expression form of "eval" at line 4185, column 13. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 4185, column 13. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used at line 4187, column 38. See page 79 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 4188, column 4. See pages 208,278 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4188, column 10. See page 79 of PBP. (Severity: 2) +Long number not separated with underscores at line 4201, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4202, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4204, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4205, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4207, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4208, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4210, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4211, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4213, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4214, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4216, column 49. See page 59 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4217, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4222, column 27. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4225, column 23. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4226, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4229, column 29. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4229, column 38. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4229, column 66. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4233, column 29. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4233, column 38. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4237, column 22. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4237, column 30. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4241, column 22. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4241, column 31. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4244, column 22. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4244, column 31. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4253, column 13. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4256, column 22. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4257, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4259, column 47. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4260, column 67. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4265, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4266, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4267, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4268, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4269, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4270, column 2. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 4270, column 65. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 4271, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4272, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4273, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4274, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4275, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4276, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4277, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4278, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4279, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4282, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4285, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4288, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4291, column 9. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4295, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4296, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4297, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4298, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4299, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4300, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4303, column 2. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4306, column 2. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4310, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4312, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4313, column 2. See pages 208,278 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4327, column 51. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 4332, column 31. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4333, column 41. Don't use whitespace at the end of lines. (Severity: 1) +Too many arguments at line 4343, column 1. See page 182 of PBP. (Severity: 3) +Found "\t" at the end of the line at line 4345, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4347, column 17. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4347, column 24. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 4347, column 29. See page 228 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4349, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 4351, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4352, column 24. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4354, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4357, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4358, column 29. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4358, column 37. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 4358, column 43. See page 228 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4366, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4368, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4369, column 55. See page 51 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4371, column 3. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4372, column 15. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4373, column 22. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4377, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4378, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4379, column 33. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4380, column 33. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4381, column 10. See page 13 of PBP. (Severity: 1) +Postfix control "unless" used at line 4381, column 29. See pages 96,97 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4405, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4407, column 23. See page 13 of PBP. (Severity: 1) +Double-sigil dereference at line 4407, column 29. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4408, column 31. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4408, column 51. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4409, column 31. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4412, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4414, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4417, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4418, column 30. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4418, column 30. See page 237 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4431, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4433, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4433, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4436, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4436, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4439, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4439, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4442, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4442, column 24. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4445, column 59. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 4445, column 98. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4445, column 98. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4450, column 27. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 4458, column 37. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4458, column 41. See page 53 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 4463, column 51. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 4473, column 21. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4473, column 21. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" 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 4475, column 9. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4475, column 52. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4477, column 9. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 4477, column 9. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4486, column 2. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4486, column 46. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4488, column 2. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 4488, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4489, column 9. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 4489, column 14. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4495, column 2. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4495, column 67. See page 79 of PBP. (Severity: 2) +File handle for "print" or "printf" is not braced at line 4496, column 2. See page 217 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4496, column 2. See pages 208,278 of PBP. (Severity: 1) +Return value of "close" ignored at line 4497, column 2. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 4497, column 2. See pages 208,278 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4511, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4512, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4512, column 21. See page 237 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4522, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4524, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4528, column 10. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 4533, column 21. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4535, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4536, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4536, column 24. See page 237 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4539, column 30. See page 51 of PBP. (Severity: 1) +Magic punctuation variable used at line 4553, column 18. See page 79 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) +Found "\N{SPACE}" at the end of the line at line 4561, column 42. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4562, column 13. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4562, column 34. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4568, column 17. Don't use whitespace at the end of lines. (Severity: 1) +File handle for "print" or "printf" is not braced at line 4571, column 2. See page 217 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4571, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4576, column 2. See page 13 of PBP. (Severity: 1) +Return value of "close" ignored at line 4576, column 2. Check the return value of "close" for success. (Severity: 2) +Return value of flagged function ignored - close at line 4576, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4578, column 2. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4586, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4589, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4593, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4595, column 60. See page 51 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated string at line 4596, column 20. See page 79 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4598, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4600, column 3. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4606, column 3. See page 13 of PBP. (Severity: 1) +Magic punctuation variable used at line 4610, column 23. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used at line 4612, column 7. See page 79 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4612, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4612, column 13. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4616, column 4. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4626, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4627, column 15. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 4627, column 20. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4627, column 20. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4627, column 23. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4628, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4629, column 11. See page 53 of PBP. (Severity: 2) +Useless interpolation of literal string at line 4629, column 11. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4629, column 15. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4633, column 11. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4633, column 24. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4634, column 19. See page 51 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4649, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4659, column 13. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4672, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4675, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String delimiter used with "split" at line 4681, column 28. Express it as a regex instead. (Severity: 2) +Builtin function called with parentheses at line 4681, column 28. See page 13 of PBP. (Severity: 1) +Quotes used with a noisy string at line 4681, column 34. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4686, column 4. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4691, column 4. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4708, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4710, column 29. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4712, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4726, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 4736, column 37. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4737, column 38. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4738, column 43. See page 51 of PBP. (Severity: 1) +Subroutine "remove_Ko" is not all lower case or all upper case at line 4742, column 1. See pages 45,46 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 4744, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4744, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4753, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4753, column 17. See page 237 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4777, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4786, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4789, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4791, column 13. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4791, column 24. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 4794, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4794, column 17. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4797, column 16. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 4797, column 30. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 4798, column 22. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4798, column 29. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4802, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4803, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4803, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4815, column 38. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4815, column 72. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4815, column 72. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4816, column 38. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4817, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 4818, column 46. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4819, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4819, column 32. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4820, column 25. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4820, column 33. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4821, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4821, column 32. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 4822, column 30. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4822, column 37. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4823, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4823, column 32. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 4824, column 34. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4824, column 41. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4828, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4829, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4829, column 12. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4837, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4837, column 32. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4838, column 25. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4838, column 33. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4839, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4839, column 32. See page 51 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4840, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4840, column 32. See page 51 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 4845, column 19. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4845, column 19. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 4857, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4858, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4858, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4864, column 29. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4865, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4865, column 32. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4869, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4870, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4870, column 12. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4876, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4876, column 32. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4880, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 4881, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4881, column 12. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4886, column 24. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 4886, column 32. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4890, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4894, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4897, column 2. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 4902, column 5. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 4944, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 4953, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Double-sigil dereference at line 4954, column 33. See page 228 of PBP. (Severity: 2) +Builtin function called with parentheses at line 4956, column 3. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 4968, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 4972, column 35. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 4975, column 8. See page 13 of PBP. (Severity: 1) +Expression form of "eval" at line 4975, column 43. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 4975, column 43. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4976, column 4. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 4979, column 8. See page 13 of PBP. (Severity: 1) +Expression form of "eval" at line 4979, column 45. See page 161 of PBP. (Severity: 5) +Builtin function called with parentheses at line 4979, column 45. See page 13 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4980, column 4. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 4984, column 34. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4985, column 36. See pages 93,94 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 4987, column 4. See pages 208,278 of PBP. (Severity: 1) +Return value of flagged function ignored - print at line 4989, column 4. See pages 208,278 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) +Builtin function called with parentheses at line 4999, column 26. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 4999, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4999, column 33. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 5000, column 36. See page 53 of PBP. (Severity: 2) +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) +Builtin function called with parentheses at line 5013, column 1. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5026, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5032, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5036, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Builtin function called with parentheses at line 5038, column 20. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 5038, column 27. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5038, column 27. See page 237 of PBP. (Severity: 2) +Use 'eq' or hash instead of fixed-pattern regexps at line 5042, column 36. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5042, column 36. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5042, column 36. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5044, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5044, column 31. See page 237 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5048, column 25. See page 13 of PBP. (Severity: 1) +Regular expression without "/s" flag at line 5050, column 34. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5050, column 34. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5053, column 65. See pages 93,94 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 5069, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5085, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5086, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5089, column 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5092, column 26. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5095, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5098, column 28. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5101, column 21. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5106, column 1. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 5115, column 13. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5115, column 60. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5126, column 12. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5127, column 105. Don't use whitespace at the end of lines. (Severity: 1) +String *may* require interpolation at line 5141, column 9. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5144, column 9. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5158, 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 20. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5162, column 26. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5165, column 37. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 5174, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Quotes used with an empty string at line 5179, column 17. See page 53 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5179, column 28. See page 13 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5183, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 5184, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5184, column 20. See page 237 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 5186, column 85. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5189, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 5190, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5190, column 33. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5191, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5191, column 33. See page 53 of PBP. (Severity: 2) +Found "\N{SPACE}" at the end of the line at line 5192, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5193, column 88. Don't use whitespace at the end of lines. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5195, 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 5212, column 2. See pages 45,46 of PBP. (Severity: 1) +String *may* require interpolation at line 5212, column 58. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5217, column 6. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5218, column 6. See page 51 of PBP. (Severity: 1) +Long number not separated with underscores at line 5218, column 55. See page 59 of PBP. (Severity: 2) +Subroutine "tests_Banner" is not all lower case or all upper case at line 5223, column 1. See pages 45,46 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5226, column 50. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5227, column 42. See page 51 of PBP. (Severity: 1) +"$i" is declared but not used at line 5237, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) +Builtin function called with parentheses at line 5239, column 28. See page 13 of PBP. (Severity: 1) +Quotes used with an empty string at line 5248, column 28. See page 53 of PBP. (Severity: 2) +String *may* require interpolation at line 5249, column 36. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5250, column 38. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5251, column 42. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5252, column 28. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5253, column 38. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5254, column 40. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5255, column 41. See page 51 of PBP. (Severity: 1) +Long number not separated with underscores at line 5256, column 40. See page 59 of PBP. (Severity: 2) +String *may* require interpolation at line 5256, column 49. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5257, column 44. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5259, column 46. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5260, column 48. See page 51 of PBP. (Severity: 1) +String *may* require interpolation at line 5261, column 96. See page 51 of PBP. (Severity: 1) +Quotes used with an empty string at line 5268, column 25. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5269, column 43. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5269, column 51. See page 13 of PBP. (Severity: 1) +Quotes used with a noisy string at line 5270, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5270, column 60. See page 53 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 5271, column 9. See pages 208,278 of PBP. (Severity: 1) +Magic punctuation variable used in interpolated here-document at line 5271, column 15. See page 79 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 5484, column 2. See pages 208,278 of PBP. (Severity: 1) +Builtin function called with parentheses at line 5510, column 15. See page 13 of PBP. (Severity: 1) +Builtin function called with parentheses at line 5511, column 15. See page 13 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5511, column 20. See page 51 of PBP. (Severity: 1) +Quotes used with a noisy string at line 5511, column 20. See page 53 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 5512, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Regular expression without "/s" flag at line 5516, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5516, column 14. See page 237 of PBP. (Severity: 2) +Return value of flagged function ignored - print at line 5517, column 3. See pages 208,278 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5521, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5522, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5523, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5524, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5525, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5526, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5527, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5528, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5529, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5530, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5531, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5532, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5533, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5534, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5535, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5536, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5537, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5538, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5539, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5540, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5541, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5542, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5543, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5544, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5545, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5546, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5547, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5548, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5549, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5550, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5551, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5552, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5553, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5554, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5555, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5556, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5557, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5558, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5559, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5560, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5561, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5562, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5563, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5564, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5565, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5566, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5567, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5568, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5569, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5570, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5571, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5572, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5573, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5574, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5575, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5576, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5577, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5578, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5579, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5580, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5581, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5582, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5583, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5584, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5585, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5586, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5587, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5588, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5589, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5590, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5591, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5592, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5593, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5594, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5595, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5596, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5597, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5598, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5599, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5600, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5601, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5602, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5603, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5604, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5605, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5606, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5607, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5608, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5609, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5610, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5611, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5612, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5613, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5614, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5615, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5616, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5617, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5618, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5619, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5620, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5621, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5622, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5623, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5624, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5625, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5626, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5627, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5628, column 8. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5628, column 49. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 5629, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5630, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5631, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5632, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5633, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5634, column 8. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5635, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5636, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5637, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5638, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5639, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5640, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5641, column 36. See page 51 of PBP. (Severity: 1) +Useless interpolation of literal string at line 5642, column 36. See page 51 of PBP. (Severity: 1) +Found "\N{SPACE}" at the end of the line at line 5642, column 73. Don't use whitespace at the end of lines. (Severity: 1) +Found "\t" at the end of the line at line 5644, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Return value of flagged function ignored - print at line 5648, column 9. See pages 208,278 of PBP. (Severity: 1) +Postfix control "if" used at line 5648, column 49. See pages 93,94 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) +Found "\t" at the end of the line at line 5660, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Postfix control "if" used at line 5661, column 12. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5665, column 23. See page 13 of PBP. (Severity: 1) +Postfix control "if" used at line 5665, column 32. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5668, column 9. See page 13 of PBP. (Severity: 1) +Postfix control "unless" used at line 5668, column 30. See pages 96,97 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 5674, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 5676, column 8. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 5676, column 32. See pages 93,94 of PBP. (Severity: 2) +Found "\t" at the end of the line at line 5683, column 1. Don't use whitespace at the end of lines. (Severity: 1) +Useless interpolation of literal string at line 5685, column 8. See page 51 of PBP. (Severity: 1) +Postfix control "if" used at line 5685, column 32. See pages 93,94 of PBP. (Severity: 2) +Subroutine "Tls" is not all lower case or all upper case at line 5738, column 1. See pages 45,46 of PBP. (Severity: 1) +Builtin function called with parentheses at line 5741, column 7. See page 13 of PBP. (Severity: 1) +Subroutine "Reconnect_counter" is not all lower case or all upper case at line 5745, column 1. See pages 45,46 of PBP. (Severity: 1) +Postfix control "if" used at line 5748, column 33. See pages 93,94 of PBP. (Severity: 2) +Builtin function called with parentheses at line 5749, column 7. See page 13 of PBP. (Severity: 1) +Subroutine "Banner" is not all lower case or all upper case at line 5754, column 1. See pages 45,46 of PBP. (Severity: 1) +Builtin function called with parentheses at line 5757, column 7. See page 13 of PBP. (Severity: 1) +Found "\t" at the end of the line at line 5763, column 1. Don't use whitespace at the end of lines. (Severity: 1) diff --git a/perlcritic_2.out b/perlcritic_2.out new file mode 100644 index 0000000..2dafdbe --- /dev/null +++ b/perlcritic_2.out @@ -0,0 +1,565 @@ +Missing "REQUIRED ARGUMENTS" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) +Missing "DIAGNOSTICS" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) +Missing "CONFIGURATION" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) +Missing "DEPENDENCIES" section in POD at line 1, column 1. See pages 133,138 of PBP. (Severity: 2) +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 (326) at line 1, column 1. Consider refactoring. (Severity: 3) +Magic punctuation variable used at line 546, 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 704, column 10. Unnamed numeric literals make code less maintainable. (Severity: 2) +Quotes used with an empty string at line 727, 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 755, 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 756, column 48. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 765, column 15. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 766, column 21. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 772, column 25. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 777, column 24. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 784, column 25. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 791, 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 794, 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 795, 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 798, 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 798, column 30. 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 801, 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 801, column 30. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "if" used at line 803, column 31. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 804, column 12. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 818, 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 843, column 21. Unnamed numeric literals make code less maintainable. (Severity: 2) +Postfix control "unless" used at line 922, column 57. See pages 96,97 of PBP. (Severity: 2) +Quotes used with an empty string at line 949, column 19. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 950, column 50. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 952, column 22. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 953, column 22. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 957, column 26. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 964, column 49. See page 53 of PBP. (Severity: 2) +Postfix control "unless" used at line 989, column 43. See pages 96,97 of PBP. (Severity: 2) +Postfix control "unless" used at line 991, column 43. See pages 96,97 of PBP. (Severity: 2) +Quotes used with an empty string at line 994, column 34. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 995, column 34. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 998, column 15. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1060, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1060, column 33. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1069, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1069, column 33. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 1143, column 15. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1153, column 3. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1161, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1206, column 3. See page 97 of PBP. (Severity: 2) +"unless" block used at line 1214, column 3. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1246, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1247, column 50. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 1257, column 39. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1259, column 50. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1269, column 49. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 1270, column 30. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 1288, column 57. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1298, column 77. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1301, column 2. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 1306, column 5. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1309, column 3. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1312, column 2. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1315, column 53. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1350, column 79. See pages 93,94 of PBP. (Severity: 2) +Double-sigil dereference at line 1354, column 2. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 1356, column 4. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1377, column 10. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1397, column 33. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1398, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1406, column 39. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1410, column 38. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1419, column 4. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1421, column 45. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1422, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1422, column 31. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 1424, column 7. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1425, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1426, column 5. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1434, column 52. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1435, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1443, column 39. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1447, column 38. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1456, column 4. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1457, column 49. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1458, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1458, column 31. See page 237 of PBP. (Severity: 2) +"unless" block used at line 1459, column 5. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1488, column 70. See pages 93,94 of PBP. (Severity: 2) +Code structure is deeply nested at line 1489, column 41. Consider refactoring. (Severity: 3) +"unless" block used at line 1489, column 41. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1500, column 39. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1504, column 38. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1522, column 3. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 1557, column 47. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1558, column 59. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1560, column 4. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 1563, column 23. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 1598, column 3. See page 97 of PBP. (Severity: 2) +"unless" block used at line 1602, column 3. See page 97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1631, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "unless" used at line 1632, column 20. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 1636, column 17. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 1656, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 1663, column 58. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1664, column 58. See page 53 of PBP. (Severity: 2) +Too many arguments at line 1671, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1681, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 1694, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1695, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1707, column 26. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1717, column 28. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1725, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1725, column 17. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 1735, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1736, column 74. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1741, column 58. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 1773, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1801, column 77. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1804, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1807, column 73. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1810, column 77. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1813, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1816, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1819, column 67. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1822, column 77. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1825, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1828, column 71. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1831, column 69. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1834, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1837, column 67. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1840, column 67. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 1843, column 69. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 1858, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 1858, column 15. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 1870, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1877, column 5. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1916, column 19. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1917, column 19. See pages 93,94 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 1922, column 17. See page 79 of PBP. (Severity: 2) +Postfix control "if" used at line 1927, column 29. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 1935, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 1938, column 35. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 1952, column 14. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 1964, column 14. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 1968, column 1. See page 182 of PBP. (Severity: 3) +Postfix control "if" used at line 1983, column 35. See pages 93,94 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2000, column 17. See page 79 of PBP. (Severity: 2) +Postfix control "if" used at line 2015, column 22. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 2024, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 2035, column 38. See page 53 of PBP. (Severity: 2) +Postfix control "unless" used at line 2038, column 51. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 2042, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2043, column 35. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2046, column 32. See pages 93,94 of PBP. (Severity: 2) +"unless" block used at line 2050, column 2. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 2061, column 24. See page 53 of PBP. (Severity: 2) +Too many arguments at line 2099, column 1. See page 182 of PBP. (Severity: 3) +Postfix control "if" used at line 2109, column 19. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2110, column 19. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 2122, column 41. See pages 93,94 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 2135, column 30. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 2137, column 41. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2155, column 32. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2155, column 32. See page 237 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2168, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2171, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2174, column 39. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2183, column 82. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2192, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2192, column 45. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2192, column 61. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2195, column 22. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2198, column 39. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2209, column 41. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2222, column 29. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2228, column 5. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2237, column 26. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2238, column 8. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 2261, column 2. Check the return value of "close" for success. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2281, column 12. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 2289, column 14. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2291, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2292, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2303, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2304, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2305, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2307, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2308, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2309, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2311, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2312, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2315, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2316, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2319, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2320, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2321, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2323, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2324, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2325, column 6. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 2446, column 28. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 2450, column 26. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 2459, column 36. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 2510, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2511, column 37. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2593, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2603, column 21. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2611, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2612, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2612, column 42. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2614, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2614, column 30. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2614, column 34. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2614, column 38. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2615, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2615, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2616, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2616, column 51. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2617, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2617, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2618, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2618, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2619, column 48. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2619, column 53. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2620, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2620, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2622, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2622, column 55. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2624, column 50. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2624, column 55. See page 53 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 2634, column 12. See page 56 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2637, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2637, column 14. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2638, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2638, column 14. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2639, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2639, column 14. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2640, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2640, column 21. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 2640, column 30. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2640, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2640, column 74. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2647, column 27. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2648, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2649, column 11. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2660, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2660, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2667, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2667, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2682, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2682, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2689, column 11. 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 an empty string at line 2691, column 4. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2691, column 28. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2698, column 14. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2712, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2712, column 13. See page 237 of PBP. (Severity: 2) +Postfix control "unless" used at line 2718, column 4. See pages 96,97 of PBP. (Severity: 2) +Use 'eq' or hash instead of fixed-pattern regexps at line 2718, column 62. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2718, column 62. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2718, column 62. See page 237 of PBP. (Severity: 2) +Expression form of "eval" at line 2724, column 13. See page 161 of PBP. (Severity: 5) +Magic punctuation variable used at line 2726, column 49. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2727, column 14. See page 79 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 2735, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2735, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2736, column 28. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2744, column 42. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2744, column 42. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 2745, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2745, column 21. See page 53 of PBP. (Severity: 2) +"unless" block used at line 2771, column 3. See page 97 of PBP. (Severity: 2) +Double-sigil dereference at line 2783, column 3. See page 228 of PBP. (Severity: 2) +Postfix control "if" used at line 2783, column 35. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2786, column 71. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2786, column 71. See page 79 of PBP. (Severity: 2) +Quotes used with a noisy string at line 2788, column 98. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2788, column 98. See page 79 of PBP. (Severity: 2) +Double-sigil dereference at line 2790, column 15. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 2834, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2834, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2838, column 41. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2897, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2908, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2908, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2909, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2923, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2923, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2925, column 5. See page 53 of PBP. (Severity: 2) +Expression form of "eval" at line 2941, column 13. See page 161 of PBP. (Severity: 5) +Magic punctuation variable used at line 2943, column 45. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2944, column 10. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2955, column 14. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2957, column 14. See page 79 of PBP. (Severity: 2) +Double-sigil dereference at line 2958, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 2958, column 54. See page 228 of PBP. (Severity: 2) +"unless" block used at line 2964, column 4. See page 97 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 2967, column 16. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 2978, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 2988, column 5. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2996, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2996, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 2999, column 28. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 2999, column 28. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3000, column 23. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3005, column 17. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3011, column 6. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3024, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3024, column 21. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3025, column 44. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3028, column 24. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3036, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3036, column 21. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3037, column 40. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3040, column 24. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3062, column 67. See pages 93,94 of PBP. (Severity: 2) +Long number not separated with underscores at line 3128, column 45. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 3131, column 46. See page 59 of PBP. (Severity: 2) +"unless" block used at line 3134, column 3. See page 97 of PBP. (Severity: 2) +"unless" block used at line 3135, column 3. See page 97 of PBP. (Severity: 2) +Postfix control "if" used at line 3182, column 22. See pages 93,94 of PBP. (Severity: 2) +Subroutine "copy_message" with high complexity score (21) at line 3211, column 1. Consider refactoring. (Severity: 3) +Too many arguments at line 3211, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 3217, column 60. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3218, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3219, column 61. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3227, column 41. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3228, column 95. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3259, column 19. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3259, column 35. See page 53 of PBP. (Severity: 2) +Too many arguments at line 3271, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 3276, column 60. See page 53 of PBP. (Severity: 2) +"unless" block used at line 3278, column 2. See page 97 of PBP. (Severity: 2) +Quotes used with an empty string at line 3281, column 24. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 3283, column 34. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3308, column 3. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3311, column 49. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3319, column 16. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3341, column 15. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3341, column 15. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3346, column 37. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 3347, column 64. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3354, column 16. See page 53 of PBP. (Severity: 2) +Subroutine "tests_subject" does not end with "return" at line 3365, column 1. See page 197 of PBP. (Severity: 4) +Quotes used with an empty string at line 3366, column 6. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3366, column 21. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3406, column 6. See page 53 of PBP. (Severity: 2) +Too many arguments at line 3428, column 1. See page 182 of PBP. (Severity: 3) +Quotes used with an empty string at line 3437, column 58. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3449, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3449, column 20. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3464, column 75. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3464, column 75. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3493, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3501, column 10. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 3534, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3534, column 22. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3535, column 2. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3535, column 22. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3537, column 26. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3594, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3595, column 37. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3608, column 23. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3608, column 23. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 3635, column 50. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 3682, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3682, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3682, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3682, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3682, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 35. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 57. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 68. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 79. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3683, column 90. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 3687, column 37. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3688, column 37. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 3730, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3730, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3730, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3730, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3730, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 43. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 65. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 76. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3731, column 87. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 3734, column 34. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3735, column 34. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3750, column 16. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3750, column 16. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 3763, column 47. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 3795, column 78. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 3796, column 21. See page 228 of PBP. (Severity: 2) +Quotes used with an empty string at line 3799, column 102. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3808, column 29. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 3808, column 29. See page 79 of PBP. (Severity: 2) +Quotes used with an empty string at line 3847, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3848, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3852, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3853, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3854, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3898, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3899, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3900, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3904, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3905, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 3906, column 24. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3972, column 25. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 3973, column 25. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 3988, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 3988, column 20. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4005, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4005, column 13. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4011, column 5. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4011, column 32. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4011, column 36. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4012, column 46. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4013, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4016, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 4017, column 60. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4038, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4039, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4055, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4056, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4059, column 15. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4068, column 15. See page 53 of PBP. (Severity: 2) +Expression form of "eval" at line 4185, column 13. See page 161 of PBP. (Severity: 5) +Magic punctuation variable used at line 4187, column 38. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4188, column 10. See page 79 of PBP. (Severity: 2) +Long number not separated with underscores at line 4201, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4202, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4204, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4205, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4207, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4208, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4210, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4211, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4213, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4214, column 46. See page 59 of PBP. (Severity: 2) +Long number not separated with underscores at line 4216, column 49. See page 59 of PBP. (Severity: 2) +Quotes used with an empty string at line 4225, column 23. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 4270, column 65. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4332, column 31. See pages 93,94 of PBP. (Severity: 2) +Too many arguments at line 4343, column 1. See page 182 of PBP. (Severity: 3) +Double-sigil dereference at line 4347, column 29. See page 228 of PBP. (Severity: 2) +Double-sigil dereference at line 4358, column 43. See page 228 of PBP. (Severity: 2) +Postfix control "unless" used at line 4381, column 29. See pages 96,97 of PBP. (Severity: 2) +Double-sigil dereference at line 4407, column 29. See page 228 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4418, column 30. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4418, column 30. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4433, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4433, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4436, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4436, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4439, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4439, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4442, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4442, column 24. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4445, column 98. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4445, column 98. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4458, column 37. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4458, column 41. See page 53 of PBP. (Severity: 2) +Numeric escapes in interpolated string at line 4463, column 51. See page 56 of PBP. (Severity: 2) +Quotes used with an empty string at line 4473, column 21. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4475, column 52. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4477, column 9. Check the return value of "close" for success. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4486, column 46. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4488, column 2. Check the return value of "close" for success. (Severity: 2) +Quotes used with an empty string at line 4489, column 14. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4495, column 67. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4497, column 2. Check the return value of "close" for success. (Severity: 2) +Regular expression without "/s" flag at line 4512, column 21. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4512, column 21. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4536, column 24. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4536, column 24. See page 237 of PBP. (Severity: 2) +Magic punctuation variable used at line 4553, column 18. See page 79 of PBP. (Severity: 2) +Return value of "close" ignored at line 4576, column 2. Check the return value of "close" for success. (Severity: 2) +Magic punctuation variable used in interpolated string at line 4596, column 20. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used at line 4610, column 23. See page 79 of PBP. (Severity: 2) +Magic punctuation variable used at line 4612, column 7. See page 79 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4612, column 13. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4612, column 13. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4627, column 20. See page 53 of PBP. (Severity: 2) +Quotes used with an empty string at line 4629, column 11. See page 53 of PBP. (Severity: 2) +String delimiter used with "split" at line 4681, column 28. Express it as a regex instead. (Severity: 2) +Quotes used with a noisy string at line 4681, column 34. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4744, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4744, column 17. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4753, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4753, column 17. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4791, column 13. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4794, column 17. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4794, column 17. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4797, column 16. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 4797, column 30. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 4798, column 22. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4803, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4803, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4815, column 38. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4815, column 72. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4815, column 72. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4816, column 38. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4818, column 46. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4822, column 30. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4824, column 34. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4829, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4829, column 12. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4845, column 19. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4845, column 19. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4858, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4858, column 12. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 4864, column 29. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4870, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4870, column 12. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4881, column 12. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4881, column 12. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 4902, column 5. See page 53 of PBP. (Severity: 2) +Double-sigil dereference at line 4954, column 33. See page 228 of PBP. (Severity: 2) +Expression form of "eval" at line 4975, column 43. See page 161 of PBP. (Severity: 5) +Expression form of "eval" at line 4979, column 45. See page 161 of PBP. (Severity: 5) +Postfix control "if" used at line 4984, column 34. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 4985, column 36. See pages 93,94 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 4999, column 33. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 4999, column 33. See page 237 of PBP. (Severity: 2) +Quotes used with an empty string at line 5000, column 36. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5038, column 27. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5038, column 27. See page 237 of PBP. (Severity: 2) +Use 'eq' or hash instead of fixed-pattern regexps at line 5042, column 36. See pages 271,272 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5042, column 36. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5042, column 36. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5044, column 31. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5044, column 31. See page 237 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5050, column 34. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5050, column 34. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5053, column 65. See pages 93,94 of PBP. (Severity: 2) +Quotes used with an empty string at line 5179, column 17. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5184, column 20. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5184, column 20. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5190, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5190, column 33. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5191, column 28. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5191, column 33. See page 53 of PBP. (Severity: 2) +Long number not separated with underscores at line 5218, column 55. See page 59 of PBP. (Severity: 2) +"$i" is declared but not used at line 5237, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) +Quotes used with an empty string at line 5248, column 28. See page 53 of PBP. (Severity: 2) +Long number not separated with underscores at line 5256, column 40. See page 59 of PBP. (Severity: 2) +Quotes used with an empty string at line 5268, column 25. See page 53 of PBP. (Severity: 2) +Postfix control "if" used at line 5269, column 43. See pages 93,94 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5270, column 54. See page 53 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5270, column 60. See page 53 of PBP. (Severity: 2) +Magic punctuation variable used in interpolated here-document at line 5271, column 15. See page 79 of PBP. (Severity: 2) +Quotes used with a noisy string at line 5511, column 20. See page 53 of PBP. (Severity: 2) +Regular expression without "/s" flag at line 5516, column 14. See pages 240,241 of PBP. (Severity: 2) +Regular expression without "/m" flag at line 5516, column 14. See page 237 of PBP. (Severity: 2) +Postfix control "if" used at line 5648, column 49. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5661, column 12. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5665, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "unless" used at line 5668, column 30. See pages 96,97 of PBP. (Severity: 2) +Postfix control "if" used at line 5676, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5685, column 32. See pages 93,94 of PBP. (Severity: 2) +Postfix control "if" used at line 5748, column 33. See pages 93,94 of PBP. (Severity: 2) diff --git a/perlcritic_3.out b/perlcritic_3.out new file mode 100644 index 0000000..b9c0615 --- /dev/null +++ b/perlcritic_3.out @@ -0,0 +1,20 @@ +Main code has high complexity score (326) at line 1, column 1. Consider refactoring. (Severity: 3) +Code structure is deeply nested at line 1489, column 41. Consider refactoring. (Severity: 3) +Too many arguments at line 1656, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1671, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1681, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 1968, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 2024, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 2099, column 1. See page 182 of PBP. (Severity: 3) +Expression form of "eval" at line 2724, column 13. See page 161 of PBP. (Severity: 5) +Expression form of "eval" at line 2941, column 13. See page 161 of PBP. (Severity: 5) +Subroutine "copy_message" with high complexity score (21) at line 3211, column 1. Consider refactoring. (Severity: 3) +Too many arguments at line 3211, column 1. See page 182 of PBP. (Severity: 3) +Too many arguments at line 3271, column 1. See page 182 of PBP. (Severity: 3) +Subroutine "tests_subject" does not end with "return" at line 3365, column 1. See page 197 of PBP. (Severity: 4) +Too many arguments at line 3428, column 1. See page 182 of PBP. (Severity: 3) +Expression form of "eval" at line 4185, column 13. See page 161 of PBP. (Severity: 5) +Too many arguments at line 4343, column 1. See page 182 of PBP. (Severity: 3) +Expression form of "eval" at line 4975, column 43. See page 161 of PBP. (Severity: 5) +Expression form of "eval" at line 4979, column 45. See page 161 of PBP. (Severity: 5) +"$i" is declared but not used at line 5237, column 9. Unused variables clutter code and make it harder to read. (Severity: 3) diff --git a/tests.sh b/tests.sh index 82e379d..c2a3208 100644 --- a/tests.sh +++ b/tests.sh @@ -1,6 +1,6 @@ #!/bin/sh -# $Id: tests.sh,v 1.219 2013/07/03 04:12:34 gilles Exp gilles $ +# $Id: tests.sh,v 1.220 2013/07/23 11:22:50 gilles Exp gilles $ # Example 1: # CMD_PERL='perl -I./Mail-IMAPClient-3.33/lib' sh -x tests.sh @@ -175,6 +175,18 @@ locallocal() { --passfile2 ../../var/pass/secret.titi } +ll_debug() { + #can_send && sendtestmessage + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --debug --nofoldersizes +} + + + ll_nofoldersizes() { $CMD_PERL ./imapsync \ @@ -265,7 +277,6 @@ ll_authmech_PREAUTH() { } - ll_unknow_option() { ! $CMD_PERL ./imapsync \ --host1 $HOST1 --user1 tata \ @@ -849,6 +860,32 @@ ll_maxage_0() --maxage 0 --folder INBOX } +ll_maxage_10000_minage_9999() +{ + # INTERSECTION: 0 messages + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --maxage 10000 --minage 9999 \ + --folder INBOX --justfoldersizes +} + +ll_maxage_9999_minage_10000() +{ + # UNION: all messages + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --maxage 9999 --minage 10000 \ + --folder INBOX --justfoldersizes +} + + + ll_maxage_10000() { can_send && sendtestmessage @@ -1041,6 +1078,16 @@ ll_maxage_9999() --maxage 9999 } +ll_maxlinelength() +{ + can_send && sendtestmessage + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --maxlinelength 8 --nofoldersizes --folder INBOX +} ll_maxsize() @@ -1432,10 +1479,39 @@ ll_regexmess() if can_send; then file=`ls -t /home/vmail/titi/.yop.yap/cur/* | tail -1` diff ../../var/imapsync/tests/ll_regexmess/dest_01 $file - #echo 'rm -f /home/vmail/titi/.yop.yap/cur/*' + echo 'sudo rm -fv /home/vmail/titi/.yop.yap/cur/*' fi } +ll_regexmess_bad_regex() +{ + ! $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --folder INBOX.yop.yap \ + --regexmess 'I am BAD' +} + + +ll_regexmess_remove_header_Disposition() +{ +#Disposition-Notification-To: Gilles LAMIRAL + $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --folder INBOX.regexmess \ + --nofoldersizes \ + --regexmess 's{\A(.*?(?! ^$))(^Disposition-Notification-To:.*?\n)}{$1}gxms' \ + --debugcontent --debug + echo "sudo sh -c 'rm /home/vmail/titi/.regexmess/cur/*'" +} + + + ll_regexmess_scwchu() { $CMD_PERL ./imapsync \ @@ -1498,11 +1574,27 @@ ll_regex_flag() --host2 $HOST2 --user2 titi \ --passfile2 ../../var/pass/secret.titi \ --folder INBOX.yop.yap \ - --regexflag 's/\\Answered/\$Forwarded/g' + --regexflag 's/\\Answered/\$Forwarded/g' --debugflags echo 'rm -f /home/vmail/titi/.yop.yap/cur/*' } +ll_regex_flag_bad() +{ + ! $CMD_PERL ./imapsync \ + --host1 $HOST1 --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 $HOST2 --user2 titi \ + --passfile2 ../../var/pass/secret.titi \ + --folder INBOX.yop.yap \ + --regexflag 'I am bad' --debugflags + + echo 'sudo rm -fv /home/vmail/titi/.yop.yap/cur/*' +} + + + + ll_regex_flag2() { $CMD_PERL ./imapsync \ @@ -1513,7 +1605,7 @@ ll_regex_flag2() --folder INBOX.yop.yap \ --debug --regexflag s/\\\\Answered/\\\\Flagged/g - echo 'rm -f /home/vmail/titi/.yop.yap/cur/*' + echo 'sudo rm -fv /home/vmail/titi/.yop.yap/cur/*' } @@ -1894,17 +1986,19 @@ ll_delete2_dev() { ll_delete() { + echo 11111111111111111111111 $CMD_PERL ./imapsync \ --host1 $HOST1 --user1 tata \ --passfile1 ../../var/pass/secret.tata \ --host2 $HOST2 --user2 titi \ --passfile2 ../../var/pass/secret.titi \ - --folder INBOX.oneemail3 + --folder INBOX.oneemail3 --delete #find /home/vmail/titi/.oneemail3/ || : echo After first sync test -f /home/vmail/titi/.oneemail3/cur/* || return 1 + echo 222222222222222222222222 $CMD_PERL ./imapsync \ --host1 $HOST1 --user1 titi \ --passfile1 ../../var/pass/secret.titi \ @@ -1913,6 +2007,7 @@ ll_delete() { --folder INBOX.oneemail3 \ --delete + echo 3333333333333333333333333 $CMD_PERL ./imapsync \ --host1 $HOST1 --user1 titi \ --passfile1 ../../var/pass/secret.titi \ @@ -2029,9 +2124,22 @@ xxxxx_gmail() { --folder 'INBOX.Messages envoy&AOk-s' \ --folder 'INBOX.Sent' -# --exclude Gmail } +xxxxx_gmail_useuid() { + + ! ping -c1 imap.gmail.com || $CMD_PERL ./imapsync \ + --host1 $HOST2 \ + --user1 tata \ + --passfile1 ../../var/pass/secret.tata \ + --host2 imap.gmail.com \ + --ssl2 \ + --user2 gilles.lamiral@gmail.com \ + --passfile2 ../../var/pass/secret.gilles_gmail \ + --nofoldersizes \ + --regextrans2 "s,^Sent$,[Gmail]/Sent Mail," \ + --folder 'INBOX.Sent' --useuid --dry +} xxxxx_gmail_2() { @@ -3235,9 +3343,11 @@ ll_bad_host_ssl ll_useheader ll_useheader_noheader ll_regexmess +ll_regexmess_bad_regex ll_regexmess_scwchu ll_flags ll_regex_flag +ll_regex_flag_bad ll_regex_flag_keep_only ll_justconnect ll_justlogin