Perlについての質問箱 64箱目

■ このスレッドは過去ログ倉庫に格納されています
2019/02/01(金) 09:44:37.18ID:1/Kr4Qjk
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板: https://medaka.5ch.net/php/

このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
荒らしはスルー推奨。

"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、
Perlの奥深さについて皆で語り合い、追求してまいりましょう。

www.perl.org/get.html
Download Latest Stable Source (5.28.1)

▼前スレ
Perlについての質問箱 61箱目
http://toro.5ch.net/test/read.cgi/tech/1381561905/
Perlについての質問箱 62箱目
http://toro.5ch.net/test/read.cgi/tech/1385039352/
Perlについての質問箱 63箱目
https://mevius.5ch.net/test/read.cgi/tech/1392820583/
2020/02/19(水) 05:39:50.97ID:6o0SSmsW
>>215
そしてコメント書くぐらいなら関数にしろ
2020/02/19(水) 09:01:28.79ID:pJACNDga
他人にわかってもらいたくないんだろう。
2020/02/19(水) 09:31:49.80ID:oZi5GQ/y
ほら、こんなコードで実現できるんやで、
なにやってるか一見わからんやろ
説明しよか?

みたいに言いたくなったら、それは可読性が悪い証拠
2020/02/19(水) 12:23:16.28ID:CZsThdPw
Perl慣れしていない人の事を考える必要があるなら
標準モジュールの List::Util で uniq を使えばいいし、
https://perldoc.perl.org/List/Util.html#uniq

何らかの理由で標準モジュールや XS が使えないなら
Pure-perl 実装を CPAN から拾ってくればいいし、
https://metacpan.org/search?q=List%3A%3AUtil

実際 List::Util::PP::uniq() の中身はその手法だぞ。
https://metacpan.org/release/List-Util-MaybeXS/source/lib/List/Util/PP.pm

sub uniq (@) {
  my %seen;
  my $undef;
  my @uniq = grep defined($_) ? !$seen{$_}++ : !$undef++, @_;
  @uniq;
}
2020/02/19(水) 16:51:28.60ID:/J962Gym
perl使い生きてた
2020/02/19(水) 18:36:12.61ID:X6PQVyJY
勉強になるというか、どこで学んだの
2020/02/19(水) 19:52:56.93ID:SoQYbBiO
>>219
書かないから心配するな!
1+1と同じレベルだからな!
2020/02/19(水) 20:07:21.32ID:pJACNDga
そういう思想の馬鹿しかおらんからperlは廃れたんだよ。
2020/02/19(水) 20:07:27.51ID:zh3CM0eN
if (defined $table{$var}) {
 $var = $table{$var};
}

みたいな処理
「何か」に対して判定した結果に従ってその「何か」を採用する

何かを2回書くのが嫌な時の逃げ方は何だろう
2020/02/19(水) 20:12:42.87ID:1DPeZovD
リストの要素数を得るために空リストに代入するのも慣用句と読んでいいかな?
$n = (() = <*>);
みたいの。
2020/02/19(水) 21:01:35.09ID:zh3CM0eN
要素数なんてどうせループにしか使わないので、
そんなのを取得しない解決がきっとエレガント
pythonの何でもイテレータ思想はきっと正しい
2020/02/19(水) 21:35:36.75ID:bGX6osz8
>>227
これはあるね しばし考えるんだけど結局一時変数を使う
構造によっては$_が使える時もあるんだけどまれだなあ
2020/02/19(水) 21:45:00.08ID:mEonuRdN
>>226
じゃあRubyやらC#やらも滅びるんやな。w

ハッシュのある言語ではあたりまえのイディオムやろが。
2020/02/20(木) 00:34:37.37ID:bivTkZxZ
まあ最近の言語は便利な標準メソッド呼べば終わりって感じだからね
Perlは標準モジュールの範囲だけでやろうとすると結構面倒
2020/02/20(木) 00:35:55.90ID:1VYpL0NG
スレに人が来ていてオジサンうれしいよ
2020/02/20(木) 01:29:24.69ID:bivTkZxZ
最近はPerlのことを喋ると謎の軍団が叩きに来るからな
ネット上で喋れる場所がなくなった
迫害されてる気分
235デフォルトの名無しさん
垢版 |
2020/02/20(木) 13:15:43.08ID:fXEOX4Gg
Perl/Tk は使い物にならん。プログラムが大きくなると動かないでやんのw
Perl/Qt を推進していくべき。

