PHP,Rubyでの入出力まわり(文字列、ファイル、ストリーム)

最近、XML、HTMLファイルをあれこれする事が増えてきた気がする。ファイルに書き込んだり、読みこんだりするときの入出力に関するメモ。

PHP

参考。PHP: ファイルシステム関数 – Manual

まずは、fopenや、fsockopenで、ファイルポインタを取得する。

ファイルをすこしずつ読み込んでいく場合は、ファイルポインタから、
fgets(ファイルポインタから1行取得)、
fread(バイナリ・モードでファイルを読み込む)、
fgetcsv(CSV用)、
などを使う。書き込みは、fwriteで。

<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
	while (!feof($handle)) {
		$buffer = fgets($handle, 4096);
		echo $buffer;
	}
	fclose($handle);
}
?>

ファイル全体を一度に処理したい場合は、filefile_get_contentsを利用すればいい。

文字列と配列の変換

データが、欲しいときに、欲しい形であるとは、限らない。
配列、文字列、ファイルなどにある情報を適当な形にしたい時。

  • explode文字列を文字列により分割する->配列
  • split正規表現により文字列を分割し、配列に格納する->配列
  • implode配列要素を文字列により連結する->文字列

これらの関数で、配列と文字列が変換できる。

ストリーム

大き目のデータをキャッシュとしてファイルに保存しておいて、あとでも利用するときなど、ファイルを使っていろいろするとき
(ファイルからデータを読み込む場合と、すでに文字列などでデータをもっていてそのまま使いたい場合の両方があるときとか)。

1.ファイルから読み込んだデータを加工して、適当な形(文字列とか)にしてから、処理に回す。

2.文字列を、ポインタを使って、ファイルからデータを読み込む場合と同じ処理にまわす。参考、データ (RFC 2397)

<?php
$TEXT =<<<EOF
data1
data2
data3
EOF;
$handle = fopen("data://text/plain,$TEXT", 'r');
if ($handle) {
	while (!feof($handle)) {
		$buffer = fgets($handle, 4096);
		echo $buffer;
	}
	fclose($handle);
}

?>

PHP 5.1.0 以降なら、
php://memory とか、
php://tempも使えるみたいです。
PHP 入出力ストリーム

Ruby

Fileや、IOクラスを使う。

openや、
File.openで返されるオブジェクトを操作する。

filename = "data.txt"
file = open(filename)
#file = File.open(filename)
text = file.read(file)
print text
file.close

ファイルを一度に読む場合、クラスメソッドを使って

data = File.read("foo.txt")

ともできる。

ファイルを一行ずつ読む場合は、

filename = "data.txt"
file = open(filename)
while text = file.gets do
	print text
end
file.close

のようにする。あるいは、

filename = "data.txt"
open(filename){|io|
	while line = io.gets
	print text
	end
}

のように、closeを省略することもできる。

Ruby メモ

  • HTTPやFTPからファイルを開きたいときは、open-uriを使う。
  • io.readlinesで、ファイルの各行を配列として取得できる。
  • io.eachとeachメソッドが使える
  • 出力は、io.write,io.print,io.printf,io << strなど。
  • io.rewindでファイルポインタを先頭にできる。

配列と文字列

配列->文字列は、joinで。

p ["a", "b", "c"].join(',') #=> "a,b,c"

文字列->配列は、splitscanで。

p "   a \t  b \n  c".split(/\s+/) # => ["", "a", "b", "c"]
p "foobarbazfoobarbaz".scan(/ba./)
# => ["bar", "baz", "bar", "baz"]

%wで、空白で分割して配列を作れる。

p %w(a b c) # => ["a", "b", "c"]

StringIO

StringIOオブジェクトを使うと、文字列のデータを、IOオブジェクトとして扱うことが簡単にできる。

require 'stringio'
str = << EOF
data1
data2
data3
EOF
io =StringIO.new(str)
#io.puts(str)
io.rewind
p io.read

PHP、Perl、RubyでのPath(パス)の通し方、クラスの書き方とか

普段、PHPばかり触っているので、PerlやRubyでライブラリを使いたいと思っても、Path(パス)を設定するだけでも一苦労。各言語で、 Path(パス)を通して、ライブラリーを使ったり、クラス、オブジェクトであれこれするためのメモ。

(参考リンクは、cpan,gemsのインストールとか、クラスの書き方などの雑多なもの。)

PHPでPath(パス)を設定する方法

php.ini

「php.ini」ファイルに、include_path を記述する。区切りは“:”(UNIXで。Windowsだとセミコロンに)。ローカルにPEARを入れたときなどに、書いておく。

