2013年1月16日水曜日

開発環境

『初めてのPerl 第6版』(Randal L. Schwartz, Tom Phoenix, brian d foy 共著、近藤 嘉雪 訳、オライリー・ジャパン、2012年、ISBN978-4-87311-567-2) の17章(上級テクニック)、17.6(練習問題)1を解いてみる。

その他参考書籍

1.

コード(BBEdit)

sample.pl

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.016;
binmode STDOUT, ':utf8';
binmode STDIN, ':utf8';

my $file_name = "test.txt";

open my $fh, "<", $file_name or die "$!\n";
chomp(my @strings = <$fh>);
while(1){
  print "パターンを入力: ";
  chomp(my $pattern = <STDIN>);
  last if $pattern =~ /^\s*$/;
  my @matched = eval{
    grep /$pattern/, @strings;
  };
  if($@){
    print $@ . "\n";
  } else {
    print @matched . "個\n";
    print map{"$_\n"} @matched;
  }
}

入出力結果(Terminal)

$ cat test.txt
A
a
kamimura's blog
http://sitekamimura.blogspot.com
KMI
http://www.mkamimura.com   
Fred
FRED
fred
frederick
Alfred
fred flintstone
Mr. Slate     
Mississippi
Bamm-Bamm    
wilama
barney
wilma and fred
fred and wilma
Wilma and Fred      
Fred and Wilma
wilma&fred
Mrs. Wilma Flintstone   
I saw Wilma yesterday
I, Wilma!
Z
llama
$ ./sample.pl
パターンを入力: and
4個
wilma and fred
fred and wilma
Wilma and Fred      
Fred and Wilma
パターンを入力: [ab
Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE ab/ at ./sample.pl line 18, <STDIN> line 2.

パターンを入力: (ab
Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE ab/ at ./sample.pl line 18, <STDIN> line 3.

パターンを入力: ab]
0個
パターンを入力: ab)
Unmatched ) in regex; marked by <-- HERE in m/ab) <-- HERE / at ./sample.pl line 18, <STDIN> line 5.

パターンを入力: \(ab
0個
パターンを入力: ^Mr
2個
Mr. Slate     
Mrs. Wilma Flintstone   
パターンを入力: 
$

ちなみにJavaScriptの場合。

コード(BBEdit)

var s = "A\na\nkamimura's blog\nhttp://sitekamimura.blogspot.com\nKMI\n" +
  "http://www.mkamimura.com   \nFred\nFRED\nfred\nfrederick\nAlfred\nfred flintstone\n" +
  "Mr. Slate     \nMississippi\nBamm-Bamm    \nwilama\nbarney\nwilma and fred\n" +
  "fred and wilma\nWilma and Fred      \nFred and Wilma\nwilma&fred\n" +
  "Mrs. Wilma Flintstone   \nI saw Wilma yesterday\nI, Wilma!\nZ\nllama\n";
var strs = s.split("\n");
var result;
while(true){
  var reg = prompt("パッターンを入力(空白で終了)","");
  if(/^\s*$/.test(reg)) break;
  var matched = [];
  try{
    eval("reg = new RegExp(reg);");
    for(var i = 0; i < strs.length; i++){
      if(reg.test(strs[i])) matched.push(strs[i]) ;
    }
    result = matched.length + "個\n" + 
      matched.join("\n");
    alert(result);
  } catch(e){
      alert(e);
  }
}

pythonの場合。

sample.py

コード(BBEdit)

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

import re

file_name = 'test.txt'
lines = []
with open(file_name) as f:
    for line in f:
        lines.append(line)
while True:
    try:
        pattern = input("パッターンを入力: ")
        if re.search(r"^\s*$", pattern): break
        pattern = eval("re.compile(pattern)")
        matched = []
        for line in lines:
            if re.search(pattern, line):
                matched.append(line)
        print("{0}個".format(len(matched)))
        for s in matched:
            print(s, end="")
    except:
        import sys
        print(sys.exc_info()[1])
  

入出力結果(Terminal)

$ ./sample.py
パッターンを入力: and
4個
wilma and fred
fred and wilma
Wilma and Fred      
Fred and Wilma
パッターンを入力: [ab
unexpected end of regular expression
パッターンを入力: (ab
unbalanced parenthesis
パッターンを入力: ab]
0個
パッターンを入力: ab)
unbalanced parenthesis
パッターンを入力: \(ab
0個
パッターンを入力: ^Mr
2個
Mr. Slate     
Mrs. Wilma Flintstone   
パッターンを入力: 
$

0 コメント:

コメントを投稿