Announce

PukiWiki contents have been moved into SONOTS Plugin (20070703)

perl

perlのメモ

Table of Contents

Practical Tips

実行パスから require

use File::Basename;
my $script_dir = dirname($0);
require "$script_dir/csv.pl";
require "$script_dir/strutil.pl";

正規表現。C言語のコメント(/* */)にマッチ

文字列の排他指定に応用できる。

/* */ の中間の文字列は / 以外の文字列もしくは、直前が * 以外の /。 /? は /*/ */ のように /* の直後に / がある場合にもマッチするようにするため。 [^*]/ は / の前に必ず一文字あることを要求しているので、マッチングができない。 そして、[^/] によってはじかれて終わってしまう。

/\*/?([^/]|[^*]/)*\*/

randperm

print &randperm(5);

sub randperm
{
    my ($n) = @_;
    my (@nums, $iters, $i, $k);

    srand;  #  seed the random number generator
   
    @nums = 1 .. $n;  #  initialize with the identity permutation 
 
    $iters = 12 * $n**3 * log($n) + 1;
    for ( $i = 1; $i <= $iters; $i++)
        {
           if (rand(1) <= .5)   #  Flip a coin, and if heads swap
                                # a random adjacent pair of elements.  
          {
           $k = int( rand($n-1) );
           ( $nums [$k], $nums [$k + 1] ) = ($nums [$k + 1], $nums [$k] );
          }
        }
    
    return @nums;
}

csv.pl

use strict;

sub parse_csv {
    my $text = shift;
    my @new  = ();
    push( @new, $+ ) while $text =~ m{
       "([^\"\\]*(?:\\.[^\"\\]*)*)",?
           |  ([^,]+),?
           | ,
       }gx;
    push( @new, undef ) if substr( $text, -1, 1 ) eq ',';
    return @new;
}

sub to_csv {
    my ($values) = @_;
    return join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @$values;
}

1;
my @csv = parse_csv($line);
print $fh &to_csv($array);
my @fields = ();
for my $i (0..$#lines) {
    my $line = &rtrim($lines[$i]);
    $fields[$i] = ();
    my @csv = parse_csv($line);
    for my $j (0..$#csv) {
        $fields[$i][$j] = $csv[$j];
    }
}

strutil.pl

use strict;

sub rtrim()
{
    my ($str) = @_;
    $str =~ s/\s+$//; # rtrim
    return $str;
}

1;

fopen

my fname = $ARGV[0];

open(FILE, fname);
my @lines = <FILE>;
close(FILE);
for my $i (0..$#lines) {
    print $lines[$i];
}

Links

http://www.din.or.jp/~ohzaki/perl.htm