職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

ファイル操作

2018年01月30日 | perl
ファイル操作

【環境条件】
Eclipse 4.4(ルナ)
XAMPP 1.8.3 
Perlは既にインストール済み

【ファイル操作】
■基本
1)ファイルハンドル
・ファイルハンドル→コネクションを区別するためにコネクションに対して付ける名前を指す
・コネクション→ファイルとPerlのプログラムの間でやり取りを行うための通信経路(コネクション)の事。
Perlプログラムではコネクションを使わないとファイル操作が出来ない。

2)ファイルハンドル名の付け方
変数名にはアルファベット・数字・アンダーバー("_")を使うことが出来ます
(例) name, old20, _hokan

先頭の文字に数字は利用できません
(例) 10kago は不可

大文字と小文字は区別します。
(例) old と Old は別の変数名となります

3)標準で用意されているファイルハンドル
STDIN 標準入力。キーボードからの入力など。
STDOUT 標準出力。画面への出力など。
STDERR 標準エラー。エラーとしての出力。

■ファイルのオープンとクローズ
書式
オープン
open(ファイルハンドル名, "ファイル名");
open(ファイルハンドル名, "モード", "ファイル名");
クローズ
close(ファイルハンドル名);

サンプル「file01.pl」
use strict;
use warnings;

if (open(DATAFILE, "data.txt")){
print "data.txtを開く事に成功しました\n";#ファイルハンドル名はDATAFILE

if (close(DATAFILE)){
print "data.txtを閉じる事に成功しました\n";
}else{
print "data.txtを閉じる事に失敗しました\n";
}
}else{
print "data.txtを開く事に失敗しました\n";
}

if (open(DATAFILE, "data1.txt")){
print "data1.txtを開く事に成功しました\n";

if (close(DATAFILE)){
print "data1.txtを閉じる事に成功しました\n";
}else{
print "data1.txtを閉じる事に失敗しました\n";
}
}else{
print "data1.txtを開く事に失敗しました\n";
}
結果


■ファイルオープン時のエラー処理
「open」関数を使ってファイルを開こうとして失敗した場合、プログラムの実行を中断するには「die」関数を使ってプログラムを終了させる方法がよく使われる。

サンプル「file02.pl」
use strict;
use warnings;
open(DATAFILE, "data.txt") or die("error :$!");
print "data.txtを開く事に成功しました\n";

close(DATAFILE);

open(DATAFILE, "data1.txt") or die("error :$!");
print "data1.txtを開く事に成功しました\n";

close(DATAFILE);

・結果
data.txtを開く事に成功しました
error :No such file or directory at C:/xampp/htdocs/perl_kurikaesi/file.pl line 35.

■テキストデータを読み込む
サンプル「file03.pl」
use strict;
use warnings;
open(DATAFILE, "< data4-1.txt") or die("Error:$!");

while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}
テキストファイル「data4-1.txt」
東京
Tokyo

・結果
東京
Tokyo

■テキストデータを書き込む
サンプル「file04.pl」
use strict;
use warnings;
open(DATAFILE, ">> data5-1.txt") or die("Error:$!");

print DATAFILE "大阪\n";
print DATAFILE "Osaka\n";

下記のように「data5-1.txt」に記入される


【モードの指定】
1)「<」モード(読み込み)
書式
open(ファイルハンドル, "< ファイル名");
open(ファイルハンドル, "<", "ファイル名");

・サンプル「file05.pl」
use strict;
use warnings;
open(DATAFILE, "<", "data.txt") or die("Error:$!");

while(my $line = <DATAFILE>){
chomp($line);
print "$line¥n";
}

close(DATAFILE);

・テキストサンプル「data.txt」
これはテストです

・実行
「これはテストです」

2)「>」モード(書き込み)
書式
open(ファイルハンドル, "> ファイル名");
open(ファイルハンドル, ">", "ファイル名");