include_path = ".:/usr/local/lib/php"

.htaccess

「.htaccess」ファイルに、php_value include_path を記述する。php.iniとおなじく、設置場所がちゃんとしていないと動かない。

php_value include_path ".:/usr/local/lib/php"

phpファイルに直接書き込む

ini_set(),set_include_path(),get_include_path(),get_include_path(),ini_restore()などの関数を使う。

set_include_path('/inc');
ini_set('include_path', '/inc');

PHPの別ファイルや、ライブラリの読み込み方

require(),require_once(),include(),include_once()などの関数を使う。allow_url_fopenの設定が”1″なら、「require(http://~.cgi?q=~);」みたいなことも可能。

require_once('Cache/Lite.php');
include 'vars.php';

ファイルはinclude_pathで指定した所から探す。./を先頭に付けると探し方が変わったりする。

_onceが付いている関数は、一回だけ読み込む。require()とinclude()の違いは、require()だとFatalなエラーがでる所。

参考。PHP: include – Manual

PHP クラスの書き方

php4なら、

class Class
{
	var $var;
	
	//コンストラクタ
	function Class($v)
	{
		$this->var = $v;
	}

	//メソッド
	function foo()
	{
		//~
	}
}

php5だとコンストラクタは、__construct() 。メンバー変数に、
public、private、protectedとアクセス権が指定できる。

オブジェクトの使い方は、

$class = new Class($v);
$class->foo();
Class::foo();
PHP 参考リンク PEARなど

PerlでPath(パス)を設定する方法

use lib ~;

use lib qw(~);

でパスが指定でき、use ~とファイルを読み込めるようになる。

@INC

PATHは、「print join(“\n”,@INC);」で確認できる
(@INCは、PATHが入った配列)。@INCに、パスを追加するときは、

BEGIN {
push(@INC, '/usr/local/sbin');
}

とできる。

PERL5LIB

環境変数「PERL5LIB」をShell の設定ファイルに加えておく。

-Iを付ける

#!/usr/local/bin/perl

を書き換えて、オプションでパスを指定することも可能。

#!/usr/local/bin/perl -I /usr/~

Perlの別ファイルや、ライブラリの読み込み方

require

require "jcode.pl";

のように書いて、外部のパッケージを読み込む。読み込まれるファイルは

package library;
sub sub1 {
	#~
}

return 1;

の形で書いておく。library::sub1();と呼び出して使える。

use

パスの通ったところにある「~.pm」ファイルは、

use Jcode;

のようにして読み込める。「::」で階層を表せる。「Module1::Module2」なら、Module1ディレクトリの中のModule2を表している。モジュールは、

package Module;
use Exporter;
@ISA = (Exporter);
@EXPORT = qw(sub1 sub2);
@EXPORT_OK = qw(sub3);

のように書いておく。使うときは、

use Module;
sub1();
use Module qw(sub3);
sub3();

とする。

Perl クラスの書き方、オブジェクト

オブジェクト指向の基礎 Perl講座を参考にしました。
引数は、shift,@_でとっていく。第1引数はクラス名。

package Class;

sub new{
	my $class = shift;
	my $self = {v1 => 1, v2 => 2};
	return bless $self, $class;
}
sub method{
	my ($self, $v1, $v2) = @_;
	# $self->{v1} ~
}

使い方は、

$obj = new Class;
$obj->method(3, 4);
Perl 参考リンク CPANとか

RubyでPath(パス)を設定する方法

-I オプション

Perlと似ていて、-Iでファイルをロードするパスを追加できる。
-I directory

環境変数

PATHに加えて、RUBYPATH、RUBYLIBなどを設定しておく。
Rubyリファレンスマニュアル – 環境変数

Rubyの別ファイルや、ライブラリの読み込み方

load

$: , $LOAD_PATHにある場所や、絶対パスからファイルを読み込む。

load 'ruby.cgi'
load 'ruby.rb'

Rubyリファレンスマニュアル – 組み込み関数 #load

require

require は拡張子 .rb や .so を自動的に補完する。require はライブラリのロード、load は設定ファイルの読み込みなどに使われる。

require "cgi-lib"

Ruby クラスの書き方、オブジェクト

class RubyClass
	attr_accessor :v
	def initialize(v='')
		@v=v
	end
	def method(v1 ,v2)
		# @v ~
	end
end

使うときは、

require 'rubyclass'
obj = RubyClass.new()
obj.method(1,2)

階層、関係がある場合は、
「require ‘class1/class2’」とか、
「class1::class2.new()」とする。

Ruby 参考リンク gems, Ruby on Rails