PERLの勉強をつい最近はじめました。
参考にしている本のどこを探してもみつからなかったので、質問させていただきます。

sub lock{
$c = 0;
while (-f $lockfile) {
$c++;
if( $c >= 5 ){
print 'BUSY 少し時間を置いてもう一度登録してください。',"\n";
exit;
}
sleep(1);
}
open(LOCK,">$lockfile");
close(LOCK);

というサブルーチンがありまして、分からないのはwhile構文の条件の記述です。
(-f $lockfile) とは、-fとは、どういう意味なのでしょうか。

if(! -f $mail01 ){
open(OUT,">$mail01");
close(OUT);

というところにもありました。
どうぞ教えてやってください。超初心者なので、どうぞよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

-f はファイル演算子の一つで、そのファイルが通常ファイルであれば真を返します。


ですので、while (-f $lockfile) は、
変数$lockfileに格納された名前のファイルが存在している間、ループすることになります。

ファイル演算子は非常に便利です。他にも以下のようなファイル演算子があります。

-r: 読み込み可能か否か
-w: 書き込み可能か否か
-x: 実行可能か否か
-o: 自分のものか否か
-R: 実uid/gidで読み込み可能か否か
-W: 実uid/gidで書き込み可能か否か
-X: 実uid/gidで実行可能か否か
-O: 実uidのものか否か
-e: 存在すれば
-z: サイズが0か否か
-s: サイズが0でなければ(ファイルサイズを返す)
-f: 通常ファイルか否か
-d: ディレクトリか否か
-l: シンボリックリンクか否か
-p: 名前付きパイプか否か
-S: ソケットか否か
-b: ブロック型スペシャルファイルか否か
-c: キャラクタ型スペシャルファイルか否か
-u: setuidビットが立っていれば
-g: setgifビットが立っていれば
-k: stickyビットが立っていれば
-t: ファイルハンドルが tty としてオープンされていれば
-T: ファイルがテキストファイルか否か
-B: ファイルがバイナリファイルか否か
    • good
    • 0
この回答へのお礼

超初歩的な質問に答えていただきありがとうございました。私が参考にしている本に「ファイル演算子」についての記述はありませんでした。教えていただいた「ファイル演算子」でページ検索して今勉強しているところです。大変助かりました。
また初歩的な質問をすると思いますが、また教えてやってください。m(_._)m

お礼日時:2002/03/03 01:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q$hts =~ s/##([^#]+)##/$FORM{$1}/g の意味を教えてください!

お世話になります。
perl素人なのですが必要に迫られてWEBで調べながら
ソースを解析していますが、次のコードで完全に止まってしまいました。

$hts =~ s/##([^#]+)##/$FORM{$1}/g

この場合、
#hts から ##([^#]+)## を探して $FORM{$1} に全て置き換えようとしていると思うのですが、以下2点が理解できず困っています。

1.##([^#]+)## の意味
$htsに##で囲まれた文字列が複数あるのでそれら全てを探すということでしょうか?

2.$FORM{$1} の意味
$1は1.で検索した結果だと思いますが、$FORM{ }は一体なんでしょうか?

素人がいきなり解析するのは無謀なのは承知の上ですが、
どうしても業務で必要なので、お知恵をお貸し下さい。
よろしくお願いいたします。

Aベストアンサー

1.
perlを基準に「正規表現」で調べてごらん

2.
同じくperlでHTMLのformデータを受け取る方法を調べてごらん

Q$in{'~'}を$~に変換

CGIを改造中です。
変数の処理なのですが、サブルーチン内で利用するときに「$in{'~'}」と言う形でしか表示してくれません。これを「$~」の形にしたいです。
数が少なければ「$~ = $in{'~'}」を個数書けばいいのでしょうけど、結構数があるので、何か簡単な方法で変換できないかと考えています。
良い方法があれば教えてください。

Aベストアンサー

ハッシュのままで何か不都合があるのかなと
疑問に思いつつ・・・
#実際ハッシュは
#「(変数の)値に別の値を対応させる」
#ために存在するわけだから

けど,まあ,やろうと思えばkeys関数でできますよ.

%in=(
'X' => 1,
'Y' => 2,
'Z' => 3,
);

for $key (keys %in){
${$key}=$in{"$key"};
print "key; $key ${$key}\n";
}

print "$X $Y $Z";

strictとwarningsのプラグマを外さないといけないので
副作用の方が大きいでしょうが.

Q変数 $abc と ${abc}

$abcを
${abc}と書くのはなぜですか
よろしくお願いします。

Aベストアンサー

正確なところは知らないのですが、
{}で囲むと変数名を明確にすることができます。
$abc = "123";
の時、$abc . "456"のつもりで
print "$abc456";
とすると、変数abc456の内容が出力されます。
一方、print "${abc}456";
とすると、上手く行きます。

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Qwhile(<ハンドラ>) {} で行数をカウント

こんにちは。

掲示板をperlで作るという課題に取り組んでいるのですが、下記の部分の
動きだけがどうしても期待する動作がえられず、困っています。
なにか試した方が良い事がありましたら、ご指摘いただけないでしょうか。

プログラムの説明:
POST されたコメントを data.dat に追記していくプログラムです。
ファイルハンドラから一行づつ読み込んで、行数を $count でカウントし、
『X行目&&コメント』のようにコメントの先頭に行数を表示します。


#!/usr/bin/perl
$myfile = 'data.dat';

(省略)

sub piyo{
open(HOGE, ">> $myfile");
flock(HOGE, 2);
my $count = 1;
while(<HOGE>){
$count++;
};
print HOGE "$count行目&&in{'comment'}\n";
close(HOGE);

};


data.dat の期待する結果は下記です。

1行目&&コメント
2行目&&コメント
3行目&&コメント
.....

実際に data.dat に書き込まれた結果は下記でした。

1行目&&コメント
1行目&&コメント
1行目&&コメント
.....


試した事1:
open(HOGE, ">> $myfile");

open(HOGE, "+>> $myfile");
した。

試した事2:
while(<HOGE>){
$count = $count + 1;
};
とした。


どちらでも結果に違いがありませんでした。


よろしくお願いします。

こんにちは。

掲示板をperlで作るという課題に取り組んでいるのですが、下記の部分の
動きだけがどうしても期待する動作がえられず、困っています。
なにか試した方が良い事がありましたら、ご指摘いただけないでしょうか。

プログラムの説明:
POST されたコメントを data.dat に追記していくプログラムです。
ファイルハンドラから一行づつ読み込んで、行数を $count でカウントし、
『X行目&&コメント』のようにコメントの先頭に行数を表示します。


#!/usr/bin/perl
$myfile = 'data.dat';

(省略)

sub pi...続きを読む

Aベストアンサー

+>>をご使用なので、ファイルハンドラが最後に移動してないでしょうか。
ハンドラが最後に移動しているので、whileは実行されておらず、常にファイル末尾に1行目が出力されるというシナリオを想像します。

Perlfaqを使用して…

$lines = 0;
$filename = "yahho.txt";
open(FILE, "+<$filename") or die "Can't open `$filename': $!"; #open に+<を使用
while (sysread FILE, $buffer, 4096) {
$lines += ($buffer =~ tr/\n//);
print "p";
}
print FILE ++$lines . "やっほ~\n";

注意 open時にファイルの存在は保証してください。存在しない場合エラーです。


人気Q&Aランキング

おすすめ情報