First impression of "use standard"
The idea of the Perl feature standard is to check if Perl code conforms to a reduced and easier to parse syntax.
If one likes writing explicit syntax it's very near to standard.
It's part of Guacamole and uses Marpa::R2 as a parser. Looking into the source there is a large definition of the Perl syntax. Guacamole fails in many tests on CPAN-Testers, mainly on older Perl versions. This seems because Guacamole uses postfix dereferencing.
Installation via cpanm worked without problems. Same for Marpa::R2.
For a quick try I used one of the test scripts open my editor, 356 lines of code.
First modification is to activate the feature:
use standard;
Next we start the script:
$ perl t/10_basic_distance.t
File 't/10_basic_distance.t' does not pass Standard Perl.
Parser says:
> Error in SLIF parse: No lexeme found at line 10, column 16
> * String before error: gs;\nuse utf8;\n\nuse standard;\n\nbinmode( STDOUT
> * The error was at line 10, column 16, and at character 0x002c ',', ...
> * here: , ":encoding(UTF-8)");\nbinmode( 'STDERR', ":encod
> Marpa::R2 exception
at ~/perl5/perlbrew/[...]/5.32.0/Guacamole.pm line 2103.
>
> Failed to parse past: STDOUT (char 17, length 1),
expected LParen,OpArrow,PackageSep
at ~/perl5/perlbrew/[...]/5.32.0/Guacamole.pm line 2119.
Hmm, looks a little hard to read. But we can find the by line-number and position.Seems it doesn't like STDOUT as a bareword parameter. That's against the documentation allowing STDOUT as a bareword. No problem, just quote it:
Next run, next problem. It finds 3 "forgotten" dereferences without curly brackets. That's fine and exactly what's expected:
In summary it does a good job and is fast, especially compared to Perl::Critic. But the start time increases to 0.727s compared to 0.069s without it on a system with SSD. Better remove it before release to production.
Maybe it's a better way to wrap the module in a small test method, which reads all Perl files of a source tree and checks the quality.
-binmode(STDOUT,":encoding(UTF-8)");
-binmode(STDERR,":encoding(UTF-8)");
+use standard;
+
+binmode( 'STDOUT', ":encoding(UTF-8)");
+binmode( 'STDERR', ":encoding(UTF-8)");
Next run, next problem. It finds 3 "forgotten" dereferences without curly brackets. That's fine and exactly what's expected:
- for my $example (@$examples1) { + for my $example (@{$examples1}) {At least it wants explicit syntax on subroutine calls:
-done_testing;
+done_testing();
In total 6 of 356 lines had to change.In summary it does a good job and is fast, especially compared to Perl::Critic. But the start time increases to 0.727s compared to 0.069s without it on a system with SSD. Better remove it before release to production.
Maybe it's a better way to wrap the module in a small test method, which reads all Perl files of a source tree and checks the quality.
Keine Kommentare:
Kommentar veröffentlichen