・サンプル「file05.pl」
use strict;
use warnings;
open(DATAFILE, ">", "data1.txt") or die("Error:$!");

print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";

close(DATAFILE);

open(DATAFILE, ">", "data1-1.txt") or die("Error:$!");

print DATAFILE "山崎 一郎\n";
print DATAFILE "大阪府吹田市\n";
print DATAFILE "男性";

close(DATAFILE);

・実行
data1.txtにデータが書き込まれる
加藤 花子
東京都新宿区
女性

また
無いdata1-1.txtにはデータが書き込まれない

3)「>>」モード(書き込み)
open(ファイルハンドル, ">> ファイル名");
open(ファイルハンドル, ">>", "ファイル名");
「>>」モードの場合
・書き込み専用
・ファイルが存在していた場合、ファイルを開いた時にファイルの内容を変更しない
・ファイルが存在してなかった場合、新規にファイルを作成

・サンプル「file06.pl」
use strict;
use warnings;
open(DATAFILE, ">>", "data.txt") or die("Error:$!");

print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";

close(DATAFILE);

open(DATAFILE, ">>", "data1-1.txt") or die("Error:$!");

print DATAFILE "山崎 一郎\n";
print DATAFILE "大阪府吹田市\n";
print DATAFILE "男性";

close(DATAFILE);

・実行
data.txt→データが追加される
これはテストです加藤 花子
東京都新宿区
女性

data1-1.txt→新規作成されデータが書き込まれる
山崎 一郎
大阪府吹田市
男性

4)「+<」モード(読み書き)
書式
open(ファイルハンドル, "+< ファイル名");
open(ファイルハンドル, "+<", "ファイル名");
・サンプル「file06.pl」
use strict;
use warnings;
open(DATAFILE, "+<", "data9-1.txt") or die("Error:$!");
print DATAFILE "加藤 花子";
close(DATAFILE);

open(DATAFILE, "+<", "data9-1.txt") or die("Error:$!");
print "変更後:\n";
while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}
close(DATAFILE);

open(DATAFILE, "+<", "data9-2.txt") or die("Error:$!");→存在しないのでエラー
print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";

close(DATAFILE);
・実行
変更後:
加藤 花子
東京都杉並木区
男性
Error:No such file or directory at

5)「+>」モード(読み書き)
書式
open(ファイルハンドル, "+> ファイル名");
open(ファイルハンドル, "+>", "ファイル名");
・読み込み、書き込みの両方とも可
・ファイルが存在していた場合、ファイルを開いた時にファイルサイズを0にする
・ファイルが存在してなかった場合、新規にファイルを作成

・サンプル「file07.pl」
use strict;
use warnings;
open(DATAFILE, "+>", "data9-1.txt") or die("Error:$!");
print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";
close(DATAFILE);

open(DATAFILE, "<", "data9-1.txt") or die("Error:$!");
print "追加後:\n";
while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}
close(DATAFILE);

open(DATAFILE, "+>", "C:/Perl/data9-2.txt") or die("Error:$!");
print DATAFILE "山崎 一郎\n";
print DATAFILE "大阪府吹田市\n";
print DATAFILE "男性";

close(DATAFILE);

実行
data9-1.txtに書き込めれた後読み込まれる
追加後:
加藤 花子
東京都新宿区
女性

C:/Perl/data9-2.txtには
山崎 一郎
大阪府吹田市
男性
が書き込めれる

6)「+>>」モード(読み書き)
書式
open(ファイルハンドル, "+>> ファイル名");
open(ファイルハンドル, "+>>", "ファイル名");

・読み込み、書き込みの両方とも可
・ファイルが存在していた場合、ファイルを開いた時にファイルの内容を変更しない
・ファイルが存在してなかった場合、新規にファイルを作成
・ファイルポインタは最後

・サンプル「file08.pl」
use strict;
use warnings;
open(DATAFILE, "+>>", "data11-1.txt") or die("Error:$!");
print "追加前:\n";