ここの人はPerlでGUIを使ったりしてる?
2020/02/20(木) 15:23:29.96ID:Gm5IubjH
Windows限定だが、Win32-GUIを使ってるよ。
インストールして、次のバッチファイルを走らせると、
細かい具体例のデモが見れる。
C:\Perl\site\bin\win32-gui-demos.bat
2020/02/20(木) 17:36:38.86ID:Nllb9nDe
>>231
そうではなくて独自の記号にコンテキスト毎に意味を詰め込む様な言語思想のこと言ってるんだがね。
2020/02/20(木) 18:47:26.22ID:CqCGFBWH
入力も出力もテキストで完結してるのがいい

と思ってたけど、最近excelデータを入出力に使い出した
2020/02/20(木) 20:33:42.77ID:0HRLUjae
短絡論理演算子を使うという方法もあるが、お気に召すかどうかは知らん。
2020/02/20(木) 20:44:08.31ID:CqCGFBWH
>>227の例だと
$var = $table{$var} or $var
で概ね動くけど、空文字列なんかが入ってた時に誤動作する

判別はdefinedしか無いとして、それでも書ける短絡評価とは
2020/02/20(木) 21:36:24.51ID:uxa6Suua
defined-or使うだけじゃないの?
$var = $table{$var} // $var;
2020/02/20(木) 22:00:38.63ID:0HRLUjae
アンカー入れ忘れたのによく分かってくれたな。ありがとう。
2020/02/20(木) 22:37:06.65ID:CqCGFBWH
そんな演算子知らん
2020/02/20(木) 23:16:35.88ID:NRacWxGd
null合体演算子は最近の流行りやぞ?
2020/02/21(金) 01:54:46.68ID:dQ0Yz//t
//流行ってる気がしない。
新しい機能を積極的に使う人はそもそもperlを使わないのではないか。
断固外氏のブログのネタにしかなってなさそう。
2020/02/21(金) 02:18:25.95ID:YvRUEPlL
5.8じゃ使えないからね
それだけで使わない理由になる
2020/02/21(金) 03:26:53.00ID:6/adwu75
細かいけど優先度は// > = > orだよ
2020/02/21(金) 03:54:06.99ID:6/adwu75
>>227と等価なのは>>241
この例はdefinedだったから適用できるのね
判定が任意だとするとやはり2度書くしかないかね 例えば
if ($table{$var} % 3) {
 $var = $table{$var};
}
perlは同一値への参照と解釈して2回読みにはいかないという気の利いたことはしないだろうね
エクセプション入ったら変わる可能性あるしね
2020/02/21(金) 03:58:30.72ID:6/adwu75
//=の逆バージョンあったらいいなとはたまに思うね
そこまで必要性ないという判断でないのだろうけども
2020/02/21(金) 07:05:24.88ID:TnPEnehp
$table{$var} が $_ に入るような無害な処理をしておいて、
$var = $_ % 3 ? $_ : $var
と等価なシンタックスシュガーで処理する
みたいなことができれば
2020/02/21(金) 09:05:21.00ID:KvZFDIbR
2回読みたくないというのがどういうレベルでの事か分からんが
ソースコードの見た目だけならサブルーチンに押し込めばどうとでも

#!/usr/bin/perl -w
use strict;
use Scalar::Util qw(looks_like_number);

sub dp {
  defined $_[0] ? "d[$_[0]]" : 'u[]';
}

sub if_true(&$$) {
  local $_ = pop;
  $_[1] = $_ if &{$_[0]};
}

