dポイントプレゼントキャンペーン実施中!

perlでパーミッションの変更を使おうと思っているのですが、うまくいきません。

chmod(0750,$file);ではただしく実行されるのですが、

$per = "0750";
chmod($per,$file);にすると、0356になってしまいます。

なぜ変数ではできないのでしょうか。
よろしくおねがいします。

A 回答 (3件)

そういう仕様でしょう。



Perlの数値定数の場合は 0x 先行で 16進、 0 先行で 8進を意味します。

だから、chmod(0750,$file); は chmod(488,$file); と等価です。

一方、数値が必要なところに文字列があると自動的に数値に変換されますが、その時は 0x や 0 先行で 16進や 8進という規則がありません。

つまり、chmod('0750',$file); は chmod('750',$file); と等価でさらに chmod(750,$file); と等価です。 chmod(0750,$file); とは違うのです。


'0750' または '750' という文字列から 488 という数値を得るには、 oct('750') または oct('0750') が使えます。

参考URL:http://perldoc.jp/docs/perl/5.8.4/perlfunc.pod
    • good
    • 0

chmod の第1引数は数値 (整数) を要求していて, 「文字列を数値に変換する」ときには必ず 10進数と解釈するから.


実は perldoc を読めばこの辺は全部書いてある.
    • good
    • 0

Perlは少しかじった程度なので勘違いならすみません。



$per = "0750";
でダブルクオートで代入しているため$perに10進数で750という値が入っているのではないでしょうか?
750(10進数)=1356(8進数)で下3桁の356が設定されているのが原因かもしれません。

print $per
で$perの中身を確認してみて下さい。
0750をそのまま代入したいのであればシングルクオートで囲ってみてはどうでしょうか?
$per = '0750';
    • good
    • 0

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