2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2019/02/01(金) 09:44:37.18 ID:1/Kr4Qjk.net
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/

955 :デフォルトの名無しさん:2021/03/08(月) 10:17:22.69 ID:SORPad+v.net
親にリンクしていてループするのが困るので、
全部の子に対してカウンタを持たせる、くらいしか回避方法が無いんだよな
それだと再帰でやってるうまみが無くなってしまう

956 :デフォルトの名無しさん:2021/03/08(月) 12:03:45.46 ID:JySUELLY.net
素直にFile::Find使っとけ

957 :デフォルトの名無しさん:2021/03/08(月) 12:34:19.76 ID:SORPad+v.net
dir /s の結果を使うのが一番楽

958 :デフォルトの名無しさん:2021/03/08(月) 16:27:27.25 ID:3P7OMB5d.net
File::Findは処理速度が遅いのが難

959 :デフォルトの名無しさん:2021/03/08(月) 17:21:12.95 ID:6lKYXbK2.net
>>955
リンクを不用意にたどるな。
既存コマンドでもオプションにしがちだし、ディレクトリ構成によっては死ぬくらいだから、しゃあない。

960 :デフォルトの名無しさん:2021/03/08(月) 17:24:47.95 ID:6lKYXbK2.net
>>958
何と比べて?
no_chdirを指定したりしたらマシになったりしない?

961 :デフォルトの名無しさん:2021/03/08(月) 17:40:53.14 ID:SORPad+v.net
ディレクトリならどこかにある実体のコピーだろうから、リンクなんか無しで済むけど、
より一般化したリスト構造だったら辿らない訳にいかない
だから、事前にループしていないことを確認してから処理することになって、
そのテストがループにはまる

962 :デフォルトの名無しさん:2021/03/08(月) 20:06:16.14 ID:3P7OMB5d.net
>>960
試してみたが、no_chdirは関係ない。
File::Findは、dir /S /B コマンドのパイプ読み取りに比べて、3倍も時間がかかる。
File::Findは遅いだけでなくコールバックでユーザー変数を扱えない欠点があるから、私はFile::Findを使わない。

963 :デフォルトの名無しさん:2021/03/08(月) 21:30:38.88 ID:3P7OMB5d.net
File::FindはUnix系OSで使う場合は find コマンドのパイプ読み取りと同等か少し速い。
File::Findが明確に遅いのはWindows向けにビルドされたPerlの場合のみ。

964 :デフォルトの名無しさん:2021/03/08(月) 22:05:40.64 ID:6lKYXbK2.net
>>963
WindowsのどのPerl?
ひょっとしてCygwin版?
ActivePerlやMSYS2版ならマシだったり?

965 :デフォルトの名無しさん:2021/03/08(月) 22:39:10.09 ID:3P7OMB5d.net
>>964
残念ながらネイティブに最適化されているはずのActivePerl や Strawberry Perl でFile::Findが遅い。
原因は知らないけどWin32APIの使い方が良くないからだと思う。

966 :532:2021/03/09(火) 00:11:34.07 ID:jxvXMO9/.net
$^WIN32_SLOPPY_STAT じゃね?

File::FindはWindowsだと、SJISで全角「構」などの2バイト目が\(0x5c)のフォルダに遭遇すると
無限loopしたり誤動作するから、結局Wndowsでフォルダ階層を再帰的にたどるには
utf8化したperl sourceで自分でopendir, readdirして、encode, decodeせにゃならん。

967 :532:2021/03/09(火) 00:15:08.81 ID:jxvXMO9/.net
別件だがWindowsではSJISで全角「構」などの2バイト目が\(0x5c)のフォルダには
perlからlstatやutimeが出来ないみたいで難儀した。
Linuxのutf8のファイルシステムと違ってWindowsのSJISファイルシステムは面倒

968 :デフォルトの名無しさん:2021/03/09(火) 01:17:12.50 ID:B0uPByTP.net
>>965
そうやったか。。。

>>967
NTFSファイルシステム自体はUTF-16やぞ?
MicrosoftがようやくいよいよコマンドプロンプトとかNotepadとかのUnicode対応を考えはじめてるし、いずれWindows版も対応するんちゃうか。
いっそツッコんだら?

969 :928:2021/03/09(火) 05:19:08.22 ID:NUN2sKP0.net
>>928
Ruby で、元のファイルを、CSV へ変換してみた。
データ中に、ダブルクォーテーション・カンマを入れても、正常に動く

require 'csv'

line_number = 0 # 行番号