my %table = ('' => 1, 0 => 2, a => 3, b => 4, c => 0, d => '', e => undef);
for my $var (sort keys %table) {
  print dp($var), dp($table{$var});
  if_true { looks_like_number($_) && $_ % 3 } $var => $table{$var};
  print " => var[$var]\n";
}
2020/02/21(金) 09:57:55.58ID:PzVMR7sv
サブルーチンとか甘え。謎の記号を使って魔法のようなコードを書くのがPerlの醍醐味。可読性は悪
253デフォルトの名無しさん
垢版 |
2020/02/21(金) 12:24:11.67ID:TKnLlA6x
>>235
昔々 Perl/Tk 使おうと思ったが日本語対応が出来てなくて止めたことがある。
それ以来 Perl で GUI はやってない。
2020/02/21(金) 14:01:10.98ID:OOdvSVAe
絶対やらないけど
$_ % 3 and $var = $_ for $table{$var};
2020/02/21(金) 15:45:08.67ID:ooEapY6E
>>253
それ、5.6以前の話?記憶が曖昧だけど、utf8に対応した5.6あたりから、Tkで日本語使えたような気がするけど。
256デフォルトの名無しさん
垢版 |
2020/02/21(金) 18:15:13.09ID:TKnLlA6x
>>255
忘れた。20年ぐらい前だったかな?
2020/02/22(土) 22:24:09.42ID:pvGxmVZm
裏でずっと何かしてるスクリプトを走らせておきたい
ActivePerlのウィンドウが出るのが嫌なので、wperlを起動してウィンドウを出さない
でも、wperlを起動する為のbatファイルのウィンドウがずっと出てる
batファイル以外のいい起動方法はないだろうか
2020/02/22(土) 22:46:33.37ID:KpqdZij5
>>257
start "" "wperl ..."
2020/02/22(土) 22:47:18.24ID:+QQ7ccWr
ショートカットでよくね?
2020/02/22(土) 23:01:19.35ID:pvGxmVZm
wperl以降を""で括ると動かないけど、無くせば動いた
これでサーバ監視ができる
261デフォルトの名無しさん
垢版 |
2020/02/23(日) 06:57:52.64ID:6djC7Yo0
Linuxなら何も考えずにできるが・・・
2020/02/23(日) 07:18:43.14ID:u5LzmB/p
pingが通るようにしてしまえばwindowsでもそういうのは既にある
2020/02/23(日) 12:43:19.44ID:1MmoNroU
>>261
シェルからふつうに起動したら、親プロセスとの関連でトラブルが発生するところはどちらも同じ。
というか、むしろLinuxのほうがわかりにくくてひどい。
disownとかnohupとか知ってるか?
264デフォルトの名無しさん
垢版 |
2020/02/24(月) 04:42:11.62ID:jrwZftYn
知ってるよ。
2020/02/25(火) 12:21:34.80ID:Z4NIrtJK
>>260
何か使い方間違ってない?
次のようなコマンドで、普通に通るぞ。
wperl.exe "C:\utp\foobar.PL" "C:\foo\bar.txt"
2020/02/25(火) 23:35:33.10ID:Vpd+P02x
>>265
>>258
2020/03/05(木) 09:29:31.48ID:hJr+GlCd
ブラウザでは普通に見られる楽天市場の商品ページ
(item.rakuten.co.jp/shop_mei/a012345/)を get 出来なくなった。
ユーザーエージェントやらリファラはイジってみたけど
2020/03/05(木) 12:43:29.56ID:eb4C0HQQ
active perl の ppm がなくなっていろんなモジュールが動かないのだが、困ってるの俺だけ?
ググっても誰も文句言ってないな
2020/03/05(木) 12:50:46.42ID:WFS2X5DF
>>268
>>142 でオレが文句を言ったが。
結局、一生5.22 を使い続けることにした。
2020/03/05(木) 14:56:24.55ID:NI6SkVuR
新しめのバージョン追ってる人はもう大半がactive perl捨ててstrawberry perlに移住したんじゃね
2020/03/05(木) 20:36:47.91ID:HImUaDHG
つい最近ppm使ったような
2020/03/06(金) 00:11:57.41ID:Wxp9Lzi1
strawberry perl なら cpan インストーラ、もう少しまともに動くのか。
明日、試してみる。
2020/03/06(金) 08:49:13.30ID:20KFjtwq
https://community.activestate.com/forums/ppm

