Hello community,

here is the log from the commit of package perl-Spreadsheet-Read for 
openSUSE:Factory checked in at 2018-09-24 13:12:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Spreadsheet-Read (Old)
 and      /work/SRC/openSUSE:Factory/.perl-Spreadsheet-Read.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-Spreadsheet-Read"

Mon Sep 24 13:12:07 2018 rev:14 rq:636845 version:0.79

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/perl-Spreadsheet-Read/perl-Spreadsheet-Read.changes  
    2018-02-09 15:47:59.654425487 +0100
+++ 
/work/SRC/openSUSE:Factory/.perl-Spreadsheet-Read.new/perl-Spreadsheet-Read.changes
 2018-09-24 13:12:11.317819746 +0200
@@ -1,0 +2,6 @@
+Thu Sep 20 08:07:34 UTC 2018 - [email protected]
+
+- updated to 0.79
+   see /usr/share/doc/packages/perl-Spreadsheet-Read/
+
+-------------------------------------------------------------------

Old:
----
  Spreadsheet-Read-0.78.tgz

New:
----
  Spreadsheet-Read-0.79.tgz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-Spreadsheet-Read.spec ++++++
--- /var/tmp/diff_new_pack.WQpp81/_old  2018-09-24 13:12:11.733819013 +0200
+++ /var/tmp/diff_new_pack.WQpp81/_new  2018-09-24 13:12:11.733819013 +0200
@@ -17,13 +17,13 @@
 
 
 Name:           perl-Spreadsheet-Read
-Version:        0.78
+Version:        0.79
 Release:        0
 %define cpan_name Spreadsheet-Read
 Summary:        Read the data from a spreadsheet
-License:        Artistic-1.0 or GPL-1.0+
+License:        Artistic-1.0 OR GPL-1.0-or-later
 Group:          Development/Libraries/Perl
-Url:            http://search.cpan.org/dist/Spreadsheet-Read/
+Url:            https://metacpan.org/release/%{cpan_name}
 Source0:        
https://cpan.metacpan.org/authors/id/H/HM/HMBRAND/%{cpan_name}-%{version}.tgz
 Source1:        cpanspec.yml
 Patch1:         nonstdperlpath.patch