# 行末の改行を削除して、1行ずつ処理する。蓄積変数は2次元配列
results = File.foreach( "input.txt", chomp: true ).with_object( [ ] ) do |line, accm|
line_number += 1
accm.push [ ] if line_number % 3 == 1 # 3行毎に、空配列を追加する

ary = line.split( ':', 2 ) # 左からコロンで、2つに分割する
last = accm.last # 最後の要素 (配列)
last.push( ary[ 1 ] ) # コロンの右側を、配列に追加する
end

results.unshift %w(start end value) # 先頭に、ヘッダー行を追加する
# p results

csv_str = results.map( &:to_csv ).join # 2次元配列を、CSV 文字列に変換する
print csv_str

出力
start,end,value
a_1,"b""1",1
"a,2",b_2,2.34

970 :デフォルトの名無しさん:2021/03/09(火) 08:00:45.91 ID:4CK4kuWA.net
コマンドプロントはとっくにUTF-16対応している。出力フォントが表示に対応していないだけ。
コマンドプロントにはもう機能追加されないから Windows Terminalに乗り換えたほうがいい。

971 :デフォルトの名無しさん:2021/03/09(火) 08:27:17.16 ID:4CK4kuWA.net
コマンドプロントは今でもすでに非システムコード文字(アラビア文字やハングルなど)をコマンドに引数渡しできる。
受け取る側のアプリがUTF-16形式で起動時の引数を取らなかったり、batファイルが非システムコード文字に対応していないだけ。
コマンドプロントの努力だけではどうしようもない。

なお、Windows向けビルドされたJavaやPerlは非システムコード文字を引数で受け取れない制約がある。
プログラム側で自力でbase64エンコード対応するなどして回避するしかない。

一方、Windows向けビルドされたPythonは非システムコード文字を引数で受け取ることができる。
Pythonのプラグインを作ったことある人なら分かると思うが、Pythonはインターフェース間の文字列のやりとりにUTF-16を使っている。

972 :デフォルトの名無しさん:2021/03/09(火) 08:33:53.42 ID:HJK4uNxM.net
UTF-16も嬉しくない

973 :532:2021/03/09(火) 08:45:38.83 ID:UTQZC5u1.net
NTFSってUTF-16だったのか、
しかしperlのreaddirはcp932で返してきているような気がs…

974 :デフォルトの名無しさん:2021/03/09(火) 09:28:02.71 ID:HJK4uNxM.net
NTFSはUCS-2で、windowsがUTF-16
それをわざわざcp932に変換して寄越す

975 :デフォルトの名無しさん:2021/03/09(火) 10:42:13.66 ID:4CK4kuWA.net
NTFSもUTF-16だと思うよ。

976 :デフォルトの名無しさん:2021/03/09(火) 10:44:51.95 ID:SbXzcieK.net
>>971
> コマンドプロントの努力だけではどうしようもない。

そらそうや。
ついにcp932から離れようとする世の方向性を受けて、Perlも変わるんじゃねえの、という話。
Perl7とかでそういう話は出てないんかな?
知らんけど。

> なお、Windows向けビルドされたJavaやPerlは非システムコード文字を引数で受け取れない制約がある。

制約つーか、むしろ互換維持とかただ昔のままほったらかしとかやろ。w

977 :デフォルトの名無しさん:2021/03/09(火) 10:56:11.55 ID:SbXzcieK.net
>>974
そのおかげで、20年以上昔からふつうにWindowsで使えてきたわけだからしゃあない。
むしろありがたかった話。

978 :デフォルトの名無しさん:2021/03/09(火) 12:55:12.46 ID:NUN2sKP0.net
Windows 10 Home でも、Docker が出来るようになった。
ただし、Windowsの連続更新に、3時間も掛かったけど

WSL2, Ubuntu でも使えば?
漏れは、Ruby on Rails をやってる

Linux側には、日本人が作った、バージョンマネージャーのanyenv で、
rbenv, nodenv を使って、ruby 2.6.6, node 12.16.2 も入れた

Dockerでも良いし。
ただし、メモリ8GB じゃキツイ。16GB は欲しい

979 :デフォルトの名無しさん:2021/03/09(火) 20:18:30.71 ID:BijZjsz/.net
正規表現のパターンの中に変数を書くとおかしくなりますが、どうしたらいいでしょうか。

やりたいこと:「hoge」の後ろがカンマか行末の場合を抽出したい

$pat = "hoge[,\$\]";
if( $str =~ m/$pat/ ){...}