5.26以前なら、ppmは使えないことはないけど、「保守はしない」ということだね。
274デフォルトの名無しさん
垢版 |
2020/03/06(金) 09:25:47.73ID:7w4EZP5c
>>268
WSLでLinuxそっくり環境の中で普通のPerl使うかOS丸ごとLinuxにしてしまえば悩むことはなくなる。
2020/03/06(金) 13:37:53.57ID:OG/dFmOQ
macという手も
2020/03/06(金) 13:53:08.52ID:YSIXaKl0
visual studioインストールして普通にビルドすれば?
Makefileちょっと変更してnmake叩くだけだよ
2020/03/06(金) 18:40:33.19ID:JNQJmFQ4
>>274
MSYS2のがええで。
WSLは別物。
2020/03/06(金) 19:44:20.68ID:/FgvtXba
もう Perl6 でラクになれよ
2020/03/06(金) 23:38:47.92ID:nrb1VEEF
strawberry perl をインストールしたけど、いろんなモジュールをまたゼロから入れなきゃいけないと思ったらヤル気なくなってとりあえず active perl に戻した。
次は active perl のディレクトリを調べて同じモジュールを strawberry perl にインストールするバッチファイル作んないと。
2020/03/07(土) 06:00:24.07ID:Q6Yn3ttH
>>279
そんな時代はもう終わってるぞ。

Windows版のPerlは使わない。WSLを使ってLinux版を使う
Perlのバージョンはplenvで管理し、いろんなモジュールは(俺が知っているときと変わってないなら)
cpanやcpanmあたりでプロジェクトごとに簡単にインストールする。

ソースコードをgitで管理してるとして、新しくプロジェクトに参加するなら、
plenvでperl入れて、git cloneしてモジュール入れるコマンド(cpanm?忘れたw)を叩くだけだ。
2020/03/07(土) 08:04:07.87ID:GE9TyCQC
で、どうやってwindowsから動かすんだ?
2020/03/07(土) 13:07:09.85ID:nxiojuUK
>>280
クリップボード使えない
アイコンダブルクリックで実行できない
オタクは自分の世界に閉じこもってシコシコやってろよバカ
2020/03/07(土) 18:28:23.07ID:jD3HBeI4
> クリップボード使えない
使える

> アイコンダブルクリックで実行できない
CLIでアイコンって何言ってるの?
284デフォルトの名無しさん
垢版 |
2020/03/08(日) 01:15:11.77ID:DyTj6VlC
perlのスクリプトファイルが関連付けされてたらアイコンダブルクリックで実行できるんだけどね
2020/03/08(日) 01:34:31.02ID:rEU5WeDw
>>283
>>284
流れ的にWSLの話やぞ?
286デフォルトの名無しさん
垢版 |
2020/03/08(日) 01:44:53.18ID:DyTj6VlC
>>285
勝手に流れ変えるなよw
>>280がwslって言いだしてwslじゃ不便もあるって話だろ?
2020/03/08(日) 05:59:45.97ID:P20sq25k
>>284
何が不便なのかわからない。

関連付けの設定をするのが面倒な ”だけ” か?
ならやっぱりWSLでいいだろ。

関連付けの設定方法がわからないんですは
プログラマやめれのレベルだからな
2020/03/08(日) 06:00:52.67ID:P20sq25k
>>286
だからWSLでクリップボード使えるし、
関連付け設定を自分でやればWSL上のスクリプトを動かせる
2020/03/08(日) 07:36:51.62ID:nyv63FmX
explorerから.plファイルを起動すると、カレントディレクトリのファイルに対して処理、
みたいなこともできる?
2020/03/08(日) 08:33:18.06ID:P20sq25k
できるだろうな。plファイルだけでできるかもしれんし、
簡単なラッパースクリプトが必要になるかもしれんが大した問題じゃない。
Windows特有の問題にぶち当たることのほうが大変だから
2020/03/08(日) 08:55:09.38ID:nyv63FmX
readdir は何の文字コードで返ってくるの?
2020/03/08(日) 09:09:34.43ID:P20sq25k
OSは文字コード変換なんてことは行わない。
そんなものが行われるとしたら、それはお前が
使ってる言語とライブラリがやってる。
ようはお前はPerlを知らんのだ
2020/03/08(日) 09:19:17.63ID:nyv63FmX
答えられなくなるとキレるっていうw

