LoginSignup
2
2

More than 5 years have passed since last update.

perl のワンライナーの初歩 #2

Last updated at Posted at 2015-01-09

perl のワンライナーに関しての、適当な解説 #1/#2/#3/#4

まず

公開前に、他のスニペットストックを見返して、あまりにも不親切なので、本当に、ざっとした解説を書こうかと思った。その2。

ここを読めって内容ですけど。

-0

オプション 意味
-0 ヌル文字区切りで読み込む。
-00 ファイルを段落毎読み込みする。
-0777 ファイルを丸呑みする

段落読みは(ちょっと工夫が必要だけど) clustalw 形式のアライメント出力を読み込む時に良い

'B=Deparse' を利用して、何をしているかを表示してやる。

$ perl -MO=Deparse -0 -lane 'print'
BEGIN { $/ = "\n"; $\ = "\000"; }
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    our(@main::F) = split(' ', $_, 0);
    print $_;
}

わざわざ diff 取る必要もないけど、、、

$ diff <(perl -MO=Deparse -0 -lane 'print' ) <(perl -MO=Deparse -00 -lane 'print' )
1c1
< BEGIN { $/ = "\000"; $\ = "\000"; }
---
> BEGIN { $/ = ""; $\ = "\n\n"; }
$ diff <(perl -MO=Deparse -0 -lane 'print' ) <(perl -MO=Deparse -0777 -lane 'print' )
1c1
< BEGIN { $/ = "\000"; $\ = "\000"; }
---
> BEGIN { $/ = undef; $\ = ""; }

bash, zsh のプロセス置換は、良いです。

-a

-p(n) 適用時。
自動的に $_split (' ') して、@F にセットする。

コマンドラインツール awk のデフォルトの振る舞いをエミュレートします。
引用元

なので注意が必要です。

-F

-a 適用時の区切り文字を指定出来ます。
split /REGEX/ の REGEX 部分だと考えて良いので、正規表現で指定してやるのが吉です。

オプション 利用方法
-F'\t' -lane タブ区切りテキストを開く
-F',' -lane CSV を開く
-F'>' -0777 -ne ファスタ毎に split('>' 除く)
-F'(?=>)' -0777 -ne ファスタ毎に split('>' 残す)

> で split した場合には、@F の最初の要素にノイズが残る
(?=>) これは正規表現における先読み言明。上述のノイズの心配は無い

先読み後読み言明

ここを読むべきでしょう。
bioinformatics 的には、上記 fasta のスプリットや、制限酵素断片の算出など色々な所で使える。後々のコード随所に現われる

-M/-m

モジュール読み込み

$ perl -Mstrict -Mwarnings -lne '...'

などとして使う
なお、違いは、

-Mでは出来るよ
$ perl '-Mvars qw(@a)' -lne '...'
$ perl -M'vars qw(@a)' -lne '...'

出来るか出来ないかだけの模様
普通に -mvars='@a' 出来るんだから、必要無いよ、この差

no モジュール

消すのもアレなので残しておくが、
思いの外実用性が無い事が判明したので、覚える必要は無い。

-M + - + モジュール名で no を指定出来る。

例えば、no warnings qw(newline) を明示的に指定したい場合。

$ perl -M-warnings=newline  -e 1

変数宣言

export PERL5OPT='-Mstrict -Mwarnings'

している諸兄も多いだろう中、ワンライナーを書こうとすると変数宣言で問題になる事がある。

普通に、use vars して対応。

$ perl -Mvars='@a' -lne '...'

初期値を入れたい場合には、

$ perl -Mvars='@a' -lne 'BEGIN{ @a = 1 .. 10} '

PERL5OPT

オプションを予め指定する環境変数です。上述の様に strict, warnings を効かせる他に、

  • Data::Dumper
  • Storable

などを有効にしとくと便利

例えば、

$ export PERL5OPT='-MStorable=nstore,retrieve -MData::Dumper'

しとけば、

$ perl -le 'nstore {qw(foo bar)} , q{test.db}' 

hash などをちょっと保存して、、

$ perl -le 'print Dumper retrieve q{test.db}'
$VAR1 = {
          'foo' => 'bar'
        };

他のワンライナーから、さくっと利用する事が可能
Dumper は Data::Dumper より

B::Deparse

-0 の項の例にある通り -MO=Deparse` を付けて確認するのは常識。

もっと知りたければ perldoc B::Depase して下さい。
何で、'B::' で何で、 -MO= なのかはここ

$ perl -MO=Deparse -0 -lane 'print' > SOMETHING.pl

などとして、ワンライナーで仮スクリプトを作成した後に、本スクリプトの雛形に用いるのも良い。

次回へ。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2