while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}

print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";

close(DATAFILE);

open(DATAFILE, "+>>", "data11-1.txt") or die("Error:$!");

print "追加後:\n";

while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}

close(DATAFILE);

open(DATAFILE, "+>>", "C:/Perl/data11-2.txt") or die("Error:$!");

print DATAFILE "山崎 一郎\n";
print DATAFILE "大阪府吹田市\n";
print DATAFILE "男性";

close(DATAFILE);

・実行
追加前:
追加後:

data11-1.txt
山田太郎
東京都杉並区
男性
加藤 花子→追加される
東京都新宿区
女性

C:/Perl/data11-2.txt
山崎 一郎
大阪府吹田市
男性


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

「printf」関数と「sprintf」関数の違い

2018年01月27日 | perl
「printf」関数と「sprintf」関数の違い

【環境条件】
Eclipse 4.4(ルナ)
XAMPP 1.8.3 
Perlは既にインストール済み

【文字列を指定のフォーマット】
1)フォーマット
printf関数→指定のファイルハンドルに対して整形した結果の文字列を出力
sprintf関数→整形した結果を文字列として返す

2)書式
printf([ファイルハンドル] 書式指定文字列, リスト);
戻り値 = sprintf(書式指定文字列, リスト);

サンプル「test01.pl」
use strict;
use warnings;
printf("番号は %03d です\n", 24);%はフォーマット指定子
・結果
番号は 024 です

3)フォーマット指定子
%[フラグ][最小幅][.精度/最大幅]型指定子
「%03d」→対応する値を「10進数の数値で幅を3桁にし0詰めにする」

サンプル「test01.pl」
use strict;
use warnings;
printf("Aは %03d 円、Bは %03d 円です\n", 30, 80);
・結果
Aは 030 円、Bは 080 円です

4)指定子の種類
・型指定子

・数値のデータ型以外の型指定子


5)フラグ
フラグ→フォーマット指定子のオプション
%[フラグ][最小幅][.精度/最大幅]型指定子


サンプル「test02.pl」
use strict;
use warnings;
printf("[%d]\n", 30);
printf("[% d]\n", 30);
printf("[% d]\n", -30);

printf("[%d]\n", 30);
printf("[%+d]\n", 30);
printf("[%+d]\n", -30);

printf("[%4d]\n", 30);
printf("[%-4d]\n", 30);

printf("[%4d]\n", 30);
printf("[%04d]\n", 30);

printf("[%#o]\n", 30);
printf("[%#x]\n", 30);
printf("[%#b]\n", 30);

・結果
[30]
[ 30]
[-30]
[30]
[+30]
[-30]
[ 30]
[30 ]
[ 30]
[0030]
[036]
[0x1e]
[0b11110]

6)最小幅
文字列の最小の幅を指定
%[フラグ][最小幅][.精度/最大幅]型指定子

サンプル「test03.pl」
use strict;
use warnings;
printf("[%d]\n", 30);
printf("[%5d]\n", 30);
printf("[%5d]\n", -30);
printf("[%-5d]\n", -30);
printf("[%#o]\n", 30);
printf("[%#5o]\n", 30);
printf("[%#x]\n", 30);
printf("[%#5x]\n", 30);
printf("[%#b]\n", 2);
printf("[%#5b]\n", 2);
printf("[%15e]\n", 12.3);
printf("[%15f]\n", 12.3);
printf("[%3d]\n", 760128);

・結果
[30]
[ 30]
[ -30]
[-30 ]
[036]
[ 036]
[0x1e]
[ 0x1e]
[0b10]
[ 0b10]
[ 1.230000e+001]
[ 12.300000]
[760128]

7)精度/最大幅
浮動小数点数に対して精度を指定した場合は、小数点以下の桁数となる。
%[フラグ][最小幅][.精度/最大幅]型指定子

