まえがき
業務上でテキストデータ(Excelで保存したCSVファイル)を複数ファイル読み込んでデータ加工する必要性に迫られ、昔取った杵柄でPerlをもう一回やっている。
Perlを書く、動かす上でハマったことをメモしておく。
動作環境
Windows 10 Pro バージョン 22H2
WSL2(Microsoft Store版、詳しいバージョンは下記のとおり)
Ubuntu 22.04.01 LTS(Microsoft Storeより)
PS C:\Windows\system32> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.19045.2486
設定ごと
CPANでのプロキシー設定
ざっくり説明すると、こんな感じ。
> o conf # 設定値の確認
> o conf http_proxy # http_proxy設定値の確認
> o conf http_proxy http://192.168.0.1:8080/ # http_proxy設定値の一時反映
> o conf commit # 設定の永久反映
プロキシーサーバーの利用にユーザーやパスワードが必要なら、設定値にproxy_user
やproxy_pass
などありますよ、と。
Perlのモジュール追加方法
cpanプログラムを使ったけれど、makeのところでずっこけるので、「Can't exec make No such file or directory [Fix] - Techglimpse」の記事を参考に、sudo apt-get -y install build-essential
などとした。
あとは、sudo cpan
してcpanプロンプト上でCPANの新しいのがあるぞみたいなメッセージがあったので、install CPAN
とreload cpan
してCPANを最新化したのち、install Text::CSV_XS
をしてモジュール追加できた。
PerlをPhpStormで書けるように
「どうしても業務命令でPerlを使わざるを得ないあなたに送る、IDE(IntelliJ)でPerlを殴る方法。 | あそびば32」の記事を参考に、Perl::Tidy
とPerl::Critic
は入れておこうと思う。
この2つのモジュールはシステム用というよりも個人用の認識なので、sudo使わずにcpan
としてそれぞれinstallしてみる。
言語&フレームワークのPerl5にて、WSL2越しのUbuntu-22.04にあるPerlインタプリタを指定しつつ、「Enable Perl::Critic annotations(should be installed)」をチェックし、「Perl::Tidy command line arguments」に-l 120
としてみた。
とはいえ、PhpStormから直接Perlスクリプトを実行するのはできなさそうで、Windows Terminalで開いているUbuntu-22.04窓のbashで実行させてる。
そのほか、雑なテクニック類のメモ
コードの始め方
ひとまずこんな感じ。
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
shbangを書いておくことで、Ubuntuコンソール上で直接「$ ./~~.pl」だけでスクリプト実行できるので便利。
use utf8;
でUTF-8を扱うのと、use strict;
で文法チェック強化、use warnings;
で警告表示。
標準出力にUTF-8エンコーディングを指定
print で変数の中身を出力するときに「Wide character in print at ~」みたいな警告にならないように対策。
binmode(STDOUT, ":utf8");
シェルスクリプトで他のコマンドとパイプでつなぐときは、STDINに対しても":utf8"しとくべきでしょうね。
ファイル入出力時の改行コード指定とエンコーディング指定
ファイルにアクセスするときの open の書き方。 下記の例はファイル入力としてのもの。
open $FH, '<:crlf:encoding(utf8)', '~~.csv';
:crlf
で改行コードがCR+LFであることを指示し、:encoding(UTF-8)
でエンコーディングがUTF-8であることを指示。
Excelさんが出力するCSVファイルがCRLFで改行とするので仕方ない。
:crlf
の指定を忘れると、いくらchomp $line;
としてもCRコードを省けない。
入出力のモード指定の別の方法として
Perlモジュールの open - 入出力のためのデフォルトの PerlIO 層をセットするための perl プラグマ - perldoc.jp によるPerlIO層の変更指示の書き方もアリなようです。
(試していないので例示は省略。)