- 投稿日:
PerlのクラスはPythonみを感じる奥ゆかしい作りになっている。
ファクトリ関数でオブジェクトを生成して、そのオブジェクトの参照を引き回すことで実現してる感じ。
確認環境
Env | Ver |
---|---|
Perl | 5.34.0 |
基本
ファイル拡張子は.pm
が一般的だと思われる。ファイル名とクラス名がリンクしているためPath/To/UpperCamel.pm
が多分いい
ハッシュに突っ込んでいく方式
# これがクラス名になる。PATH::TO::NAME構文で書く
package Example;
use strict;
# コンストラクタ
# 第一引数にはpackageのフルパスが入り、第二引数以降に通常引数が入る
sub new {
# 祝福することでインスタンスオブジェクトを生成できる
my $self = bless({}, shift);
# フィールドに値を突っ込む。これがプロパティになる。アクセサはない
$self->{hoge} = shift;
$self->{piyo} = shift;
# インスタンスを返す
return $self;
}
# メソッド
# 第一引数にはインスタンスオブジェクトが入る。アクセサはない
sub get_hoge {
my $self = shift;
return $self->{hoge};
}
1;
オブジェクト生成時にアサインする方式
package Example;
use strict;
sub new {
my ($class, @args) = @_;
my $self = bless({
hoge => shift @args,
piyo => shift @args
}, $class);
return $self;
}
sub get_hoge {
my $self = shift;
return $self->{hoge};
}
1;
クラスインスタンスの生成
ディレクトリ構成
├─library
│ └─Example.pm
└─main.pl
コード
クラスのコードは前述の内容
use strict;
# useするモジュールのパスを指定するおまじない
# パスにはクラスファイルを格納している根本のパスを指定する
# 標準モジュールは区別されるようで、この行の下にuse IPC::Open2;とか書いても、ちゃんと本来のモジュールが読み込まれる
use lib './library';
use Example;
# コンストラクタ呼び出しは()で囲まないとエラーになる
my $ex = Example->new("aaaa", 123);
print $ex->{hoge}."\n";
print $ex->{piyo}."\n";
print $ex->get_hoge."\n";
継承
基底クラス
package Example;
use strict;
sub new {
my $self = bless({}, shift);
$self->{hoge} = shift;
$self->{piyo} = shift;
return $self;
}
sub get_hoge {
my $self = shift;
return $self->{hoge};
}
1;
子クラス
package ExampleChild;
use strict;
use parent 'Example';
sub new {
my ($class, @args) = @_;
my $self = $class->SUPER::new(shift @args, shift @args);
$self->{fuga} = shift @args;
return $self;
}
1;
あとがき
仮引数を名前付きで取るかshift
で取るかは微妙に悩む。shift
の方がPerlらしい気もするし、変数名を変更するときの手間を考えると楽ではある。しかしshift
は読みづらいし、名前付き変数を列挙したほうが読みやすい気もする。
今回Perlをある程度書いてみた感じ、Perlはかなり書き方が自由に感じたし、そこはかなり楽しかったが、コーディング規約という面で見ると自由すぎると困る部分もあるし、判り易いほうがいいのでshift
は避けたほうがよさそうだ。
しかし普段JSを書いたりしている中で、クラスとは新しいオブジェクトを返す関数なのでは?と思っていたので、その辺りの解像度が上がったのは良かった。
参考
ぶっちゃけまともにPerlを書くのはこれが初めてなので、クラスとは直接関係ないサイトもある。
perldoc.jpは公式ドキュメントの日本語訳らしい。今も更新されている。
- Perl/CGI 300の技 - とほほのWWW入門
- ある種の定番的なサイトだと思う
- perlootut - Perl でのオブジェクト指向プログラミングのチュートリアル - perldoc.jp
- PerlのOOP全般開設
- Perlの組み込み関数 use の翻訳 - perldoc.jp
- useについて
- Perlの括弧による振る舞いの違いとリファレンス・デリファレンス #Perl - Qiita
- 括弧が何かについて
- Hatena-Textbook/foundation-of-programming-perl.md at master · hatena/Hatena-Textbook
- はてな社による詳解。流石は老舗のWeb企業だけありPerlへの愛が深い
- 投稿日:
確認環境
Env | Ver |
---|---|
Ubuntu | 22.04.3 LTS |
やり方
# sambaの導入
sudo apt install -y samba
# sambaユーザーの作成
export $NEW_USER=hoge
sudo useradd -s /usr/bin/zsh $NEW_USER
sudo passwd $NEW_USER
sudo mkdir /home/$NEW_USER
sudo smbpasswd -a $NEW_USER
# 必要最低限の設定を突っ込んでおく
sudo cp ~/.nanorc /home/$NEW_USER
sudo cp ~/.zshrc /home/$NEW_USER
sudo cp -R ~/.zsh /home/$NEW_USER
sudo chown -R $NEW_USER:$NEW_USER
# 元の設定退避
sudo cp smb.conf smb.conf.default
# 設定追加
cat <<EOF | sudo tee -a /etc/samba/smb.conf
[$NEW_USER]
path = /home/$NEW_USER/
browsable = yes
writable = yes
guest ok = no
read only = no
create mask = 0644
directory mask = 0755
vfs objects = recycle
recycle:repository = /home/$NEW_USER/.recycle
recycle:keeptree = yes
recycle:versions = yes
recycle:touch = no
recycle:maxsize = 0
recycle:exclude_dir = .recycle
EOF
トラブルシュート
同一IPのsambaに異なるユーザーでアクセスできない
例えば\192.168.1.10\hoge
にhogeユーザー、\192.168.1.10\piyo
にpiyoユーザーでアクセスしようとすると上手くいかない。これはWindowsの資格情報がホスト単位であるためと思われる。hostsにドメインを切るなどし、ホスト部を別個にすると上手くいくようになる。
この場合、hoge.local
とpiyo.local
を192.168.1.10
に向け、それぞれにhogeユーザーとpiyoユーザーの認証情報を持たせることで両立できる。
因みに\192.168.1.10\hoge
にhogeユーザー、\192.168.1.10\piyo
にもhogeユーザーでログインすることはできるが、基本的に権限周りで問題が起きると思う。無難なのは何かしらグループを作っておき、そのグループであれば自由に読み書きできるフォルダをsambaの共有フォルダに設定することだろう。
- 投稿日:
base64みたいなコマンドを使いたい時に
確認環境
Env | Ver |
---|---|
Perl | 5.34 .0 |
サンプルコード
バッククォートでコマンドを括り、後はシェルスクリプト度同じ理論で書くと行ける
# base64エンコードされた文字列
my $input = 'Kipib2xkKioKKml0YWxpYyoKfn5zdHJpa2V+fgotIGxpCiAgLSBzdAp8VEF8QkxFfAp8LS18LS0tfAp8YWF8YmJifAp8Y2N8ZGRkfAo=';
# 変数を標準出力に展開し、base64の標準入力として使い、base64コマンドの標準出力を戻り値の変数に格納している
my $output = `echo $input | base64 -d`;
print $output;
出力
**bold**
*italic*
~~strike~~
- li
- st
|TA|BLE|
|--|---|
|aa|bbb|
|cc|ddd|
ダメだったコード
その1
# 標準ライブラリからopen2を取得
use IPC::Open2 qw/open2/;
my $pid = open2 *READ, *WRITE, 'base64 -d';
# base64エンコードされた文字列
print WRITE 'Kipib2xkKioKKml0YWxpYyoKfn5zdHJpa2V+fgotIGxpCiAgLSBzdAp8VEF8QkxFfAp8LS18LS0tfAp8YWF8YmJifAp8Y2N8ZGRkfAo=';
close WRITE;
my $output = <READ>;
close $READ;
waitpid $pid, 0;
print $output;
出力
何故か一行目しか出ない
**bold**
その2
# 標準ライブラリからopen2を取得
use IPC::Open2 qw/open2/;
my $pid = open2 my $reader, my $writer, 'base64 -d';
# base64エンコードされた文字列
print $writer 'Kipib2xkKioKKml0YWxpYyoKfn5zdHJpa2V+fgotIGxpCiAgLSBzdAp8VEF8QkxFfAp8LS18LS0tfAp8YWF8YmJifAp8Y2N8ZGRkfAo=';
close $writer;
my $output = <$reader>;
close $reader;
waitpid $pid, 0;
print $output;
出力
何故か一行目しか出ない
**bold**
参考
- コマンドの実行結果を読み取る(1)(
...
, qx/.../) - とほほのWWW入門 - モジュール - とほほのWWW入門
- [外部コマンドの実行 [open2, open3] – mahori blog](https://mahori.jp/perl-external-command-2/)
- 投稿日:
Nanoで{Ctrl}
+{Q}
を終了に割り当ててたらVSCodeで終了できなくなったので、それを解消した話
確認環境
Env | Ver |
---|---|
Visual Studio Code | 1.85.2 |
方法
基本は"terminal.integrated.allowChords": false
で防げるが、それでも出てくるものについてはキーボードショートカットの設定から{Ctrl}
+{Q}
などで検索し、該当するコマンドを調べ"terminal.integrated.commandsToSkipShell": []
に、頭に-
を付加した、"-command"
形式で記載すると出てこなくなる。
例
{
"terminal.integrated.allowChords": false,
"terminal.integrated.commandsToSkipShell": [
"-workbench.action.quickOpenView",
],
}