++++++ Spreadsheet-Read-0.78.tgz -> Spreadsheet-Read-0.79.tgz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/Changes 
new/Spreadsheet-Read-0.79/Changes
--- old/Spreadsheet-Read-0.78/Changes   2018-01-29 17:40:14.000000000 +0100
+++ new/Spreadsheet-Read-0.79/Changes   2018-08-29 10:31:25.000000000 +0200
@@ -1,3 +1,13 @@
+0.79   - 29 Aug 2018, H.Merijn Brand
+    * Environmant control hardening
+    * ReadData () docs (opening from scalar ref: issue#21)
+    * Check for XLSX content on opening from plain scalar content
+    * Fix typo in ss-dup-tk.pl (PRC, Branislav Zahradnik)
+    * Allow source from command line option in xls2csv (PRC, Branislav 
Zahradnik)
+    * Allow --in-sep=tab in xlscat/xlsgrep
+    * Add --hash to xlscat/xlsgrep
+    * Help and usage for examples/xls2csv PR#23)
+
 0.78   - 29 Jan 2018, H.Merijn Brand
     * Spreadsheet::ParseExcel supports the active flag as of version 0.61
     * Fix typo in docs (SPROUT, RT#124214)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/MANIFEST 
new/Spreadsheet-Read-0.79/MANIFEST
--- old/Spreadsheet-Read-0.78/MANIFEST  2018-01-29 17:40:46.000000000 +0100
+++ new/Spreadsheet-Read-0.79/MANIFEST  2018-08-29 17:33:13.000000000 +0200
@@ -107,5 +107,6 @@
 t/624_dates.t
 t/625_perc.t
 t/627_merged.t
+t/999_fail.t
 META.yml                                 Module YAML meta-data (added by 
MakeMaker)
 META.json                                Module JSON meta-data (added by 
MakeMaker)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/META.json 
new/Spreadsheet-Read-0.79/META.json
--- old/Spreadsheet-Read-0.78/META.json 2018-01-29 17:40:46.000000000 +0100
+++ new/Spreadsheet-Read-0.79/META.json 2018-08-29 17:33:14.000000000 +0200
@@ -1,87 +1,79 @@
 {
-   "abstract" : "Meta-Wrapper for reading spreadsheet data",
-   "name" : "Spreadsheet-Read",
+   "resources" : {
+      "repository" : {
+         "web" : "https://github.com/Tux/Spreadsheet-Read";,
+         "url" : "https://github.com/Tux/Spreadsheet-Read";,
+         "type" : "git"
+      },
+      "license" : [
+         "http://dev.perl.org/licenses/";
+      ]
+   },
+   "dynamic_config" : 1,
+   "license" : [
+      "perl_5"
+   ],
+   "author" : [
+      "H.Merijn Brand <[email protected]>"
+   ],
    "prereqs" : {
+      "runtime" : {
+         "recommends" : {
+            "IO::Scalar" : "0",
+            "File::Temp" : "0.2308",
+            "Data::Peek" : "0.48"
+         },
+         "requires" : {
+            "perl" : "5.008001",
+            "Encode" : "0",
+            "Data::Peek" : "0",
+            "Exporter" : "0",
+            "Data::Dumper" : "0",
+            "File::Temp" : "0.22",
+            "Carp" : "0"
+         }
+      },
       "configure" : {
          "requires" : {
             "ExtUtils::MakeMaker" : "0"
          }
       },
       "test" : {
-         "requires" : {
-            "Test::Harness" : "0",
-            "Test::NoWarnings" : "0",
-            "Test::More" : "0.88"
-         },
          "recommends" : {
-            "Test::More" : "1.302120"
-         }
-      },
-      "runtime" : {
-         "requires" : {
-            "Data::Dumper" : "0",
-            "Data::Peek" : "0",
-            "Exporter" : "0",
-            "Carp" : "0",
-            "perl" : "5.008001",
-            "Encode" : "0",
-            "File::Temp" : "0.22"
+            "Test::More" : "1.302140"
          },
-         "recommends" : {
-            "IO::Scalar" : "0",
-            "File::Temp" : "0.2304",
-            "Data::Peek" : "0.47"
+         "requires" : {
+            "Test::More" : "0.88",
+            "Test::NoWarnings" : "0",
+            "Test::Harness" : "0"
          }
       }
    },
-   "resources" : {
-      "license" : [
-         "http://dev.perl.org/licenses/";
-      ],
-      "repository" : {
-         "type" : "git",
-         "web" : "https://github.com/Tux/Spreadsheet-Read";,
-         "url" : "https://github.com/Tux/Spreadsheet-Read";
-      }
-   },
    "provides" : {
       "Spreadsheet::Read" : {
-         "file" : "Read.pm",
-         "version" : "0.78"
+         "version" : "0.79",
+         "file" : "Read.pm"
       }
    },
-   "license" : [
-      "perl_5"
-   ],
-   "dynamic_config" : 1,
-   "author" : [
-      "H.Merijn Brand <[email protected]>"
-   ],
+   "abstract" : "Meta-Wrapper for reading spreadsheet data",
+   "generated_by" : "Author",
+   "meta-spec" : {
+      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec";,
+      "version" : 2
+   },
+   "version" : "0.79",
    "release_status" : "stable",
    "optional_features" : {
-      "opt_tools" : {
-         "description" : "Spreadsheet tools",
-         "prereqs" : {
-            "runtime" : {
-               "recommends" : {
-                  "Tk::NoteBook" : "0",
-                  "Tk" : "804.034",
-                  "Tk::TableMatrix::Spreadsheet" : "0"
-               }
-            }
-         }
-      },
-      "opt_csv" : {
-         "description" : "Provides parsing of CSV streams",
+      "opt_excelx" : {
+         "description" : "Provides parsing of Microsoft Excel 2007 files",
          "prereqs" : {
             "runtime" : {
-               "recommends" : {
-                  "Text::CSV_XS" : "1.34",
-                  "Text::CSV_PP" : "1.95",
-                  "Text::CSV" : "1.95"
-               },
                "requires" : {
-                  "Text::CSV_XS" : "0.71"
+                  "Spreadsheet::ParseXLSX" : "0.13",
+                  "Spreadsheet::ParseExcel::FmtDefault" : "0"
+               },
+               "recommends" : {
+                  "Spreadsheet::ParseXLSX" : "0.27"
                }
             }
          }
@@ -96,39 +88,47 @@
             }
          }
       },
-      "opt_excelx" : {
+      "opt_csv" : {
          "prereqs" : {
             "runtime" : {
                "recommends" : {
-                  "Spreadsheet::ParseXLSX" : "0.27"
+                  "Text::CSV" : "1.97",
+                  "Text::CSV_PP" : "1.97",
+                  "Text::CSV_XS" : "1.36"
                },
                "requires" : {
-                  "Spreadsheet::ParseExcel::FmtDefault" : "0",
-                  "Spreadsheet::ParseXLSX" : "0.13"
+                  "Text::CSV_XS" : "0.71"
                }
             }
          },
-         "description" : "Provides parsing of Microsoft Excel 2007 files"
+         "description" : "Provides parsing of CSV streams"
       },
       "opt_excel" : {
-         "description" : "Provides parsing of Microsoft Excel files",
          "prereqs" : {
             "runtime" : {
+               "recommends" : {
+                  "Spreadsheet::ParseExcel" : "0.65"
+               },
                "requires" : {
                   "Spreadsheet::ParseExcel" : "0.34",
                   "Spreadsheet::ParseExcel::FmtDefault" : "0"
-               },
+               }
+            }
+         },
+         "description" : "Provides parsing of Microsoft Excel files"
+      },
+      "opt_tools" : {
+         "prereqs" : {
+            "runtime" : {
                "recommends" : {
-                  "Spreadsheet::ParseExcel" : "0.65"
+                  "Tk::TableMatrix::Spreadsheet" : "0",
+                  "Tk" : "804.034",
+                  "Tk::NoteBook" : "0"
                }
             }
-         }
+         },
+         "description" : "Spreadsheet tools"
       }
    },
-   "generated_by" : "Author",
-   "meta-spec" : {
-      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec";,
-      "version" : 2
-   },
-   "version" : "0.78"
+   "name" : "Spreadsheet-Read"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/META.yml 
new/Spreadsheet-Read-0.79/META.yml
--- old/Spreadsheet-Read-0.78/META.yml  2018-01-29 17:40:46.000000000 +0100
+++ new/Spreadsheet-Read-0.79/META.yml  2018-08-29 17:33:14.000000000 +0200
@@ -35,12 +35,12 @@
 provides: 
   Spreadsheet::Read: 
     file: Read.pm
-    version: '0.78'
+    version: '0.79'
 recommends: 
-  Data::Peek: '0.47'
-  File::Temp: '0.2304'
+  Data::Peek: '0.48'
+  File::Temp: '0.2308'
   IO::Scalar: 0
-  Test::More: '1.302120'
+  Test::More: '1.302140'
 requires: 
   Carp: 0
   Data::Dumper: 0
@@ -55,4 +55,4 @@
 resources: 
   license: http://dev.perl.org/licenses/
   repository: https://github.com/Tux/Spreadsheet-Read
-version: '0.78'
+version: '0.79'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/Read.pm 
new/Spreadsheet-Read-0.79/Read.pm
--- old/Spreadsheet-Read-0.78/Read.pm   2018-01-25 08:11:22.000000000 +0100
+++ new/Spreadsheet-Read-0.79/Read.pm   2018-08-29 10:38:35.000000000 +0200
@@ -36,7 +36,7 @@
 use strict;
 use warnings;
 
-our $VERSION = "0.78";
+our $VERSION = "0.79";
 sub  Version { $VERSION }
 
 use Carp;
@@ -64,35 +64,41 @@
     [ ios  => "IO::Scalar",                            ""              ],
     [ dmp  => "Data::Peek",                            ""              ],
     );
-my %can = map {
-    my $p = $_;
-    my $preset = $ENV{"SPREADSHEET_READ_\U$p->[0]"};
-    if ($preset and $preset =~ m/^[\w:]+$/) {
-       if (eval "require $preset" and not $@) {
-           # forcing a parser should still check the version
-           for (grep { $p->[1] eq $preset and $p->[2] } @parsers) {
-               my $ok;
-               my $has = $preset->VERSION;
-               $has =~ s/_[0-9]+$//;                   # Remove beta-part
-               if ($p->[2] =~ m/^v([0-9.]+)/) {        # clumsy versions
-                   my @min = split m/\./ => $1;
-                   $has =~ s/^v//;
-                   my @has = split m/\./ => $has;
-                   $ok = (($has[0] * 1000 + $has[1]) * 1000 + $has[2]) >=
-                         (($min[0] * 1000 + $min[1]) * 1000 + $min[2]);
-                   }
-               else {  # normal versions
-                   $ok = $has >= $p->[2];
-                   }
-               $ok or $preset = "!$preset";
-               }
+my %can = ( supports => { map { $_->[1] => $_->[2] } @parsers });
+foreach my $p (@parsers) {
+    my $format = $p->[0];
+    $can{$format} and next;
+    $can{$format} = "";
+    my $preset = $ENV{"SPREADSHEET_READ_\U$format"} or next;
+    my $min_version = $can{supports}{$preset};
+    unless ($min_version) {
+       # Catch weirdness like $SPREADSHEET_READ_XLSX = "DBD::Oracle"
+       $can{$format} = "!$preset is not supported for the $format format";
+       next;
+       }
+    if (eval "local \$_; require $preset" and not $@) {
+       # forcing a parser should still check the version
+       my $ok;
+       my $has = $preset->VERSION;
+       $has =~ s/_[0-9]+$//;                   # Remove beta-part
+       if ($min_version =~ m/^v([0-9.]+)/) {   # clumsy versions
+           my @min = split m/\./ => $1;
+           $has =~ s/^v//;
+           my @has = split m/\./ => $has;
+           $ok = (($has[0] * 1000 + $has[1]) * 1000 + $has[2]) >=
+                 (($min[0] * 1000 + $min[1]) * 1000 + $min[2]);
            }
-       else {
-           $preset = "!$preset";
+       else {  # normal versions
+           $ok = $has >= $min_version;
            }
+       $ok or $preset = "!$preset";
+       }
+    else {
+       $preset = "!$preset";
        }
-    $p->[0] => $preset || "";
-    } @parsers;
+    $can{$format} = $preset;
+    }
+delete $can{supports};
 for (@parsers) {
     my ($flag, $mod, $vsn) = @$_;
     $can{$flag} and next;
@@ -182,7 +188,10 @@
 sub parses {
     ref $_[0] eq __PACKAGE__ and shift;
     my $type = _parser (shift) or  return 0;
-    $can{$type} =~ m/^!/ and return 0;
+    if ($can{$type} =~ m/^!\s*(.*)/) {
+       $@ = $1;
+       return 0;
+       }
     return $can{$type};
     } # parses
 
@@ -526,32 +535,56 @@
        return _clipsheets \%opt, [ @data ];
        }
 
-    # From /etc/magic: Microsoft Office Document
-    if ($io_txt && $_parser !~ m/^xlsx?$/ &&
-                   $txt =~ m{^(\376\067\0\043
-                              |\320\317\021\340\241\261\032\341
-                              |\333\245-\0\0\0)}x) {
-       $can{xls} or croak "Spreadsheet::ParseExcel not installed";
-       my $tmpfile;
-       if ($can{ios}) { # Do not use a temp file if IO::Scalar is available
-           $tmpfile = \$txt;
+    if ($io_txt) { # && $_parser !~ m/^xlsx?$/) {
+       if (    # /etc/magic: Microsoft Office Document
+               $txt =~ m{\A(\376\067\0\043
+                           |\320\317\021\340\241\261\032\341
+                           |\333\245-\0\0\0)}x
+               # /usr/share/misc/magic
+            || $txt =~ m{\A.{2080}Microsoft Excel 5.0 Worksheet}
+            || $txt =~ m{\A\x09\x04\x06\x00\x00\x00\x10\x00}
+               ) {
+           $can{xls} or croak "Spreadsheet::ParseExcel not installed";
+           my $tmpfile;
+           if ($can{ios}) { # Do not use a temp file if IO::Scalar is available
+               $tmpfile = \$txt;
+               }
+           else {
+               $tmpfile = File::Temp->new (SUFFIX => ".xls", UNLINK => 1);
+               binmode $tmpfile;
+               print   $tmpfile $txt;
+               close   $tmpfile;
+               }
+           open $io_ref, "<", $tmpfile or return;
+           $io_txt = 0;
+           $_parser = _parser ($opt{parser} = "xls");
+           }
+       elsif ( # /usr/share/misc/magic
+               $txt =~ 
m{\APK\003\004.{4,30}(?:\[Content_Types\]\.xml|_rels/\.rels)}
+               ) {
+           $can{xlsx} or croak "XLSX parser not installed";
+           my $tmpfile;
+           if ($can{ios}) { # Do not use a temp file if IO::Scalar is available
+               $tmpfile = \$txt;
+               }
+           else {
+               $tmpfile = File::Temp->new (SUFFIX => ".xlsx", UNLINK => 1);
+               binmode $tmpfile;
+               print   $tmpfile $txt;
+               close   $tmpfile;
+               }
+           open $io_ref, "<", $tmpfile or return;
+           $io_txt = 0;
+           $_parser = _parser ($opt{parser} = "xlsx");
            }
-       else {
-           $tmpfile = File::Temp->new (SUFFIX => ".xls", UNLINK => 1);
-           binmode $tmpfile;
-           print   $tmpfile $txt;
-           close   $tmpfile;
-           }
-       open $io_ref, "<", $tmpfile or return;
-       $io_txt = 0;
-       $_parser = _parser ($opt{parser} = "xls");
        }
     if ($opt{parser} ? $_parser =~ m/^xlsx?$/
                     : ($io_fil && $txt =~ m/\.(xlsx?)$/i && ($_parser = $1))) {
        my $parse_type = $_parser =~ m/x$/i ? "XLSX" : "XLS";
        my $parser = $can{lc $parse_type} or
            croak "Parser for $parse_type is not installed";
-       $debug and print STDERR "Opening $parse_type $txt using $parser-", 
$can{lc $parse_type}->VERSION, "\n";
+       $debug and print STDERR "Opening $parse_type ", $io_ref ? "<REF>" : 
$txt,
+           " using $parser-", $can{lc $parse_type}->VERSION, "\n";
        $opt{passwd} and $parser_opts{Password} = $opt{passwd};
        my $oBook = eval {
            $io_ref
@@ -1083,15 +1116,16 @@
 module that does the actual spreadsheet scanning.
 
 For OpenOffice and/or LibreOffice this module uses
-L<Spreadsheet::ReadSXC|http://metacpan.org/release/Spreadsheet-ReadSXC>
+L<Spreadsheet::ReadSXC|https://metacpan.org/release/Spreadsheet-ReadSXC>
 
 For Microsoft Excel this module uses
-L<Spreadsheet::ParseExcel|http://metacpan.org/release/Spreadsheet-ParseExcel>,
-L<Spreadsheet::ParseXLSX|http://metacpan.org/release/Spreadsheet-ParseXLSX>, or
-L<Spreadsheet::XLSX|http://metacpan.org/release/Spreadsheet-XLSX> 
(discouraged).
+L<Spreadsheet::ParseExcel|https://metacpan.org/release/Spreadsheet-ParseExcel>,
+L<Spreadsheet::ParseXLSX|https://metacpan.org/release/Spreadsheet-ParseXLSX>, 
or
+L<Spreadsheet::XLSX|https://metacpan.org/release/Spreadsheet-XLSX> (stronly
+discouraged).
 
-For CSV this module uses 
L<Text::CSV_XS|http://metacpan.org/release/Text-CSV_XS>
-or L<Text::CSV_PP|http://metacpan.org/release/Text-CSV_PP>.
+For CSV this module uses 
L<Text::CSV_XS|https://metacpan.org/release/Text-CSV_XS>
+or L<Text::CSV_PP|https://metacpan.org/release/Text-CSV_PP>.
 
 For SquirrelCalc there is a very simplistic built-in parser
 
@@ -1173,18 +1207,27 @@
 
  my $book = ReadData ($content);
 
- my $book = ReadData ($fh, parser => "xls");
+ my $book = ReadData ($content,  parser => "xlsx");
+
+ my $book = ReadData ($fh,       parser => "xlsx");
+
+ my $book = ReadData (\$content, parser => "xlsx");
 
-Tries to convert the given file, string, or stream to the data
-structure described above.
+Tries to convert the given file, string, or stream to the data structure
+described above.
 
-Processing Excel data from a stream or content is supported through
-a L<File::Temp|https://metacpan.org/release/File-Temp> temporary file or
+Processing Excel data from a stream or content is supported through a
+L<File::Temp|https://metacpan.org/release/File-Temp> temporary file or
 L<IO::Scalar|https://metacpan.org/release/IO-Scalar> when available.
 
 L<Spreadsheet::ReadSXC|https://metacpan.org/release/Spreadsheet-ReadSXC>
 does preserve sheet order as of version 0.20.
 
+Choosing between C<$content> and C<\\$content> (with or without passing
+the desired C<parser> option) may be depending on trial and terror.
+C<ReadData> does try to determine parser type on content if needed, but
+not all combinations are checked, and not all signatures are builtin.
+
 Currently supported options are:
 
 =over 2
@@ -1655,7 +1698,7 @@
 =head3 Merged cells
 
 Note that only
-L<Spreadsheet::ReadSXC|http://metacpan.org/release/Spreadsheet-ReadSXC>
+L<Spreadsheet::ReadSXC|https://metacpan.org/release/Spreadsheet-ReadSXC>
 documents the use of merged cells, and not in a way useful for the spreadsheet
 consumer.
 
@@ -1663,15 +1706,15 @@
 for the web might).
 
 The documentation of merged areas in
-L<Spreadsheet::ParseExcel|http://metacpan.org/release/Spreadsheet-ParseExcel> 
and
-L<Spreadsheet::ParseXLSX|http://metacpan.org/release/Spreadsheet-ParseXLSX> can
+L<Spreadsheet::ParseExcel|https://metacpan.org/release/Spreadsheet-ParseExcel> 
and
+L<Spreadsheet::ParseXLSX|https://metacpan.org/release/Spreadsheet-ParseXLSX> 
can
 be found in
-L<Spreadsheet::ParseExcel::Worksheet|http://metacpan.org/release/Spreadsheet-ParseExcel-Worksheet>
-and 
L<Spreadsheet::ParseExcel::Cell|http://metacpan.org/release/Spreadsheet-ParseExcel-Cell>.
+L<Spreadsheet::ParseExcel::Worksheet|https://metacpan.org/release/Spreadsheet-ParseExcel-Worksheet>
+and 
L<Spreadsheet::ParseExcel::Cell|https://metacpan.org/release/Spreadsheet-ParseExcel-Cell>.
 
-None of basic 
L<Spreadsheet::XLSX|http://metacpan.org/release/Spreadsheet-XLSX>,
-L<Spreadsheet::ParseExcel|http://metacpan.org/release/Spreadsheet-ParseExcel>, 
and
-L<Spreadsheet::ParseXLSX|http://metacpan.org/release/Spreadsheet-ParseXLSX> 
manual
+None of basic 
L<Spreadsheet::XLSX|https://metacpan.org/release/Spreadsheet-XLSX>,
+L<Spreadsheet::ParseExcel|https://metacpan.org/release/Spreadsheet-ParseExcel>,
 and
+L<Spreadsheet::ParseXLSX|https://metacpan.org/release/Spreadsheet-ParseXLSX> 
manual
 pages mention merged cells at all.
 
 This module just tries to return the information in a generic way.
@@ -1873,6 +1916,23 @@
 
 =back
 
+=item Other parsers
+
+Add support for new(er) parsers for already supported formats, like
+
+=over 2
+
+=item Data::XLSX::Parser
+
+Data::XLSX::Parser provides faster way to parse Microsoft Excel's .xlsx
+files. The implementation of this module is highly inspired from Python's
+FastXLSX library.
+
+This is SAX based parser, so you can parse very large XLSX file with
+lower memory usage.
+
+=back
+
 =item Other spreadsheet formats
 
 I consider adding any spreadsheet interface that offers a usable API.
@@ -1912,68 +1972,68 @@
 
 =item Text::CSV_XS, Text::CSV_PP
 
-See L<Text::CSV_XS|http://metacpan.org/release/Text-CSV_XS> ,
-L<Text::CSV_PP|http://metacpan.org/release/Text-CSV_PP> , and
-L<Text::CSV|http://metacpan.org/release/Text-CSV> documentation.
+See L<Text::CSV_XS|https://metacpan.org/release/Text-CSV_XS> ,
+L<Text::CSV_PP|https://metacpan.org/release/Text-CSV_PP> , and
+L<Text::CSV|https://metacpan.org/release/Text-CSV> documentation.
 
-L<Text::CSV|http://metacpan.org/release/Text-CSV> is a wrapper over 
Text::CSV_XS (the fast XS version) and/or
-L<Text::CSV_PP|http://metacpan.org/release/Text-CSV_PP> (the pure perl 
version).
+L<Text::CSV|https://metacpan.org/release/Text-CSV> is a wrapper over 
Text::CSV_XS (the fast XS version) and/or
+L<Text::CSV_PP|https://metacpan.org/release/Text-CSV_PP> (the pure perl 
version).
 
 =item Spreadsheet::ParseExcel
 
-L<Spreadsheet::ParseExcel|http://metacpan.org/release/Spreadsheet-ParseExcel> 
is
+L<Spreadsheet::ParseExcel|https://metacpan.org/release/Spreadsheet-ParseExcel> 
is
 the best parser for old-style Microsoft Excel (.xls) files.
 
 =item Spreadsheet::ParseXLSX
 
-L<Spreadsheet::ParseXLSX|http://metacpan.org/release/Spreadsheet-ParseXLSX> is
-like 
L<Spreadsheet::ParseExcel|http://metacpan.org/release/Spreadsheet-ParseExcel>,
+L<Spreadsheet::ParseXLSX|https://metacpan.org/release/Spreadsheet-ParseXLSX> is
+like 
L<Spreadsheet::ParseExcel|https://metacpan.org/release/Spreadsheet-ParseExcel>,
 but for new Microsoft Excel 2007+ files (.xlsx). They have the same API.
 
-This module uses L<XML::Twig|http://metacpan.org/release/XML-Twig> to parse the
+This module uses L<XML::Twig|https://metacpan.org/release/XML-Twig> to parse 
the
 internal XML.
 
 =item Spreadsheet::XLSX
 
-See L<Spreadsheet::XLSX|http://metacpan.org/release/Spreadsheet-XLSX>
+See L<Spreadsheet::XLSX|https://metacpan.org/release/Spreadsheet-XLSX>
 documentation.
 
 This module is dead and deprecated. It is B<buggy and unmaintained>.  I<Please>
-use L<Spreadsheet::ParseXLSX|http://metacpan.org/release/Spreadsheet-ParseXLSX>
+use 
L<Spreadsheet::ParseXLSX|https://metacpan.org/release/Spreadsheet-ParseXLSX>
 instead.
 
 =item Spreadsheet::ReadSXC
 
-L<Spreadsheet::ReadSXC|http://metacpan.org/release/Spreadsheet-ReadSXC> is a
+L<Spreadsheet::ReadSXC|https://metacpan.org/release/Spreadsheet-ReadSXC> is a
 parser for OpenOffice/LibreOffice (.sxc and .ods) spreadsheet files.
 
 =item Spreadsheet::BasicRead
 
-See L<Spreadsheet::BasicRead|http://metacpan.org/release/Spreadsheet-BasicRead>
+See 
L<Spreadsheet::BasicRead|https://metacpan.org/release/Spreadsheet-BasicRead>
 for xlscat-like functionality (Excel only)
 
 =item Spreadsheet::ConvertAA
 
-See L<Spreadsheet::ConvertAA|http://metacpan.org/release/Spreadsheet-ConvertAA>
+See 
L<Spreadsheet::ConvertAA|https://metacpan.org/release/Spreadsheet-ConvertAA>
 for an alternative set of L</cell2cr>/L</cr2cell> pair.
 
 =item Spreadsheet::Perl
 
-L<Spreadsheet::Perl|http://metacpan.org/release/Spreadsheet-Perl> offers a Pure
+L<Spreadsheet::Perl|https://metacpan.org/release/Spreadsheet-Perl> offers a 
Pure
 Perl implementation of a spreadsheet engine.  Users that want this format to be
 supported in Spreadsheet::Read are hereby motivated to offer patches. It is
 not high on my TODO-list.
 
 =item Spreadsheet::CSV
 
-L<Spreadsheet::CSV|http://metacpan.org/release/Spreadsheet-CSV> offers the
+L<Spreadsheet::CSV|https://metacpan.org/release/Spreadsheet-CSV> offers the
 interesting approach of seeing all supported spreadsheet formats as if it were
-CSV, mimicking the L<Text::CSV_XS|http://metacpan.org/release/Text-CSV_XS>
+CSV, mimicking the L<Text::CSV_XS|https://metacpan.org/release/Text-CSV_XS>
 interface.
 
 =item xls2csv
 
-L<xls2csv|http://metacpan.org/release/xls2csv> offers an alternative for my
+L<xls2csv|https://metacpan.org/release/xls2csv> offers an alternative for my
 C<xlscat -c>, in the xls2csv tool, but this tool focuses on character encoding
 transparency, and requires some other modules.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/examples/ss-dups-tk.pl 
new/Spreadsheet-Read-0.79/examples/ss-dups-tk.pl
--- old/Spreadsheet-Read-0.78/examples/ss-dups-tk.pl    2018-01-01 
14:51:00.000000000 +0100
+++ new/Spreadsheet-Read-0.79/examples/ss-dups-tk.pl    2018-03-28 
09:10:53.000000000 +0200
@@ -1,7 +1,7 @@
 #!/pro/bin/perl
 
 # ss-dup-tk.pl: Find dups in spreadsheet
-#        (m)'09 [23-01-2009] Copyright H.M.Brand 2005-2018
+#        (m)'18 [28-03-2018] Copyright H.M.Brand 2005-2018
 
 use strict;
 use warnings;
@@ -11,10 +11,10 @@
     print
        "usage: $0 [-t] [-S <sheets>] [-R <rows>] [-C columns] [-F <fields>]\n",
        "\t-t          Only check on true values\n",
-       "\t-S sheets   Check sheet(s).  Defaul = 1,   1,3-5,all\n",
-       "\t-R rows     Check row(s).    Defaul = all, 6,19-66\n",
-       "\t-C columns  Check column(s). Defaul = all, 2,5-9\n",
-       "\t-F fields   Check field(s).  Defaul = all, A1,A2,B15,C23\n";
+       "\t-S sheets   Check sheet(s).  Default = 1,   1,3-5,all\n",
+       "\t-R rows     Check row(s).    Default = all, 6,19-66\n",
+       "\t-C columns  Check column(s). Default = all, 2,5-9\n",
+       "\t-F fields   Check field(s).  Default = all, A1,A2,B15,C23\n";
     exit $err;
     } # usage
 
@@ -42,7 +42,6 @@
 
 @opt_S or @opt_S = (1);
 
-
 use Tk;
 use Tk::ROText;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/examples/xls2csv 
new/Spreadsheet-Read-0.79/examples/xls2csv
--- old/Spreadsheet-Read-0.78/examples/xls2csv  2018-01-01 14:51:07.000000000 
+0100
+++ new/Spreadsheet-Read-0.79/examples/xls2csv  2018-08-29 10:28:43.000000000 
+0200
@@ -1,12 +1,12 @@
 #!/pro/bin/perl
 
 # xls2csv: Convert Microsoft Excel spreadsheet to CSV
-#         (m)'17 [07-06-2017] Copyright H.M.Brand 2008-2018
+#         (m)'18 [29-08-2018] Copyright H.M.Brand 2008-2018
 
 use strict;
 use warnings;
 
-our $VERSION = "3.3";
+our $VERSION = "3.4";
 (my $cmd = $0) =~ s{.*/}{};
 
 use Text::CSV_XS;
@@ -14,7 +14,8 @@
 
 sub usage {
     my $err = shift and select STDERR;
-    print "usage: $cmd [ --all [ --no-pfx ] | -o file.csv ] file.xls\n";
+    print "usage: $cmd [-A [-N] | -o file.csv] [-f] [-i] file.xls\n";
+    print "       $cmd --help | --man | --info\n";
     @_ and print join "\n", @_, "";
     exit $err;
     } # usage
@@ -23,19 +24,26 @@
 GetOptions (
     "help|?"    => sub { usage 0; },
     "V|version" => sub { print "$cmd [$VERSION]\n"; exit 0; },
+    "man"       => sub { exec "pod2man $0 | nroff -man"; },
+    "info"      => sub { require Pod::Usage;
+                        Pod::Usage::pod2usage (VERBOSE => 2);
+                        exit;
+                        },
 
     "o|c|out=s" => \my $csv,
+    "i|s|in=s" => \my $xls,
     "f|force!"  => \my $opt_f,
 
     "A|all!"    => \my $opt_a,
     "N|no-pfx!" => \my $opt_N,
     ) or usage 1;
 
-my $xls;
-foreach my $i (reverse 0 .. $#ARGV) {
-    -f $ARGV[$i] or next;
-    $xls = splice @ARGV, $i, 1;
-    last;
+unless ($xls) {
+    foreach my $i (reverse 0 .. $#ARGV) {
+       -f $ARGV[$i] or next;
+       $xls = splice @ARGV, $i, 1;
+       last;
+       }
     }
 
    $xls or usage 1, "No input file";
@@ -75,3 +83,86 @@
 open STDOUT, ">", $csv or die "$csv: $!\n";
 $^O eq "MSWin32" and $xls = qq{"$xls"};
 exec { "xlscat" } "xlscat", "-c", @ARGV, $xls;
+
+__END__
+
+=pod
+
+=head1 SYNOPSIS
+
+   xls2csv [ --all [ --no-pfx ] | -o file.csv ] [-f] [-i] file.xls
+   xls2csv   --help | --man | --info
+
+=head1 DESCRIPTION
+
+Convert a spreadsheet (all formats supported by L<Spreadsheet::Read>) to CSV
+(using L<Text::CSV_XS>).
+
+=head1 OPTIONS
+
+=over
+
+=item -?
+
+=item --help
+
+Print short usage and exit.
+
+=item --man
+
+Print this help using nroff and exit.
+
+=item --info
+
+Print this help and exit.
+
+=item -V
+
+=item --version
+
+Print the version and exit.
+
+=item -f
+
+=item --force
+
+Overwrite existing output file.
+
+=item -A
+
+=item --all
+
+Output data from all sheets.
+
+Each sheet will go to extra file with name built from output CSV-file and
+sheet name.
+
+=item -N
+
+=item --no-pfx
+
+If specified, dump all will not use output CSV-file but sheet name only.
+
+=item -o CSV-file
+
+=item -c CSV-file
+
+=item --out=CSV-file
+
+Output file name (used only with C<< --all >> and without C<< --no-pfx >>).
+
+Default value is derived from XLS-file.
+
+=item -i XLS-file
+
+=item -s XLS-file
+
+=item --in=XLS-file
+
+Allows to specify input xls file.
+
+Default: Last ARGUMENT file that exists.
+
+=back
+
+=cut
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/examples/xlscat 
new/Spreadsheet-Read-0.79/examples/xlscat
--- old/Spreadsheet-Read-0.78/examples/xlscat   2018-01-01 14:51:13.000000000 
+0100
+++ new/Spreadsheet-Read-0.79/examples/xlscat   2018-06-27 11:33:30.000000000 
+0200
@@ -2,12 +2,12 @@
 
 # xlscat:  show XLS/SXC file as Text
 # xlsgrep: grep pattern
-#         (m)'17 [2017-11-30] Copyright H.M.Brand 2005-2018
+#         (m)'18 [2018-06-27] Copyright H.M.Brand 2005-2018
 
 use strict;
 use warnings;
 
-our $VERSION = "3.12";
+our $VERSION = "3.14";
 
 my $is_grep = $0 =~ m/grep$/;
 
@@ -31,7 +31,7 @@
        "       -a <enc>    Set encoding for output\n",
        "       -U          Set encoding for output to utf-8 (short for -a 
utf-8)\n",
        "    Input CSV:\n",
-       "       --in-sep=c  Set input sep_char for CSV\n",
+       "       --in-sep=c  Set input sep_char for CSV (c can be 'TAB')\n",
        "    Input XLS:\n",
        "       --dtfmt=fmt Specify the default date format to replace 
'm-d-yy'\n",
        "                   the default replacement is 'yyyy-mm-dd'\n",
@@ -46,6 +46,7 @@
        "       -A          Show field attributes in ANSI escapes\n",
        "       -h[#]       Show # header lines\n",
        "       -D          Dump each record with Data::Peek or Data::Dumper\n",
+       "        --hash     Like -D but as hash with first row as keys\n",
        $is_grep ? (
        "    Grep options:\n",
        "       -i          Ignore case\n",
@@ -84,6 +85,7 @@
 my $opt_v = 0;         # Verbosity for xlscat
 my $opt_d = 0;         # Debug level for Spreadsheet::Read
 my $opt_h = 0;         # Number of header lines for grep or -L
+my $opt_D = 0;         # Dump: 0 = none, 1 = array, 2 = hash
 my $clip  = 1;
 my $enc_i;             # Input  encoding
 my $enc_o;             # Output encoding
@@ -121,7 +123,8 @@
     "u|unformatted!"   => \my $opt_u,  # Show unformatted values
     "v|verbose:1"      => \$opt_v,
     "d|debug:1"                => \$opt_d,
-    "D|dump!"          => \my $opt_D,  # Use Data::Peek or Data::Dumper
+    "D|dump!"          => \   $opt_D,  # Use Data::Peek or Data::Dumper
+      "hash!"          => sub { $opt_D = 2 },
     "H|html:1"         => \my $opt_H,  # Output in HTML
       "noclip"         => sub { $clip = 0 },
       "strip:3"                => \my $strip,
@@ -228,6 +231,17 @@
        };
     }
 
+if ($sep) {
+    my %sep = (
+       tab             => "\t",
+       pipe            => "|",
+       colon           => ":",
+       semicolon       => ";",
+       comma           => ",",
+       );
+    $sep = $sep{lc $sep} || $sep;
+    }
+
 push @RDarg, debug => $opt_d, clip => $clip;
 $opt_A         and push @RDarg, attr  => 1;
 defined $sep   and push @RDarg, sep   => $sep, parser => "csv";
@@ -415,7 +429,8 @@
        $is_grep && $r > $opt_h &&
            ! grep { defined $_ && $_ =~ $pattern } @row and next;
        if ($opt_D) {
-           ddumper \@row;
+           ddumper ($opt_D == 1 ? \@row :
+               { map { $s->{cell}[$_ + 1][1] => $row[$_] } 0 .. $#row });
            next;
            }
        if ($opt_L) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/t/610_xlsx.t 
new/Spreadsheet-Read-0.79/t/610_xlsx.t
--- old/Spreadsheet-Read-0.78/t/610_xlsx.t      2018-01-22 09:03:25.000000000 
+0100
+++ new/Spreadsheet-Read-0.79/t/610_xlsx.t      2018-03-20 13:43:26.000000000 
+0100
@@ -5,7 +5,7 @@
 
 BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; }
 
-my     $tests = 116;
+my     $tests = 128;
 use     Test::More;
 require Test::NoWarnings;
 
@@ -157,6 +157,22 @@
     is ($ref->[1]{A1},         undef, "undef A1");
     }
 
+{   sub chk_test {
+       my ($msg, $xls) = @_;
+
+       is (ref $xls,           "ARRAY",        "Return type for $msg");
+       is ($xls->[0]{type},    "xlsx",         "Spreadsheet type XLSX");
+       is ($xls->[0]{sheets},  2,              "Sheet count");
+       } # chk_test
+
+    my $data = $content;
+    open my $fh, "<", "files/test.xlsx";
+    chk_test ( " FH    parser",    ReadData ( $fh,   parser => "xlsx")); close 
$fh;
+    chk_test ("\\DATA  parser",    ReadData (\$data, parser => "xlsx"));
+    chk_test ( " DATA  no parser", ReadData ( $data                  ));
+    chk_test ( " DATA  parser",    ReadData ( $data, parser => "xlsx"));
+    }
+
 unless ($ENV{AUTOMATED_TESTING}) {
     Test::NoWarnings::had_no_warnings ();
     $tests++;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Spreadsheet-Read-0.78/t/999_fail.t 
new/Spreadsheet-Read-0.79/t/999_fail.t
--- old/Spreadsheet-Read-0.78/t/999_fail.t      1970-01-01 01:00:00.000000000 
+0100
+++ new/Spreadsheet-Read-0.79/t/999_fail.t      2018-01-31 09:34:10.000000000 
+0100
@@ -0,0 +1,17 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Test::More"; }
+
+my     $tests = 2;
+use     Test::More;
+require Test::NoWarnings;
+
+use     Spreadsheet::Read;
+
+is (Spreadsheet::Read::parses ("xlsx"), 0, "Invalid module name for xlsx");
+like ($@, qr/^Test::More is not supported/, "Error reason");
+
+done_testing ($tests);

++++++ nonstdperlpath.patch ++++++
--- /var/tmp/diff_new_pack.WQpp81/_old  2018-09-24 13:12:11.833818837 +0200
+++ /var/tmp/diff_new_pack.WQpp81/_new  2018-09-24 13:12:11.837818830 +0200
@@ -1,60 +1,54 @@
-Index: Spreadsheet-Read-0.78/Read.pm
-===================================================================
---- Spreadsheet-Read-0.78.orig/Read.pm
-+++ Spreadsheet-Read-0.78/Read.pm
+diff -ur Spreadsheet-Read-0.79/examples/ss2tk 
Spreadsheet-Read-0.79_fix/examples/ss2tk
+--- Spreadsheet-Read-0.79/examples/ss2tk       2018-01-01 14:51:06.000000000 
+0100
++++ Spreadsheet-Read-0.79_fix/examples/ss2tk   2018-09-20 10:08:55.480707378 
+0200
 @@ -1,4 +1,4 @@
 -#!/pro/bin/perl
 +#!/usr/bin/perl
  
- package Spreadsheet::Read;
- 
-Index: Spreadsheet-Read-0.78/examples/ss-dups-tk.pl
-===================================================================
---- Spreadsheet-Read-0.78.orig/examples/ss-dups-tk.pl
-+++ Spreadsheet-Read-0.78/examples/ss-dups-tk.pl
+ # ss2tk: show SpreadSheet file in Tk::TableMatrix::Spreadsheet (*)
+ #       (m)'17 [2017-07-03] Copyright H.M.Brand 2005-2018
+diff -ur Spreadsheet-Read-0.79/examples/ssdiff 
Spreadsheet-Read-0.79_fix/examples/ssdiff
+--- Spreadsheet-Read-0.79/examples/ssdiff      2016-11-27 12:28:35.000000000 
+0100
++++ Spreadsheet-Read-0.79_fix/examples/ssdiff  2018-09-20 10:08:55.480707378 
+0200
 @@ -1,4 +1,4 @@
 -#!/pro/bin/perl
 +#!/usr/bin/perl
  
- # ss-dup-tk.pl: Find dups in spreadsheet
- #       (m)'09 [23-01-2009] Copyright H.M.Brand 2005-2018
-Index: Spreadsheet-Read-0.78/examples/ss2tk
-===================================================================
---- Spreadsheet-Read-0.78.orig/examples/ss2tk
-+++ Spreadsheet-Read-0.78/examples/ss2tk
+ use strict;
+ use warnings;
+diff -ur Spreadsheet-Read-0.79/examples/ss-dups-tk.pl 
Spreadsheet-Read-0.79_fix/examples/ss-dups-tk.pl
+--- Spreadsheet-Read-0.79/examples/ss-dups-tk.pl       2018-03-28 
09:10:53.000000000 +0200
++++ Spreadsheet-Read-0.79_fix/examples/ss-dups-tk.pl   2018-09-20 
10:08:55.480707378 +0200
 @@ -1,4 +1,4 @@
 -#!/pro/bin/perl
 +#!/usr/bin/perl
  
- # ss2tk: show SpreadSheet file in Tk::TableMatrix::Spreadsheet (*)
- #       (m)'17 [2017-07-03] Copyright H.M.Brand 2005-2018
-Index: Spreadsheet-Read-0.78/examples/ssdiff
-===================================================================
---- Spreadsheet-Read-0.78.orig/examples/ssdiff
-+++ Spreadsheet-Read-0.78/examples/ssdiff
+ # ss-dup-tk.pl: Find dups in spreadsheet
+ #       (m)'18 [28-03-2018] Copyright H.M.Brand 2005-2018
+diff -ur Spreadsheet-Read-0.79/examples/xls2csv 
Spreadsheet-Read-0.79_fix/examples/xls2csv
+--- Spreadsheet-Read-0.79/examples/xls2csv     2018-08-29 10:28:43.000000000 
+0200
++++ Spreadsheet-Read-0.79_fix/examples/xls2csv 2018-09-20 10:08:55.480707378 
+0200
 @@ -1,4 +1,4 @@
 -#!/pro/bin/perl
 +#!/usr/bin/perl
  
- use strict;
- use warnings;
-Index: Spreadsheet-Read-0.78/examples/xls2csv
-===================================================================
---- Spreadsheet-Read-0.78.orig/examples/xls2csv
-+++ Spreadsheet-Read-0.78/examples/xls2csv
+ # xls2csv: Convert Microsoft Excel spreadsheet to CSV
+ #        (m)'18 [29-08-2018] Copyright H.M.Brand 2008-2018
+diff -ur Spreadsheet-Read-0.79/examples/xlscat 
Spreadsheet-Read-0.79_fix/examples/xlscat
+--- Spreadsheet-Read-0.79/examples/xlscat      2018-06-27 11:33:30.000000000 
+0200
++++ Spreadsheet-Read-0.79_fix/examples/xlscat  2018-09-20 10:08:55.480707378 
+0200
 @@ -1,4 +1,4 @@
 -#!/pro/bin/perl
 +#!/usr/bin/perl
  
- # xls2csv: Convert Microsoft Excel spreadsheet to CSV
- #        (m)'17 [07-06-2017] Copyright H.M.Brand 2008-2018
-Index: Spreadsheet-Read-0.78/examples/xlscat
-===================================================================
---- Spreadsheet-Read-0.78.orig/examples/xlscat
-+++ Spreadsheet-Read-0.78/examples/xlscat
+ # xlscat:  show XLS/SXC file as Text
+ # xlsgrep: grep pattern
+diff -ur Spreadsheet-Read-0.79/Read.pm Spreadsheet-Read-0.79_fix/Read.pm
+--- Spreadsheet-Read-0.79/Read.pm      2018-08-29 10:38:35.000000000 +0200
++++ Spreadsheet-Read-0.79_fix/Read.pm  2018-09-20 10:08:55.480707378 +0200
 @@ -1,4 +1,4 @@
 -#!/pro/bin/perl
 +#!/usr/bin/perl
  
- # xlscat:  show XLS/SXC file as Text
- # xlsgrep: grep pattern
+ package Spreadsheet::Read;
+ 


Reply via email to