wc -l および grep の代替品を Windows 上の Perl で書く

2023/04/19 0:37 Perl
Windows マシンにおいて、
Unix 系で使われる行数取得コマンド wc -l や、行単位検索コマンド grep が使えない環境だけれど Perl が使えるといったときのために、
このコマンドの代わりとなるバッチファイルを書きました。

wc -l の代わり

wc-l.bat
@ECHO OFF
perl -ne "END{print $.}"
前のコマンドの標準出力を受け取って、
C:\>type example.txt | wc-l
のように使います。

grep の代わり

grep.bat
@ECHO OFF
perl -ne "BEGIN{$a = '%~1'; $opt = ''; $opt = $1, $a = '%~2' if $a =~ /^-([a-zA-Z]*)/;} eval qq{print if /$a/$opt}"
wc と同様に、
C:\>type example.txt | grep 123
や、正規表現を使って
C:\>type example.txt | grep "[1-3a-cX-Z]{3}"
のように使います。

引数に「^」や「{}」等の記号を使いたい場合には引数をダブルクォートで囲みます(どんな引数のときでも囲っておけば間違いないです)。

最初の引数にハイフン(-)に続いてアルファベット(a-z, A-Z) を指定することで、検索オプションを与えることが出来ます。
C:\>type example.txt | grep -i abc
この場合のように -i を指定した場合、大文字・小文字を区別しなくなります。

検索オプションを指定するのではなくハイフン(-)に続いた文字列そのものを検索したい場合は、最初の引数にハイフン(-)のみを与えます。
C:\>type example.txt | grep - -xyz

サブルーチンの名前付きパラメータでデフォルト値を用意する方法

2023/03/15 21:17 Perl
Joseph N. Hall ほか著『Effective Perl 第2版』(2015, 翔泳社)(https://www.shoeisha.co.jp/book/detail/9784798139814) の p.161 「項目47 名前付きパラメータを渡すにはハッシュを使おう」で、パラメータとデフォルト値を組み合わせるのに
@param { keys %input } = values %input;
を使っていたが、別の方法もあったと記憶していたので、簡単に確認した。


ソース
use strict;
use warnings;
use Data::Dumper;

my %default = (
    a => 100,
    b => 101,
    c => 102,
    d => 103,
);
print Dumper \%default;

my %param = (
    a => 200,
    c => 201,
);
print Dumper \%param;

%param = (%default, %param);
print Dumper \%param;

実行結果
$VAR1 = {
          'c' => 102,
          'd' => 103,
          'a' => 100,
          'b' => 101
        };
$VAR1 = {
          'a' => 200,
          'c' => 201
        };
$VAR1 = {
          'b' => 101,
          'a' => 200,
          'c' => 201,
          'd' => 103
        };

この書籍のコードのような、ハッシュB の内容でハッシュA を上書きするような使い方では、
my %param = (...);
...
@param { keys %input } = values %input;

my %param = (...);
...
%param = (%param, %input);
は等価であることが確認できた。