- ベストアンサー
Perlでのパーミッション変更の仕方
perlでパーミッションの変更を使おうと思っているのですが、うまくいきません。 chmod(0750,$file);ではただしく実行されるのですが、 $per = "0750"; chmod($per,$file);にすると、0356になってしまいます。 なぜ変数ではできないのでしょうか。 よろしくおねがいします。
- みんなの回答 (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') が使えます。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
chmod の第1引数は数値 (整数) を要求していて, 「文字列を数値に変換する」ときには必ず 10進数と解釈するから. 実は perldoc を読めばこの辺は全部書いてある.
- u-bot
- ベストアンサー率58% (1736/2988)
Perlは少しかじった程度なので勘違いならすみません。 $per = "0750"; でダブルクオートで代入しているため$perに10進数で750という値が入っているのではないでしょうか? 750(10進数)=1356(8進数)で下3桁の356が設定されているのが原因かもしれません。 print $per で$perの中身を確認してみて下さい。 0750をそのまま代入したいのであればシングルクオートで囲ってみてはどうでしょうか? $per = '0750';