サンプル「test04.pl」
use strict;
use warnings;
printf("%f\n", 0.012);
printf("%.4f\n", 0.012);
printf("%e\n", 0.012);
printf("%.3e\n", 0.012);

printf("[%.4d]\n", 123);
printf("[%.6d]\n", 123);
printf("[%8.6d]\n", 123);

printf("[%.6x]\n", 123);
printf("[%#.6x]\n", 123);

printf("[%s]\n", "Javascript");
printf("[%.5s]\n", "Javascript");

・結果
0.012000
0.0120
1.200000e-002
1.200e-002
[0123]
[000123]
[ 000123]
[00007b]
[0x00007b]
[Javascript]
[Javas]

8)精度/最大幅の桁数を値で指定
printf("[%.*d]¥n", 6, 123);

サンプル「test05.pl」
use strict;
use warnings;
printf("[%.6d]\n", 123);
#桁数を直接、値で指定
printf("[%.*d]\n", 6, 123);
printf("[%s] [%.*s] \n", "Hello", 3, "Hello");

・結果
[000123]
[000123]
[Hello] [Hel]

8)値をインデックス指定で使用
値のインデックスを指定することで、任意の位置の値を使用する方法を確認します
・書式
printf(" A=%2¥$d, B=%1¥$d¥n", 123, 456);

サンプル「test06.pl」
use strict;
use warnings;
printf(" A=%d, B=%d\n", 123, 456);
printf(" A=%2\$d, B=%1\$d\n", 123, 456);
printf(" A=%2\$d, B=%2\$d\n", 123, 456);
printf("%2\$d, %d, %1\$d, %d\n", 123, 456);

・結果
A=123, B=456
A=456, B=123
A=456, B=456
456, 123, 123, 456
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

perlとサブルーチン

2018年01月22日 | perl
perlとサブルーチン


【環境条件】
Eclipse 4.4(ルナ)
XAMPP 1.8.3 
Perlは既にインストール済み

【サブルーチン】
サブルーチン→プログラム中で何回も使用するコードをサブルーチンとして独立し、必要に応じて呼び出すことでプログラムを簡素化して見やすくする。

・サンプルプログラム「test01.pl」
use strict;
use warnings;
my @city = ("東京", "大阪", "名古屋");
&dispArrayValue(@city);
#逆順
my @rcity = reverse(@city);
&dispArrayValue(@rcity);

sub dispArrayValue{
my @array = @_;

print "配列の要素を出力します\n";
foreach my $var(@array){
print "$var\n";
}
}
・結果
配列の要素を出力します
東京
大阪
名古屋
配列の要素を出力します
名古屋
大阪
東京

2)サブルーチンの定義
書式
sub サブルーチン名{
実行する処理;
}

位置
サブルーチンの位置はプログラム中のどこで定義しても構いませんが、一般的には最初か、最後に置く

サブルーチンの実行
プログラム内からサブルーチンを呼び出さない限り実行されません。

・サンプルプログラム「test02.pl」
use strict;
use warnings;
#サブルーチン
sub hello{
print "hello\n";
}

print "サブルーチンのテスト\n";

#サブルーチン
sub bye{
print "bye\n";
}

&hello;
&bye;
print "終了\n";

・結果
サブルーチンのテスト
hello
bye
終了

3)引数
サブルーチンを呼び出す時に、複数の値を渡す時に使用する。
書式
&サブルーチン名(引数1, 引数2, ...);

sub サブルーチン名{
実行する処理;
}

・サンプルプログラム「test03.pl」
use strict;
use warnings;
&calcAverage(10, 8);
&calcAverage(5, 17);

#サブルーチン
sub calcAverage{
my $ave;
$ave = ($_[0] + $_[1]) / 2;
print "$_[0] と $_[1] の平均値は $ave です\n";
}

・結果
10 と 8 の平均値は 9 です
5 と 17 の平均値は 11 です

