fmemo

Perl

最終更新:

fmemo

- view
管理者のみ編集可

改行コードを変換するワンライナー

Mac OS 9以前の改行コードである\rをUnix(Mac OS X)の改行コードである\nに変換したい場合。
$ perl  -pe 's/\r/\n/g' inputfile > outputfile

Perlにおける真偽値


Perlにおける真偽値の定義は以下のとおり
  • undef(未定義値)は偽
  • 数値の0, 文字列の0,空の文字列""は偽
  • 上記の3つ以外は真

use strict;
use warnings;

my $var1 = undef;
my $var2 = 0;
my $var3 = "0";
my $var4 = "";
my $var5 = 1;
my $var6 = "aa";

if( $var1 ){
    print "true\n";
}else{
    print "false\n";
}

if( $var2 ){
    print "true\n";
}else{
    print "false\n";
} 

if( $var3 ){
    print "true\n";
}else{
    print "false\n";
}

if( $var4 ){
    print "true\n";
}else{
    print "false\n";
}

if( $var5 ){
    print "true\n";
}else{
    print "false\n";
}

if( $var6 ){
    print "true\n";
}else{
    print "false\n";
}

このプログラムを実行させると、

$ perl truefalse.pl 
false
false
false
false
true
true

正規表現


  • ^ 行頭
  • $ 行末
  • \w アルファベット(大文字小文字)、数字、アンダーバー。つまり[a-zA-Z_]と同値
  • \d 数字。[0-9]と同値
  • \s 空白文字(スペース、タブ、改行)
  • . 改行以外の任意の文字

量指定子


  • + 1回以上の繰り返し
  • * 0回以上の繰り返し
  • ? 0回または1回の繰り返し




コマンドラインオプション


-eオプション

その後にある文字列をプログラムだとして認識し、実行する。ワンライナーを書くときに使う。

$ perl -e 'print "hello\n"'
hello

-n オプション

プログラムの前後にwhile(<>){ ... }があると解釈する。-eと組み合わせてワンライナーで使うことが多い。

-p オプション

nオプションに似ているが、最後に評価した式を出力する。-eと組み合わせてワンライナーで使うことが多い。

-l オプション

改行を付加する。

perldocの使い方


perldocについて知りたい時
$ peldoc perldoc

関数を調べたい時
$ perldoc -f sort

ソースをそのまま読みたい時
$ perldoc -u sort

モジュールのパスを知りたい時
$ perldoc -l sort

バイナリファイルの読み書き


use strict;
use warnings;

my @names = ('Alice', 'Bob','Charlie');
my @nums  = (10, 20, 30);

open my $fh, '>', 'binary-test' or die "file open error: $!";
binmode $fh;

for (my $i=0; $i<3; $i++){
    my $buffer = pack "a8 l", $names[$i], $nums[$i];
    print $fh $buffer;
}

close $fh;

pack関数の書式は perldoc -f packで確認できる。

参考サイト


エンディアン変換


use strict;
use warnings; 

if(@ARGV != 3){
  print "You need 3 arguments.\n";
  print "\$ perl endian.pl inputfile outputfile num\n";
  exit;
}

my ($ifile, $ofile, $num) = @ARGV;

open my $in,'<', "$ifile";
open my $out,'>',"$ofile"; 

if($num==2){
    while(read($in,my $buf,2)){
        print $out pack("n",unpack("v",$buf));
    }
}elsif($num==4){
    while(read($in,my $buf,4)){
        print $out pack("N",unpack("V",$buf));
    }
}else{
    print "the 3rd argument should be 2 or 4.\n";
}


参考サイト

記事メニュー
人気記事ランキング
ウィキ募集バナー