世界を旅して人生を楽しもう。日頃のつまらないルーチンワークは全てスクリプト化している俺です。スクリプトは動的言語であれば気楽にかけるので何でもよいのですが、うちの会社の場合だと、ローカル環境はWindows、商用環境はLinuxなので、どちらでもそれなりに動くPerlをよく使います。スクリプティングでよくやるのは「ファイルを読み込み→いい感じの処理→ファイルを出力」だと思うので、そこら辺の注意点を忘れないように書いておきます。utf8;」を付けて、UTF-8で保存する。標準入出力は「binmode」で文字コード変換する。「Encode」モジュールで入出力をデコード・エンコードする。ARGVは自分でデコードしないといけない。utf8)」というUTF-8によくわからないフラグがついた文字コードとして扱います。そのため、外部からの文字列のやり取りには、文字コード変換が不可欠です。文字コードを考えずに扱っていると、日本語を使った瞬間に文字化けです。utf8;」を付けて、UTF-8で保存する。始めにutf8プラグマを設定する。日本語の文字数(3文字)が表示される。自動変換してくれるようになります。ファイル内でPerlの関数呼び出しが正確に行われるので、日本語書き放題です。標準入出力は「binmode」で文字コード変換する。標準出力しても文字化けしない。文字列」に自動変換してくれます。OSの文字コードを指定しておけば、標準入出力を文字化けせずに扱えます。「Encode」モジュールで入出力をデコード・エンコードする。ARGVの値を受け取り、出力しても文字化けしない。"e($user_input)n";例はbinmodeを使わずに、Encodeモジュールを使った場合です。出力する文字列」に変換します。utf8;」でも「binmode標準入出力」でも処理できない文字コード変換のために使うとよいと思います。例のARGVはデコードしなければいけません。文字化けしないファイル入出力それでは、文字コード変換のやり方が分かったところで、ファイル入出力の3つの方法を書きます。俺が勝手に3つに分けてみただけなので、あしからず。$out;やや長いですが、Encodeモジュールを使って確実に文字コード変換をしながら、ファイル入出力を行う方法です。OSの文字コードとファイルの文字コードが同じということはあまりないので、ファイル用に文字コードを定義しています。ファイルパスからファイルハンドルを得る際に、ファイルパスをエンコードしていることにも着目してください。ファイルパスを日本語で書いても動くってことです。$out;「binmode」は標準入出力以外にもファイルハンドルに対しても使用できます。Encodeモジュールをガッツリ使うよりもコンパクトになりました。何か世界を変えることをする。$out;「encoding」を使用することで、ファイル入出力の文字列を読み込んだり書き込んだ時点で内部文字列に変換してくれます。個人的には一番スマートな気がします。はい、これで誰でもPerlで文字化けしないいい感じの処理が書けますね。ARGVは自分でデコードしないといけない。ここまで文字コードを処理してきて、ふと思うのが、ARGV(コマンドの引数の配列)もbinmodeとかで自動的に内部文字列に変換できないのか?という疑問です。答えは残念ながらNOのようです。シンプルにデコードしましょう。@ARGV;うん、いい感じ。ARGVはencodingプラグマは効果がないので、Encodeモジュールで愚直にデコードしましょう。ちなみに、ファイルハンドルをスカラー変数に入れて使っていることに気づきましたか?Perl5.6より前のバージョンでは、ファイルハンドルをベアワード(bareword)としてしか使えませんでしたが、Perl5.6以降ではスカラー変数に代入できるようになりました。ファイルハンドルをスカラー変数として扱えば、ファイルハンドルのスコープ管理ができるので、安全なコードになります。簡単なスクリプトならベアワードでいいでしょ、という意見もありますが、私は、そんな無駄な区別をするぐらいだったら全部レキシカルなスカラー変数でいいでしょ、と思います。初の技術投稿ということで真面目に整理して書きました。最新の記事KD世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。Perlのサブルーチン呼び出しにアンパーサンドは必要か?Perlでサブルーチンを呼び出す方法はいくつかあります。OLEを使ってPerlからOutlookのメールを送信する方法WindowsにはOLEオートメーションというWindowsのアプリケーションにアクセスするインターフェースがあります。PerlでSQLplusからOracleのDBにアクセスする方法PerlにはDBIという便利なモジュールがあり、そのモジュールを使えばOracleのDBにアクセスることは簡単です。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。AuthorKD世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。0.0010このブログの運営のためにBitcoinでの寄付を募集しています。お気持ち程度の寄付を頂けると管理者の励みになります。最新の記事KD世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。Perlのサブルーチン呼び出しにアンパーサンドは必要か?Perlでサブルーチンを呼び出す方法はいくつかあります。OLEを使ってPerlからOutlookのメールを送信する方法WindowsにはOLEオートメーションというWindowsのアプリケーションにアクセスするインターフェースがあります。PerlでSQLplusからOracleのDBにアクセスする方法PerlにはDBIという便利なモジュールがあり、そのモジュールを使えばOracleのDBにアクセスることは簡単です。