4)引数を任意の変数に格納
サブルーチン側では、呼び出し元から渡されてきた引数をデフォルトの配列変数「$_」に格納します
・サンプルプログラム「test04.pl」
use strict;
use warnings;
&personal("加藤", 25, "東京都");

sub personal{
my ($name, $old, $address) = @_;#配列

print "名前は $name です\n";
print "年齢は $old です\n";
print "住所は $address です\n";
}
・結果
名前は 加藤 です
年齢は 25 です
住所は 東京都 です

5)戻り値
サンプル「test05.pl」
use strict;
use warnings;

my ($sum, $str);

$sum = &calcTwoNum(10, 23);#戻り値
print "$sum\n";

$sum = &calcTwoNum(32, 14);#戻り値
print "$sum\n";

sub calcTwoNum{
my ($num1, $num2) = @_;

$num1 + $num2;
}
・結果
33
46

6)return文
サブルーチンではブロックの最後まで処理が進むと呼び出し元に返りますが、任意の位置で即座に呼び出し元に処理を返すことが出来る
サンプル「test06.pl」
use strict;
use warnings;
my $msg;

$msg = &hantei(72, 84);
print "$msg\n";

$msg = &hantei(92, 80);
print "$msg\n";

sub hantei{
my ($kokugo, $suugaku) = @_;

if ($kokugo < 75){
return "不合格";
}

if ($suugaku < 75){
return "不合格";
}

return "合格";
}


・結果
不合格
合格
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

perlのハッシュについて

2018年01月19日 | perl
perlのハッシュについて

【環境条件】
Eclipse 4.4(ルナ)
XAMPP 1.8.3 
Perlは既にインストール済み

【ハッシュ】
1)ハッシュとは
ハッシュは他のプログラミング言語では連想配列とも呼ばれているもので、複数の値を管理することは配列と同じですが、要素を順に並べてインデックスで管理するのではなく、格納される値に対するキーを別途設定しインデックスの代わりにキーで管理する。

・サンプルプログラム「test01.pl」
use strict;
use warnings;
my %address;#ハッシュ宣言

$address{'katou'}= "Tokyo";#キーと値の取得
$address{'山田'}= "大阪";#キーと値の取得

print "$address{'katou'} \n";
print "$address{'山田'} \n";

・結果
Tokyo
大阪

2)ハッシュの宣言と要素へのアクセス
書式
ハッシュ宣言→%ハッシュ名
キーと値の取得→$ハッシュ名{キー} = 値;

3)ハッシュの初期化
書式
my @ハッシュ名 = (キー1,値1,キー2,値2,...,キーn,値n);
または
my @ハッシュ名 = (
キー1 => 値1,
キー2 => 値2,
... ,
キーn => 値n
);

・サンプルプログラム「test02.pl」
use strict;
use warnings;
my %address = (
"鈴木" => "東京都千代田区",
"山田" => "東京都葛飾区"
);

print "$address{'鈴木'}\n";
print "$address{'山田'}\n";
・結果
東京都千代田区
東京都葛飾区

4)ハッシュ要素の変数展開
ハッシュは、ハッシュ全体を表す「%ハッシュ名」のような記述を行っても展開されない。
・サンプルプログラム「test03.pl」
my %address = (
"鈴木" => "東京都千代田区",
"山田" => "東京都葛飾区"
);

print "%address\n";
print "$address{'鈴木'}\n";

・結果
%address
東京都千代田区

5)繰り返し処理
keys関数→対象となるハッシュに含まれている全てのキーをリストの形で返す
each関数→対象となるハッシュに含まれている要素を順に取り出します

・サンプルプログラム「test04.pl」
my %address = (
"鈴木" => "東京都千代田区",
"山田" => "東京都葛飾区"
);

