2008-03-16から1日間の記事一覧
Stat::IsModeを使用すると、数値形式のパーミッションを記号形式のパーミッションに変換できる。 use Stat::IsMode; $lsmode = file_mode($pathname); File::chmodを使用すると、記号形式のパーミッションを操作できる。 use File::chmod; chmod("g=rw, o=-w…
フルパスから、ファイルの名前、ファイルを格納しているディレクトリの名前、拡張子を抽出したい。 FIle::Basenameモジュールを使用する use File::Basename; $base = basename($path); $dir = dirname($path); ($base, $dir, $ext) = fileparse($path);
foreach関数とrename関数を使用する。 foreach $file (@NAMES) { my $newname = $file; # $newnameを変更する処理を書く rename($file, $newname) or warn; }
File::FIndモジュールのfinddepth関数を使用する。 例. rmtree1 #!/usr/bin/perl -w # rmtree1 - ディレクトリツリー全体を削除する(rm -rと同等) use File::Find; die "usage: $0 dir ..\n" unless @ARGV; find { bydepth => 1, no_chdir => 1, wanted => s…
File::Findモジュールを使用する use File::Find; sub process_file { # 任意の処理を書く } find(\&process_file, @DIRLIST);
glob関数、もしくは<>演算子を使用する。 @list = <*.c>; @list = glob("*.c"); readdir関数を使用してファイル名を手動で抽出する opendir(DIR, $path); @files = grep { /\.c$/ } readdir(DIR); closedir(DIR);
opendir関数でディレクトリをオープンし、readdir関数で各ファイル名を取り出す。 opendir(DIR, $dirname) or die; while (defined($file = readdir(DIR)) { # "$dirname/$file"に対する処理を書く } closedir(DIR);
リスト内の2つのファイル名がディスク上の同じファイルに対応していないかどうか確認したい(ハードリンク、ソフトリンクにより、2つのファイル名が1つのファイルを参照している場合がある)。 ハッシュを作成し、キーとしてファイルのデバイス番号とiノード番…
標準モジュールFile::Copyを使用する use File::Copy; copy($oldfile, $newfile); move($oldfile, $newfile);
組み込み関数unlinkを使用する unlink($FILENAME) or die; unlink(@FILENAMES) == @FILENAMES or die;
ファイルの最終更新時刻(書き込み、変更が行われた時刻)、最終アクセス時刻(読み込みが行われた時刻)を取得して変更したい。 stat関数で情報を取得し、utime関数で設定を行う。 ($READTIME, $WRITETIME) = (stat($filename))[8,9]; utime($NEWREADTIME, $NEW…
文字列形式のデータをファイルとして扱いたい。例えば、引数としてファイルハンドルを受け取るサブルーチンに、直接文字列を渡して処理させたい。 open($fh, "+<", \$string); # $stringの中身の読み書きが可能
File::Compareモジュールを使用する use File::Compare; if (compare($FILENAME_1, $FILENAME_2) == 0) { # 2つのファイルが等しい場合 } if (compare(*FH1, *FH2) == 0) { # 2つのファイルが等しい場合 } if (compare($fh1, $fh2) == 0) { # 2つのファイル…
エンコーディングレイヤを適切に設定して、読み込んだテキストファイルをUnicodeに変換する。 binmode(IFH, ":encoding(cp1252)") || die;
入出力レイヤを使用して、特定のファイルハンドルからデータを読み込む場合、もしくは、特定のファイルハンドルにデータを書き込む場合には、特定のエンコーディングを使用するようにPerlに指示する。 open(my $ifh, "<:encoding(ENCODING_NAME)", $filename); open(my $ofh, ">:encoding(ENCODING_NAME)", $filename);</:encoding(encoding_name)",>
openプラグマを使用する。 use open IO => ":raw:utf8";
ファイルは行のリスト、レコードのリストと見なすことができる。そこで、ファイルへのアクセス、ファイルを操作を、Perlの協力な配列操作を介して行えるようにしたい。 Tie::Fileモジュールを使用する use Tie::File; use Fcntl; tile @data, Tie::File, $FI…
ファイルの設定情報を読み込みたい。そして、そのファイルの所有者以外のユーザの書き込み権限(および読み取り権限)が無効になっていることを確認したい。 stat関数を使用して、ファイルの所有者、パーミッション情報を取得する ( $dev, $ino, $mode, $nlink…
VAR(変数)=VALUE(値)と言う単純な設定ファイルを用意し、下記のコードで処理する。 while (<CONFIG>) { chomp; s/#.*//; s/^\s+//; s/\s+$//; next unless length; my ($var, $value) = split(/\s*=\s*/, $_, 2); $User_Preferences{$var} = $value; } 設定ファイル</config>…
read関数とunpack関数を使用する # $RECORDSIZEはレコード長(単位はバイト) # $TEMPLATEはレコードをunpackするときの使用するテンプレート # FILEは読み込み対象のファイル # @FIELDSは各フィールドを格納する配列(1つの要素に1つのフィールドが格納される)…
特定のアドレスにあるNULで終わる文字列を読み込みたい バイナリモードに切り替え、$/にASCIIのNULを設定してから、<>を使用して文字列を読み込む。 binmode(FH); # バイナリモード $old_rs = $/; # $/の元の値を保存 $/ = "\0"; # ASCIIのNUL seek(FH, $add…
バイナリファイルからレコードを読み込み、その値を変更して書き戻したい。 最初にレコードをreadして、対象の値を更新する。その更新した値をpackして、前のアドレスにseekして書き戻す。 use Fcntl; # SEEK_SET定数とSEEK_CUR定数を使用するため $ADDRESS …
大きなファイルの中間位置にあるバイナリレコードを読み込みたい。 最初にレコードのサイズを取得する。それにレコード番号を乗じて、バイトアドレスを取得する。最後にseekでバイトアドレスに移動し、readでレコードを読み込む。 $ADDRESS = $RECSIZE * $RE…
binmode関数を使用する。引数にはファイルハンドルを指定する。 binmode(HANDLE);
Tie::FIleモジュールを使用して、ファイルを配列にtieする。 use Tie::File; tie @lines, Tie::File, $file or die; delete $lines[-1];
splitとフィールドセパレータにマッチするパターンを使用 # PATTERNで区切られている$RECORD内の各フィールドを抽出 @FIELDS = split(/PATTERN/, $RECORD);
所要の行に到達するまで行を読み込む # 行番号$DESIRED_LINE_NUMBERの行を探索する $. = 0; do { $line = <HANDLE> } until $. == $DESIRED_LINE_NUMBER || eof; ファイル内の各行を配列に格納する @lines = <HANDLE>; $LINE = $lines[$DESIRED_LINE_NUMBER]; Tie::Fileモジ</handle></handle>…
全ての行を配列に読み込んで、List::Utilモジュールのshuffle関数を使用してシャッフルする。 use List::Util qw(shuffle); while (<INPUT>) { push(@lines, $_); } @reordered = shuffle(@lines); foreach (@reordered) { print OUTPUT $_; }
randと$.(現在の行番号)を使用して、どの行を取り出すか決める。 srand; rand($.) < 1 && ($line = $_) while <>; # $lineにランダムに取り出された行が格納される。
ファイルに継続的に追加されるデータを読み込みたい。しかし、ファイルのその時点でのEOFに到達すると、読み込みエラーが発生してしまう。 EOFまで読み込み、スリープし、EOFフラグをクリアして読み込みを行う。 for (;;) { while (<FH>) { .... } sleep $SOMETI</fh>…