cygwinとの互換性で困った問題いろいろは起きそうな感じだな
win8.1のサポートが終わった頃に思い出したら使ってみよう
2020/03/08(日) 09:27:52.75ID:P20sq25k
知らないやつほど他人のせいにする。
2020/03/08(日) 11:23:41.93ID:2fZbJlty
全部 emacs の中でやれば実質的にクリップボードは使えるし
実行も emacs の中でできる。マウスを使わずにキーボードだけで
すべて完結するが
2020/03/08(日) 22:14:47.52ID:z5WqTo29
windows使っててマウス使わないなんてありえん
2020/03/08(日) 22:39:04.77ID:gXtOMf8r
WSLってクリップボード使えるの?
use Clipboardでいける?
今はどうなってるか知らんが知らんがcygwinは無理だったんで/dev/clipboard読み書きするラッパー書いてたな
2020/03/09(月) 14:08:24.97ID:OgnIoX0o
>>296
マウスを使うのは権利であって義務ではないからなあ
ゆっくりとプログラミングをしたいのてあればどうぞご自由に
2020/03/09(月) 14:59:05.01ID:eblk0ZGB
さすがにキモイw
300デフォルトの名無しさん
垢版 |
2020/03/09(月) 19:42:54.58ID:aF4+X/eL
>>288
これマジ?
エクスプローラからWSL上のperlファイルが見えてダブルクリックでWSLのperlで実行できんの?
2020/03/09(月) 21:51:11.95ID:1P2a1qpP
無理でしょ
それぞれに違うファイルシステムになってる
参照はできるようになってるというだけ
windows上の/usr/binって何だよ
302デフォルトの名無しさん
垢版 |
2020/03/09(月) 22:34:27.73ID:aF4+X/eL
だよね
ちょっと信じて損した
2020/03/09(月) 23:01:39.93ID:d25zd4do
アホが見〜る〜ブタのケ〜ツ〜
2020/03/10(火) 01:54:02.54ID:Lezaa9m7
>>300
> エクスプローラからWSL上のperlファイルが見えて
普通ほぼすべてのファイルが見える
見えないのは/procとか/sysとか特殊なものだけ

> ダブルクリックでWSLのperlで実行できんの?
ファイルが見えてるんだから当然ダブルクリックできる。
もちろん関連付けは必要だがな。
それをWSL内で実行するのもWSLを使わずに実行するのも
関連付けの設定次第
2020/03/10(火) 01:55:43.39ID:Lezaa9m7
ググれば普通に見つかる

Windows Subsystem for Linux でダブルクリックで sh ファイルを実行する
https://dskjal.com/PC/run-sh-on-bash-on-ubuntu-on-windows.html

Windows 10のbashのコマンドをGUIから起動させるには?
http://kako.com/blog/?p=16372
2020/03/10(火) 02:35:30.61ID:iN6KW/Ct
WSL2は、Windows側のファイル属性とかちゃんとふつうにあつかえるようになったんか?
WSL1のときは完全別物で、全然ダメやったが。
2020/03/10(火) 03:13:18.94ID:8QcyJ6p0
WSL1もWSL2も同じ。Linuxのファイル属性として正しく扱えるようになった。
Windowsのファイル属性をLinuxアプリが正しく扱えることはありえないから
逆の発想でLinuxとして正しく扱える方向に舵をとった。
Linuxアプリから正しく扱えないなら意味ないでしょ?
2020/03/10(火) 03:17:19.61ID:8QcyJ6p0
そもそもファイル属性はWindowsの方が高機能で
Linuxは、いろいろ拡張入れたら別だが
基本のファイル属性はUNIX初期の頃から変わって無くてかなり貧弱。
Windowsの高機能なファイル属性をそのLinuxにマッピングすることは出来ない。
逆にLinuxのファイル属性を全てWindows側に持たせることは可能
こうすることで全てのWindowsのファイルをLinuxで正しく扱えるようになった。
2020/03/10(火) 04:18:19.87ID:/bE8vLVb
漏れは、Ruby のバージョンマネージャー、rbenv をWSL, Ubuntu 18.04 に入れた。
これで、Linux 側に、好きなバージョンのRubyを入れられる