こう書くと $pat が「hoge[,$]」になることはデバッガで確認できたのですが、思った通りのマッチになりません。マッチングの部分に $pat ではなく定数で「hoge[,$]」と書けばマッチングします。

どう書いたらいいでしょうか?

980 :デフォルトの名無しさん:2021/03/09(火) 20:28:25.57 ID:HJK4uNxM.net
なんで ] だけエスケープしてるの?

981 :デフォルトの名無しさん:2021/03/09(火) 20:34:49.51 ID:nUvu3sQ4.net
そういうときの為のqrですよ

982 :デフォルトの名無しさん:2021/03/09(火) 20:36:21.19 ID:XI91xcQL.net
[]内は文字セットだからその$は行末マッチじゃないし

983 :976:2021/03/09(火) 22:41:12.95 ID:BijZjsz/.net
色々やって混乱して間違った事を書いていました。
やりたいことは >>979 の通り。
>>982を見てそれならばと「$pat = "hoge,{0,1}\$"」と書いたら目的を達成できました。

お騒がせしました。

984 :デフォルトの名無しさん:2021/03/09(火) 22:43:46.86 ID:HJK4uNxM.net
{0,1}って?と等価だよね

985 :デフォルトの名無しさん:2021/03/09(火) 23:03:58.63 ID:B0uPByTP.net
>>983
hoge,xxxx
にはマッチしないが、ええんか?
>>979の目的と違うで。

986 :デフォルトの名無しさん:2021/03/10(水) 02:28:31.13 ID:ixLG+AYE.net
hoge(,|$)

やりたいのはコレじゃない?

987 :デフォルトの名無しさん:2021/03/10(水) 06:16:01.51 ID:S+G6vYN6.net
>>983
近いといえば近いが、そういう書き方をしたいなら「, で始まる文字列」じゃないか。
hoge(,.*)?$

あと、Perl には \z もあるよ。

988 :976:2021/03/11(木) 11:15:21.72 ID:VAAe2gi6.net
みなさん、こんなアホに付き合ってもらってありがとうございます。
疲れてたのかな、俺。

まだ試してませんが、教えていただいたやり方でチャレンジしてみます。

989 :532:2021/03/11(木) 11:39:56.33 ID:AlcqB+X5.net
$pat = 'hoge(?:,.*)?$';
print "1\n" if 'hoge,dsad' =~ $pat;
print "2\n" if 'hoge' =~ $pat;
print "3\n" if 'hage' =~ $pat;

はどうよ

実行例
~ $ perl 64_976_hoge_pat.pl
1
2

990 :デフォルトの名無しさん:2021/03/11(木) 14:27:02.78 ID:IdZJgmDv.net
もしかして
¥bhoge¥b
がよかったんじゃないの?

991 :デフォルトの名無しさん:2021/03/11(木) 14:37:57.64 ID:l5V9NIZG.net
splitをうまく使うと解決したかも

992 :デフォルトの名無しさん:2021/03/20(土) 13:47:35.09 ID:UD6ZNZG9.net


993 :デフォルトの名無しさん:2021/03/20(土) 13:51:21.40 ID:UD6ZNZG9.net
Python勉強中

print('梅')
exit()

994 :デフォルトの名無しさん:2021/03/20(土) 17:31:10.22 ID:ql2G31oz.net
【モダン推奨】Perlについての質問箱 50箱目
https://mevius.5ch.net/test/read.cgi/tech/1327110999/

995 :デフォルトの名無しさん:2021/03/21(日) 17:34:20.99 ID:2t2VtxHB.net


996 :デフォルトの名無しさん:2021/03/21(日) 17:36:32.63 ID:dkvLNxnd.net


997 :デフォルトの名無しさん:2021/03/21(日) 17:39:12.82 ID:2t2VtxHB.net
うぜ

998 :デフォルトの名無しさん:2021/03/21(日) 21:54:16.28 ID:6DoINzzO.net
2年で消化 人気スレじゃねーか

999 :デフォルトの名無しさん:2021/03/22(月) 01:23:08.94 ID:rCEIiEgY.net
うめ

1000 :デフォルトの名無しさん:2021/03/22(月) 23:39:18.97 ID:rCEIiEgY.net


1001 :デフォルトの名無しさん:2021/03/22(月) 23:39:30.86 ID:rCEIiEgY.net


1002 :デフォルトの名無しさん:2021/03/22(月) 23:40:13.68 ID:rCEIiEgY.net
質問いいですか?

1003 :デフォルトの名無しさん:2021/03/22(月) 23:41:34.32 ID:rCEIiEgY.net
おしまい

1004 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1004
263 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★