sironekotoroの日記

Perl で楽をしたい

Sublime Text 3 の Build System で (システム|ユーザー)Perl を動かす

今日は、Sublime Text 3 というテキストエディタで、書いたそばから Perl スクリプトを実行できる Build System についての解説です。

同様の記事は検索するとそれなりにあるんですが、自分用にも残しておこうと思いました。

なぜなら、ブログとかホームページサービスってよく消えるんですよね・・・

他にも、いろいろ。

だから、誰かが書いてくれたものが残っていて、検索できるからいいかな?ではなく、自分で書き残しておくことにも意味があるなぁ、と思ったんですね。

Sublime Text 3 の Build System で システム Perl を動かす

Sublime Text 3 の初期状態では、Build System に Perl はありません。悲しい。

そこで、追加していきます。

この記事を書いた環境は以下となります。

  • macOS Mojave (10.14.6)
  • Sublime Text 3 (Version 3.2.2, Build 3211)

メニューから以下のように進みます。

Tools -> Build System -> New Build System...

untitled.sublime-build というタブが開かれます。初期状態はこれだけ。

{
    "shell_cmd": "make"
}

これを以下のように編集し、保存します。ファイル名は Perl.sublime-build とします。

{
    "cmd": ["perl", "-w", "$file"],
    "file_regex": ".* at (.*) line ([0-9]*)",
    "selector":"source.perl"
}

これだけです。

早速、Sublime Text 3 の新しいタブで以下のPerlスクリプトを作成し、 Build System で動かしてみましょう。ファイル名は perl_ver.pl とします。

#! /usr/bin/env perl
use strict;
use warnings;

print "Perl version: " . $^V ;

特殊変数 $^V を使っています。これは実行しているPerlのバージョンを表示する、定義済みの変数です。定義済みなので my は不要です。

自分の環境(macOS Mojave)では Perl version: 5.18.4 と表示されます。

Sublime Text 3 の Build System で ユーザーPerl (plenv) を動かす

Perl入学式でもお伝えしているように、 Perl にはインストールの仕方によって「システムPerl」と「ユーザーPerl」とに分けることができます。

システムPerlとユーザPerl

OSに最初から入っているPerlを システムPerl と呼ぶことがあります。

それに対して、自分専用・開発専用のPerl環境である ユーザPerl を構築することもあります。本格的な開発においては、ユーザPerlを利用することが多くなっています。

とはいえ、単にPerlの勉強を始める、という状況であれば、システムPerlでも十分です。

Perl入学式では「システムPerl」を利用しながら、Perlを勉強していきます。

システムPerlを使うのであれば、上記の設定だけで動きます。

しかし、 plenv などで複数のユーザーPerlを入れている場合、 plenv で利用している Perl のバージョンが Build System で反映されません。

このため、ターミナルと Build System で実行する Perl バージョンが異なる、という現象が発生します。

ターミナルで実行

2019-12-19 12:10:36 ~/Dropbox
$ plenv -v
plenv 2.2.0

2019-12-19 12:11:31 ~/Desktop
$ plenv global
5.28.1

2019-12-19 12:11:36 ~/Desktop
$ perl perl_ver.pl
Perl version: v5.28.1

Sublime Text 3 の Build System で実行

Perl version: v5.18.4
[Finished in 0.0s]

同じスクリプトを動かしても、ターミナルでは 5.28.1Sublime Text の Build System では5.18.4

いくら Perl後方互換性に優れているとはいえ、なんか嫌・・・とは思いませんか?うちは思います。生まれし日、時は違えども同じPerlを使いたい!

ということで、さらに設定を進めていきます。

Sublime Text -> Preferences -> Settings と進めると、左右に分割された編集画面が開きます。この右側の Preferences.sublime-settings -- User こちらを編集します。

{
    "build_env":
        {
            "PATH": "$HOME/.plenv/shims:$PATH"
        },
}

この設定を追加します。Sublime Text 3 の設定ファイルはJSON形式なので、この設定を末尾に書く場合には最後の , カンマを取り除いてください。

この設定を加えることで、 Build System のPerlがPlenvで設定したPerlを使ってくれるようになります。(追加後は Sublime Text3 の再起動が必要かも?)

これは、Sublime Text の Build Systemが .bashrc や .bash_profile 、はたまた .zshrc などの、いわゆるシェルで設定した環境変数を読み込んでいないため、ということのようです。

とりあえず、これで任意のバージョンのユーザーPerlSublime Text で動かすことができるようになりました。

余談1

plenv 、複数の Perl 入れらるのってどんなメリットがあるのかなー?とかつては思っていました。

お仕事の現場では、サービスの導入時期によって利用しているPerlのバージョンが異なっていることがあります。

  • サービスA: Perl 5.8.8
  • サービスB: Perl 5.16.4
  • サービスC: Perl 5.20.0

こんな感じで。

最新のPerlのバージョンに合わせていくのが理想ではありますが、時間、お金、人員などの兼ね合いでなかなかそうもいかない場合も多い・・・ものです(一般化

未だ現役なPerl5.8 & MySQL4.0とどう戦うか? ライブドアブログが生んだカオスとレガシーからの脱却 - ログミーTech

Perl がいかに互換性に優れた言語とはいえ、セキュリティ対策などでバージョン間で差異が発生することがあります。

そういったとき、任意のバージョンの Perl を切り替えて開発していきたい、となるわけですね。

余談2

Perl入学式では、開講時期の都度、利用しやすいエディタを受講生の方に勧めています。

私が受講生だった2013年当時は Sublime Text 2 でした。

https://github.com/perl-entrance-org/workshop-2013-01/blob/master/02.introduction/slide.md#sublime-text2

特にこだわりのない方は, Sublime Text2を試してみることをおすすめします.

これがうちと Sublime Text との出会いです。2014年に70$でライセンスを購入。今は80$になってますね。

とても使いやすく、十分に元を取れた投資でした。

余談3

Perlスクリプトを成形するPerlTidyというものがあり、それをSublime Text3から呼び出す Sublime PerlTidyというpackage(sublimetextのアドオン)があります。

github.com

これを動かした際にも、パスが通っていないよ!との警告が出たので、Sublime Text -> Preferences -> SettingsPreferences.sublime-settings -- Userを以下のように追加しています。Sublime Text3 の再起動が必要でした。

       "PATH": "/usr/local/bin/:$HOME/.plenv/shims:$PATH"

全体としてはこのようになっています。

{
    "build_env":
    {
        "PATH": "/usr/local/bin/:$HOME/.plenv/shims:$PATH"
    },
    "close_windows_when_empty": false,
    "color_scheme": "Packages/Color Scheme - Default/Sixteen.sublime-color-scheme",
    "font_size": 19,
    "ignored_packages":
    [
        "Vintage"
    ],
    "tab_size": 4,
    "translate_tabs_to_spaces": true,
    "PATH": "/usr/local/bin/:$HOME/.plenv/shims:$PATH"
}