Windows 10 側には、VSCode を入れて、拡張機能のRemote WSL を入れる

これが基本!
2020/03/10(火) 04:23:54.01ID:qHN38Ccx
windowsでも開発できそうだなー
2020/03/10(火) 12:00:40.16ID:tTiB+rjP
DBIの動作についてお聞きしたいことがあります。

my $dbh = DBI->connect(接続情報);
my $sql = 'パラメータ付きクエリ';

my $ret1 = $dbh->selectrow_arrayref($sql, undef, 'A');
my $ret2 = $dbh->selectrow_arrayref($sql, undef, 'B');

my $sth = $dbh->prepare($sql);

my $ret3 = $dbh->selectrow_arrayref($sth, undef, 'A');
my $ret4 = $dbh->selectrow_arrayref($sth, undef, 'B');

このようなコードで$ret1と$ret2には'A', 'B'それぞれのパラメータを使用した結果が入るのですが、$ret3は$ret4と同じ'B'を使用した結果になってしまいます。
selectrow_arrayrefに同じステートメントハンドラを渡して複数回実行すると、リファレンス実体が最後に実行した結果で上書きされてしまうような雰囲気でした。

Perl 5.10.1 & DBI 1.609の環境と、Perl 5.16.3 & DBI 1.642の環境で試してどちらも同じ結果になったのですが、こういうものなのでしょうか…。
2020/03/10(火) 13:47:10.63ID:nryxofxk
>>305
アホか?
バッチファイルでwsl起動してその中で実行してるだけじゃん
レジストリ編集の方もパワーシェルに引数渡してwsl起動してるだけだ
これじゃあcygwin使ってやるのとなんら変わっとらん
2020/03/10(火) 14:03:39.54ID:0m+9gBGV
>>312
あのさ、おまえ頭悪いよ?
目的を一番ラクに実現する方法が
目の前にあるというのにそれを使わないのはアホだろ
ネイティブのPerlを使えばいい
今更PerlのWindows移植版なんかいらんよ。
Windows移植版なんてcygwinと何も変わらん
2020/03/10(火) 15:17:13.04ID:qHN38Ccx
>>311
試してみたけど確かに同じ配列が変えるね
オライリーのDBI本見たらそう書いてあった
selectrow_arrayって方を使ってリストコンテキストで受けるといいみたい
2020/03/10(火) 15:22:16.39ID:tTiB+rjP
>>314
やはりそうですか…
selectrow_hashrefを使うと$sqlでも$sthでも'A', 'B'それぞれの結果が返るので、selectrow_arrayrefだけ期待と違う動作をしている気がします。(バグ?)
2020/03/10(火) 15:28:19.27ID:qHN38Ccx
>>315
バグというか仕様だと思う
作者の書いたオライリー本にも書いてあったから意図的なはず
今更変更できないからこのままになってるんだろうね
2020/03/10(火) 15:39:16.84ID:tTiB+rjP
>>316
なるほど。
それでは今後、selectrow_arrayrefは注意して使うようにしたいと思います。
ありがとうございました。
2020/03/10(火) 15:58:50.16ID:SCW8qISh
>>313
へー
バッチファイル作ったりトリッキーな関連付けまでしないと動かないのが一番楽な方法ねー
cygwinで全く同じことができるしwin移植版perlならそのまま実行できちゃうんだけどね
ところでエクスプローラからどうやったらwsl内のファイルが見えるんだい?
319デフォルトの名無しさん
垢版 |
2020/03/10(火) 16:50:47.58ID:lAAHr9o2
>>311
selectrow_arrayref は最初の1行しか返さないからということはない?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況