#key文
foreach my $key(keys(%address)){
print "$address{$key}\n";
}
#each文
while (my ($key, $value) = each(%address)){
print " key=$key, value=$value\n";
}
・結果
東京都千代田区
東京都葛飾区
key=鈴木, value=東京都千代田区
key=山田, value=東京都葛飾区

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

perlのリストと配列

2018年01月12日 | perl
perlのリストと配列

【環境条件】
Eclipse 4.4(ルナ)
XAMPP 1.8.3 
Perlは既にインストール済み
--リスト--


1)リストとは
スカラーに順番をつけて並べたもので、そのリストの中でのスカラーの位置によって自由にアクセスすることができる。

書式
(変数1, 変数2, 変数3, ...) = (値1, 値2, 値3, ...);

サンプル「test01.pl」
use strict;
use warnings;

my ($var1, $var2, $var3);

($var1, $var2, $var3) = ("月曜", "火曜", "水曜");

print "$var1\n";
print "$var2\n";
print "$var3\n";

・実行
月曜
火曜
水曜

2)リストの要素に変数は?
書式
my ($str1, $str2);
my $name = "伊藤";

($str1, $str2) = ($name, "東京都");

・サンプル「test02.pl」
my ($str1, $str2);
my $name = "伊藤";

($str1, $str2) = ($name, "東京都");

print "$str1\n";
print "$str2\n";

・実行
伊藤
東京都

--配列--

1)配列とは
配列は同じような目的で使用される複数の値を管理する場合に使用される

2)書式
my @配列;
$変数[インデックス]=値;
サンプルプ「test03.pl」
use strict;
use warnings;
my @seiseki;
$seiseki[0] = 80;
$seiseki[1] = 75;
$seiseki[2] = 69;

for (my $i = 0; $i
--演算子--

1)qw演算子
一覧の文字列を空白文字を区切りとして分割したリストを返してくれます

書式
qw/ 対象となる文字列 /

サンプルプ「test06.pl」
use strict;
use warnings;
my @name = qw/ 伊藤 工藤 山田 /;

for (my $i = 0; $i < 3; $i++){
print "$name[$i]\n";
}
・実行
伊藤
工藤
山田

2)範囲演算子
書式
my @count = (開始数..終了数);

サンプルプ「test07.pl」
use strict;
use warnings;
my @num = (10..14, 20);
my $count = @num;

for (my $i = 0; $i < $count; $i++){
print "$num[$i]\n";
}
・実行
10
11
12
13
14
20

3)配列要素の確認
書式
my @array = ("要素1", "要素2");
my $length = @array;

サンプルプ「test08.pl」
use strict;
use warnings;
my @array = ("1月", "2月");
my $length = @array;

print "要素数 $length\n";
print @array;

・実行
要素数 2
1月2月

4)配列要素の最後を書き換える
「$#配列名」→配列に含まれる最後のインデックスが変更されます

サンプルプ「test09.pl」
use strict;
use warnings;
my @str = ("1月", "2月", "6月");

$str[$#str] = "3月";
for (my $i = 0; $i <= $#str; $i++){
print "$str[$i]\n";
}

・結果
1月
2月
3月

5)文字列中に含まれる配列の変数展開
サンプルプ「test10.pl」
my @name = ("加藤", "山田", "林");
print "登録されているのは @name です\n";#→変換される
print '登録されているのは @name です';#→ダメ

print "\n";
$" = ",";#→特別変数「$"」は区切り文字を決める時に使う
print "登録されているのは @name です\n";

・結果
登録されているのは 加藤 山田 林 です
登録されているのは @name です
登録されているのは 加藤,山田,林 です

6)配列と繰り返し処理・・
for文
my @array = ("加藤", "山田", "林");
for (my $i = 0; $i <= $#array; $i++){
print "$array[$i]¥n";
}
または
foreach文
my @name = ("加藤", "山田", "林");
foreach (@name){
print "$_\n";
}
・結果
加藤
山田
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする