◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:Perlについての質問箱 64箱目 YouTube動画>8本 ->画像>5枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1548981877/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
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://2chb.net/r/tech/1381561905/ Perlについての質問箱 62箱目
http://2chb.net/r/tech/1385039352/ Perlについての質問箱 63箱目
http://2chb.net/r/tech/1392820583/ # [Perl 日本語処理の基礎の基礎] # このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。 # このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。 # 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。 # まず、以下の行を先頭に入れて下さい。 use utf8; use open IO => ":encoding(cp932)"; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; # ※1 use Encode; # 次に、あなたが実行したい処理の内容を入れて下さい。 $file = 'C:/なんたら/かんたら.txt'; open my $fh, '<', encode("cp932", $file) or die $! ; # ※2 print <$fh>; # 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう # おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。 # 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、 # ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。 # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、 # この例のように cp932 でエンコードする必要があります。
Common Gateway Interface
https://ja.wikipedia.org/wiki/Common_Gateway_Interface Common Gateway Interface(コモン・ゲートウェイ・インタフェース、CGI)は、
ウェブサーバ上でユーザプログラムを動作させるための仕組み。
現存する多くのウェブサーバプログラムはCGIの機能を利用することができる。
CGI は環境変数や標準入出力の扱えるプログラミング言語で扱うことができる。
(洋書) Mastering Perl: Creating Professional Programs with Perl 2nd Edition [2014/1/27]
https://www.amazon.co.jp/dp/144939311X/ マスタリングPerlの第2版
(洋書) Programming Perl: Unmatched power for text processing and scripting 4th Edition [2012/3/9]
https://www.amazon.co.jp/dp/0596004923/ プログラミングPerlの第4版
>>7 perl で書けばperl そのものじゃん。
しかし、perl は終わったな。 python に取って代わられた。
単にCGIで使われるという流行が沈静化しただけだよ。使われている所では使われている。 元からCGI専用言語でもなんでもなくなんでもできるからな。 Python は機械学習で現在流行っているが、それもやがては沈静化するだろう。 かといってなくなることはない。
けっこう大きめのEUCで出来たプログラムを全部utf8に直す作業が始まるんだが、面倒くさいんだが 構成ファイルもたくさんあるし、読み書きしてるようなファイルもたくさんあるし、プラグイン方式みたいに作られてて、既存のプラグイン的なのも全部EUCでutf8に直さなきゃならないんだが めんどくさいと言うか、正常に動くのかどうか不安なんだが 一応表面上は正常に動いたように見えても、俺にはそれはまやかしに感じるんだが
はいやっぱりバグったファイルの読み込みが出来なくなった
そういやUTF8だとprintfとかで幅を揃えるのができなくなったりして大変だな。 %-10sとかやっても漢字が入るとそこが出力時に3バイトになったりしてずれて役に立たない。 こういう幅とか考慮してフォーマットしてくれるモジュールあるんだろうか?perlだから誰かが作ってそうではあるが。
Unicode::GCStringでカラム数とれるっぽいから空白いくつ詰めるかは計算できそう
かなり頑張ったがUTF8にするのは無理だということになって諦めた sjisとEUCとutf8が無駄に入り乱れる結果になった ファイル名はプログラム内部ではEUCで扱ってたり、実際のファイル名はsjisだったり、ファイルの中身はEUCだったり、通信はsjisだったり、 そもそも文字単位じゃなくてバイト単位でデータを管理する記述がめっちゃあったり、 ゴミかよ!
$str = "abcdefg"; open( $fh,"<",\$str); open( $fh2,"<&",$fh); はできるけど open( \*STDIN,"<",\$str) open( \*STDIN,"<&",$fh) はできないんだな。知らなかった。"Bad file descriptor" って言われた。 どこかに書いてあったっけ?
ちょっとマジで聞きたいことがあるんだが、cgiからブラウザに対してCP932でHTMLが出力されている。 もちろんヘッダも正しく指定されている。 んで、そのHTMLの中に、 <IMG SRC="あいうえお.jpg"> などと言う日本語のファイルが指定されているわけだ。 その日本語のファイル名も、CP932だ。 んで、ご丁寧にブラウザが自動でURLエンコードしてくれるようなのだが、 %E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A.jpg となるのだ。これは "あいうえお.jpg" をUTF-8として解釈した時の文字コードだ。 俺としては %82%A0%82%A2%82%A4%82%A6%82%A8,jpg (CP932の文字コード)となってもらわなくては困る。 聞きたいことは2つで、これを解決するにはどうしたら良いか? もう一つは、ブラウザごとの仕様によりこの挙動は違うのか? の二点だ よろしく頼む
>>20 自分でファイル名をそういう風にエンコードすれば?
>>21 すまんが読めなくなるから駄目
あと、断定はしてないが、ブラウザやHTTPDのソフトごとに、エンコードやデコードの扱いの違いがある疑いがある
開発環境のwindowsでANHTTPDってやつ使ってるが、こいつはたぶんファイル名をデコードしてないくさい
でも運用環境(有料で借りてる)のApacheさんはパスをURLデコードしてる模様
俺の予想だと、ブラウザも古いのだと絶対自動でUTF-8なんかにはデコードしないと思う。
もしかしたら間違ってるかもしれないけど
困る
統一して欲しい
>>23 ほぼない
けどWeb制作板に行くとエンコードどころか文字コードも理解してなかったから絶対回答こない
どうしてもすぐになんとかしたいなら全てをUTF8にする。
ほんとにcp932なのか? 実はUTF-8で出力されてて、ヘッダはただ無視されてたりしないのか? まず、クライアントでデータを保存して、バイナリエディタで確認してみたら?
そのような不正な URL がどのように扱われるかを問うのはあまり有意義とは思えない。 適切に扱ってほしいなら適切にエンコードするしかないと思うのだが。 HTML::Element とか URI を使えば簡単だよ。
>>26 ほんとにcp932
なのにutf8でエンコードされる
>>27 cgiは、どっかにあるHTMLが書いてあるテキストファイルを読み込んで出力してるだけだから、<IMG SRC="あいうえお.jpg">のあいうえおの部分を見つけ出してエンコードするのは無理がある。
さらにエンコード下として、それをデコードしてパスを通すhttpdと通さないhttpdがあるようなので仕様を知りたい
ホントにそうなら、やっぱブラウザのせいなんかね。 データをデコードしたテキストをそのままURLにしたら、たしかにそうなりそうな気はする。 どうしてもあちこちいじらずに簡単に対処するなら、サーバーのほうはどう? プロキシとかRewriteとか使って、とにかくURLを受けてしまってから、受けたURLを動的に解釈したら?
>>29 もうcp932のファイル名はやめて全部アルファベットにしようと思うのだが、
Rewriteってなんだろう
アニメが出てきたんだが
まあおまえらありがとうな
utf8ならまだしもcp932のファイル名をそのまま使おうとした俺が悪かったんだよきっと
でもwindowsがcp932のファイル名だからしょうがないんだよ
>>20 ブラウザがUTF-8 と解釈するのは、HTML のheader に、言語の指定をしていないからじゃないの?
ただし、sjis を指定しても、そのPC がsjis に対応していないかも?
>>22 >運用環境(有料で借りてる)のApacheさんはパスを、URLデコードしてる模様
URLデコードするかどうかを、設定ファイルで指定できないの?
>>30 web 系は、すべてのファイルを、BOM 無しUTF-8(UTF-8N)に統一すべき!
他の言語を使うと、PC・スマホがその言語に対応していない場合に、バグる
漏れは、web 系の本を、軽く数十冊は読んでるけど、 sjis のファイルを使う本は、見たことがない それに、パス・ファイル名などのシステムの構成物に、全角を使う本も見たことがない。 パス・ファイル名は、ファイル内容のテキストじゃない。 あくまでもシステムの構成物だから、半角英数字が基本 Linux・Windows 共用のパス・ファイル名には、半角英数字と、_ (アンダーバー)だけを使う。 半角空白もバグるので、すごく嫌われる さらに、大文字小文字だけが異なる、パス・ファイル名も使ってはいけない。 例えば、Ab, aB がLinuxでは使えるけど、Windowsでは共存できないから だから、このシステムは、sjis・全角の2つを使う、違反を起こしている! こういうやり方を書いた本は、絶対に無いはず sjis を使っているのは、ロートルの5ch ぐらいw だから少しでも、5chのシステムをいじるとバグるから、システムを修正できない!
>>30 「RewriteRule」。
# 「httpd」とかいうから、Apacheに詳しいんかと思ってた。
要はとにかく、サーバーがURLを受けてから、それをランタイムで変換して実際のアクセス先を決めることはできるはず、という提案。
>>31 URLデコードを禁止できるか?
URLの仕様なのに。
それに、もししたとしたら、CGIの引数とかどうなるんだ?
>言語の指定をしていないからじゃないの?
してる
>$print_code .= q[Content-Type: text/html;charset=Shift_JIS] . qq[\n];
>$print_code .= q[<META http-equiv="content-type" charset="Shift_JIS">];
>URLデコードするかどうかを、設定ファイルで指定できないの?
金払って借りてるマシンなのでたぶん無理なんじゃね?
いやApacheさんの使い方とか仕様とか全然知らないから知らんけど
>UTF-8(UTF-8N)に統一すべき!
cgiが古いんだよ
作り直したいけど簡単そうじゃないので放置してる
気持ち的には全部utf8にしたい
>>34 俺のサーバーじゃないけどそんなこと出来るのか?
>>36 >$print_code .= q[Content-Type: text/html;charset=Shift_JIS] . qq[\n];
>$print_code .= q[<META http-equiv="content-type" charset="Shift_JIS">];
「html sjis meta」で検索すると、以下が見つかる。
上とは、ちょっと違う
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
他には、PHP で作ったそのファイルが、UTF-8 で保存されているとか?
「html sjis 文字化け」で検索すれば?
文字化けを防ぐ&解消する方法
https://www.be-webdesigner.com/tips/coding/mojibake.htm >>36 レンサバでも、管理者だったらいろいろできる。
しかし、もしそうだったとしても、どうやらたぶんおまえにはムリぽなので、もうあきらめろん。
>>20-21 ブラウザごとにURLエンコードは統一は取れてなかったと思うよ
まず開発環境としてANHTTPDの使用をやめることをお勧めする
IISかApacheをインストールして使った方がいいと思う
http://2chb.net/r/airline/1551189110/ このツールが使えない
誰か使い方を教えてくれ
ソースを拡張子.plにして保存、perl実行環境はインストール
ここまでは出来てる
ソースの改造の仕方が分からない
今の5chではスクリプトによる連投はできないのでは? 試したことないのでわからんが。 しかしそのツールなんでわざわざforkして子プロセスに同じことさせてんだろ?その辺がワザなのか?よくわからんね。
Perl は初めてかい? まず、Perl の勉強からだね。 何をするプログラムかは後回しにして、何が書かれているかを理解できるようになろう。 書かれていることを理解できるようになったら、使われているモジュールを理解しよう。 LWP を使ってみよう。勉強しなければならないことがたくさんあると気付くだろう。 最低でも HTTP の仕様書くらいは読まないと話にならない。 ここまでできれば最初のソースコードを理解して改造だってできるかも。
彼はインストール方法を知りにきただけであってPerlを知りにきたわけではないだろう
メッセージ固定だなんて連投というより荒しツールだな
だよなあ。そのせいでお気に入りの専ブラ使えなくなったし。
もうC++/Qtで書く気がしない。 Perl/Qtで事足りる。 Perlの開発者が「PCの速度が上ればCである必要はないだろう」みたいな事言ってたけど、 まさにその通りだな。
>>48 その perl は perl6 ですか?
なんかのはずみで処理が終わらなかったとき、自殺するようにしたいんだけど、 eval { alarm 5; $SIG{ALRM} = sub { exit; }; }; これでいいんだっけ?
いいんじゃないすか それだけだとevalはいらないと思うけど あと慣例ならハンドラ設定が先かな exitじゃなくdieとか
ありがとう >evalはいらないと思うけど よく覚えてないけど、evalはシグナルに対応してないシステムだとエラーで落ちる気がした
Perl News に "Fork yeah!" というのがあってちょっと驚いた。
https://www.perl.com/article/fork-yeah-/ メアド用にさくらインターネットのライトプラン(sslログインなし)借りてるんだけど そこにちょっとしたcgi作って置こうとしてて ものすごい久々にuse CGIとかやってます。 で、corelist CGIってやると > Data for 2018-01-20 > CGI was first released with perl 5.004, deprecated (will be CPAN-only) in v5.19.7 and removed from v5.21.0 と出るんだけど CGIが標準モジュールから削除された理由とか、 代替となるモジュールって知ってる人いませんか。 Perlはweb用の言語じゃないから標準モジュールからは消した とか そんな理由ならいいんだけどさ。。
「core は出来るだけ小さく」
「CGI はもはや Web の主流ではない」
かな。必要になった者のみが追加でインストールすればよい
標準で代替になるようなものはないと思うが pure perl だろうし最悪 CGI モジュールも一緒にアップロードとかでも動くでしょ
そもそもさくらレンタルサーバーで使える perl って 5.8 〜 5.14 ぽいけど
https://help.sakura.ad.jp/hc/ja/articles/206053142#ac05 >>56 どもども
その理由なら安心ですわ
perlのバージョンは確認したんだけど、消えた理由によっちゃ使うの気持ち悪いなーと思ったので
どもでした。
5.30が出るのかと思ってたら、出てねー やる気ねーのかよ
ていうかこんなに長くアップデートが続いていることだけでもかなり凄い事だと思う。
5.30.0 RC2までは出てるからそのうち出るだろ
$str =~ /$pattern/ みたいなことはできるけど、 $str =~ /$pattern/$opt みたいにして大文字小文字を同一視するかどうかを動的に指定したい if文で処理行を分けるしか無理?
Ruby では、Regexp オブジェクトで、動的に作れる str = "aB" opt = Regexp::IGNORECASE p re = Regexp.new( str, opt ) #=> /aB/i
パターンマッチの直前で比較対象の文字列を uc() 使って小文字を全て大文字に変換しておく、または lc() で大文字を全て小文字にしておく事でも実現できるな。 パターンの方にも変換必要になるかも知れないが、それについては予め大文字または小文字でパターン作っておけば回避できる。
ただ、どう考えても遅くなるよな 素直に切り替えよう
>>61 #
http://perldoc.jp/docs/perl/perlre.pod#Extended32Patterns my $subject = 'FooBar';
my $search = 'foobar';
my $pattern = qr/$search/;
print $subject =~ /$pattern/ ? 'match' : 'unmatch', "\n";
$pattern = qr/(?i)$search/;
print $subject =~ /$pattern/ ? 'match' : 'unmatch', "\n";
(?i)と書いておけばいいだけか じゃあもう実装済みで、使う側でどうにでもできる
Pythonはほどほどの長さのスクリプト言語としてならアリなんだが ツールとしては良くも悪くも電卓だなぁ
バッチは使いやすさでperl、サーバだと今はパフォーマンスで選んでgolangやろうとしてるわ
>>71 読んだけど、実際にはタイトルほどPythonを悪くいってないな。w
windowsでreaddirするとcp932で読めてくる それだと面倒なので、opendirする時か、ハンドラに対して、 decoding(cp932) みたいに指定するにはどうすればいい?
perltidy -pbp -nola perl_file この -pbp は perl best practices にする設定になっている という仕様が書かれているが sub { :LABEL for .................... のようなラベルが本の通りにならない。たとえば 103ページなど ラベル調整を諦めて -nola をつけ、手動で正しくすることにした これバグだよな?
左のように綺麗にまっすぐ整えろ が本の通りなのに
右のように変なところにいく
sjisでローマ数字のUが書いてあるのをutf8にすると、どうやっても化けるな
一旦生で読んでcp932でデコードすればいいのか LWP:Simpleだとそのへんに手が出せない
MySQLもそうだけど、sjisは使っちゃイカンやろ。 細かいところで文字の置き換えルールがメチャクチャだったような。 いわゆるシフトJISはとにかくcp932で。
多分htmlに俺はsjisだと書いてあると、LWPが勝手にsjisでデコードするんだろう
元がeuc-jpだと、 $str =~ s/\x{301c}/〜/g; みたいなことを明示的に書かないと、回避できないみたい 同じものやがな
下記のコードですがダブルクォートを介さずに$testから'フ'を表示させる方法はありますか? #!/bin/env perl use strict; use warnings; use utf8; my $test = '\xE3\x83\x95'; my $test2 = "\xE3\x83\x95"; print "$test\n\n"; print "$test2\n\n";
my $test3 = $test; $test3 =~ s/\\x([0-9A-Fa-f]{2})/pack('H2', $1)/eg; print "$test3\n";
print eval qq/"$test\n\n"/;
こんな書きかたあったか? DB<27> printf "%s\n", ('Fizz')[$_%3] . ('Buzz')[$_%5] || $_ for (1..15) 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz ()[]が見おぼえがない
()で配列とみなしたとき ()[0]は定義されていると考えて ()[1]などは未定義で無しというトリックか
DB<25> print "$_ cup", ("s")[$_ < 2] , " of coffee\n" for (1..3) 1 cup of coffee 2 cups of coffee 3 cups of coffee
DB<23> printf "%s\n", "$_ cup" . ("s")x!!($_ != 1) . " of coffee" for (0..3) 0 cups of coffee 1 cup of coffee 2 cups of coffee 3 cups of coffee DB<24> printf "%s\n", "$_ butterfl" . ("y","ies")[($_ != 1)] for (0..3) 0 butterflies 1 butterfly 2 butterflies 3 butterflies
今はもう (1)[1] が空リストにならないんだな。perl5220delta に書いてあった。 リストコンテキストでの問題を避けるために [split( /::/ , $class)]->[4] みたいな書き方をしていたんだが。 いや、これは変えなくていいのか。
undefは省力とかフェールセーフ的に有効にするんじゃなくて、 厳密に仕様化して積極的に使うべきだよな 初期化されてないものを使うのが気持ち悪いと感じるのは、 auto変数が本当に領域確保するだけだった頃の名残り
簡単なシェルスクリプトしか書けない素人ですがPerlの利点ってどこです? grep -Pやperl -peで世話にはなっていますが目当てはあくまで正規表現だけですし 比較演算子はbashと逆だし変数は記号で使い分けなきゃならんしなんだこいつってなって
テキスト処理に特化されているところ そのおかげで "," や " " とかの部分を q(,) q( ) などと書けたり perl コードが正規表現と一体化していて再帰も扱えたりなど色々あるが 全部特化したことによる利点
bashで凝ったことを書くことを考えたら、Perlのほうがはるかに簡単。 bashは所詮シェルなので、クォートとかエスケープとか変数とか関数とか、いちいちワナが多いからな。
Perlの利点? 他の言語と同様になんでもできることかな。モジュール色々使うと作るの楽だしOSの違いもかなり吸収されてWindowsでもLinuxでも何も変更せずに動くプログラムも作れる。 シェルスクリプトも外部コマンド動かせば何でもできるとは言えるが、起動のオーバーヘッドの問題や起動しているコマンドの仕様が変わったときに個別に対応しなければいけないなど面倒な事がある。
>>101 > OSの違いもかなり吸収されてWindowsでもLinuxでも何も変更せずに動くプログラムも作れる。
これでとんでもない目に遭ったぞ。
perlの\nは、内部的にはLF のみだが、OSがWindowsなら、出力する際に
CR+LF に自動的に変換してくれる。
しかし、出力文字コードがutf16le だと、特殊な宣言文を書かない限り、
LF (0x000a)は 「0x000a000d」ではなく、「0x000a0d」に変換され、
ぐちゃぐちゃに文字化けする。
文字化けの原因を特定し、回避方法を見つけるために、ずいぶん時間を取られた。
>>102 \n は他の言語でも気を付けた方が良い。
例えC言語だったとしても歴史的な事情でライブラリが勝手に変換するかも知れない。
この頃はそれにまつわるバグは減ってるとは思うけどね。
ま、少なくとも \n を \x0a だと信じ込んで使うのは止めた方がいいだろうな。
\x0a はあくまでも \x0a と書いた方が良い。
Javaとかでは改行は System.out.println() を使って改行させるようにして \n を埋め込んでの改行は極力避けた方が良い。
>>102 いや、特殊な宣言文ってなんだよ。PerlIO の man 読めよ。
open 関数や binmode 関数の説明にも「PerlIO を読め」って書いてあるよ。
s/\n//g; s/\r//g; 俺は常にこうしてる
\nを埋め込んだ箇所が一つでもあったらアウト みたいな作り方は絶対失敗する
>>105 > いや、特殊な宣言文ってなんだよ。PerlIO の man 読めよ。
結論としては、下のように書けばいいのだが、これはネットで色々探して
見つけてきたもので、PerlIO の man 読んで自分で見い出すことは、
私にはできなかった。それが出来る人は凄いと思う。
binmode STDOUT => ":raw:encoding(utf16le):crlf";
消費税計算(10%)しようとしました。税込550円を消費税と本体価格にする。 $a = 550; $b = 1.1; $c = $a / $b; $d = $a - $c; $e = int($c); $f = int ($d); print すると、 $c は 500 $d は 50.000000000001(0の数はだいたい) $e は 499 $d は 50 とうやら550 / 1.1 が内部的に割り切れていない様子(おそらく実際は内部的に499.99999999999999になってるのでintすると499に) ロジックの変更で回避したけど、このバグ聞いたことありますか?
>>111 バグじゃなくて仕様やろ。
Perlの数値型はdoubleなので、1.1が正確に表現できてないんちゃう?
浮動小数点数の誤差についてぐぐれ。
>>111 おせっかいかもだがもうひとつ。
その手の誤差を回避するのは、ロジックでなんとかできることもあるが、実際にはなかなか難しいはず。
たまたま誤差が見えなくなってるだけの可能性もありそうなので、動作確認は慎重にな。
ちゃんとやるなら、decimal的なモジュールを使ったほうが。
あるかどうかは知らんけど。
>>111 バクではなく仕様。
ちなみにPython,Tclで確認してみましたが同じ出力結果になりました。
どんな言語でも金額の計算や小数点の桁を調整をする場合、
int(切り捨て)、round(四捨五入)、ceil(切り上げ)などで処理するか、
出力時に、printfやsprintfを使って、"%.0f"などを指定して桁を合わせる
必要があると思います。
あるよ use bigrat; my %ISO_number = ( 100 => 0, 125 => 1/3, 160 => 2/3, 200 => 1, 250 => 4/3, 320 => 5/3, 400 => 2, 500 => 7/3, 640 => 8/3, 800 => 3, 1000 => 10/3, 1250 => 11/3, 1600 => 4, 2000 => 13/3, 2500 => 14/3, 3200 => 5, 4000 => 16/3, 5000 => 17/3, 6400 => 6, 8000 => 19/3, 10000 => 20/3, 12800 => 7, ); # dirty hack: 0/1 force rational type # warning: if it locate last, sum goes WRONG! printf "%s\n", 0/1 + $shutter_speed{$ss} + $F_number{$F} - $ISO_number{$ISO};
浮動小数点の問題は知っていたが、こうなる事は初めて知った。危ないもんだな。 $c = $a / $b; # $c = 500 $e = int($c); # $e = 499
>>111 それはバグではないし、昔々からある超有名な仕様。知らないのはお前だけ。
>>112 >>113 >>114 >>117 仕様で他の言語でもあるのですね。Perlで明示的な型指定とかはほぼ考えたことが無かった(1.08の時は意図した結果が得られていた)ので、勉強してみます。
ありがとうございます。
言語というよりはライブラリやCPUの問題だ。 しかしだいたいのメジャーな言語が採用しちゃってるので言語に関係なく出ると思って良い。
言語仕様っていうと違和感あるね 意図してこうしてますって感じで IEEE 754の仕様といえばそうなのかもしれんがあれは規格であって 仕様とはまたニュアンスが違う なんつーか実数扱うときはそんなもんという感覚
>>111 一応、取った対応策です(消費税計算なので精度は不要)
除算解は有効桁数以下が切り捨てになり表示などで見える値以下になると想定しました
$a = 550;
$b = 1.1;
$c = ;
$tax= int($a - $a / $b); # $tax = 50
$net = $a - $tax; # $net = 500
端数を残したまま税込から除算解を引いてintして税とし、税込から税を引いて本体としました
とりあえず期待した結果は得られています
ありがとうございました。
>>120 C/C++なら規格が精密なのでそういう違和感もわかるが、Perlの場合は逆におかしいやろ。w
>>121 税率によってはきっとアカン場合がありそう。。。
単純な切り捨てはヤバいような。
まあ、そこまでの精度はイランのやろけども。
ちなみに、今回のケースなら、$x/1.1とするのではなく、$x*100/110としたほうが安定しそう?
>>124 うちは税込ものを分離する時は消費税側で小数点以下切り捨てなのでOKなのです
四捨五入とか会計方針によっては稀に問題が出るかもしれませんね
1.1を掛けるなら11を掛けてから10で割った方が良いかもな。そうすると正数計算でやれる。 切り上げや四捨五入をしたい場合は10で割る前に一桁目を見て10を足したり足さなかったりすれば良い。
ああ。逆か。税込みから本体と税を求めるのか。でも考え方は同じだな。
>>125 違うぞ。今回の問題点をちゃんとわかってるか?
1.1と書いたリテラルが、実際の値は1.10...となっていて、1.1よりも大きかったことだぞ。
誤差の具合によっては、正確には切り捨てが不要な値でも、除数が大きいせいで計算結果が実際よりも小さい値になってしまって、してはいけない切り捨てが発生してしまう可能性はないんかね。
>>128 消費税は小数点を使わず整数計算で
10 /110
8 / 108
で計算するようにします
アドバイスありがとうございます
>>128 うちの会社ではあんなに国家予算並みにたくさん「0」が出てくる消費税計算は無いのでとりあえずの回避でも大丈夫です
とはいえ先ほどのように整数計算に修正しようと思います
どちらにせよ、小数点以下をどう扱うかは仕様で決めないとダメだな。
ファイルハンドル($fh)からファイル名を取得する方法ってありますか? ・stat $fhでinode取得してシェルのfindで見つけるってのはコストかかるのでやりたくない。 *{$fh}{IO}辿ってIO::Fileから得られないかなって調べたんですけど分かりませんでした。 基本的にそういう思想がないってことかも知れません。
ムリやろ。 ファイル名のないファイルハンドルも少なくないしな。
ファイルハンドルからファイル名を求めるシステムコールとかもないしな。 ハードリンクされてて1つのi-nodeで複数のファイル名を持ってたらどうすんのっていう問題もある。 自分の作ったプログラムの中だけでいいならそのプログラム内だけの独自のopen,close作ってそこでファイル名を保持しとけば良いんじゃないかな。
お二方ありがとう そもそもそういう使い方をするものではないって理解しました
そもそもファイルをopenした時点で、ファイル名は自明だろ、、、 <>の場合は、今開いているファイル名は、$ARGVでアクセス出来るし、、、 while(<>){ print $ARGV if $. == 1 ; $. = 0 if eof } 他は、自分でコード書くんだからファイルリストの管理すりゃいいだけの 話だし。
>>137 ファイルハンドルだけもらうクラスかもよ
いや、気持ちはわかるやろ。 ファイルハンドルは、しょせんハンドルでしかないと納得するのは、事情がある程度わかってからなんだから。
ファイルハンドルをインクリメントすると次のファイルを指すハンドルになることはあまり知られていない。
>>140 それは、Perlのファイルハンドルの話か?
Cのファイルポインタではなく?
ActivePerl 5.22 から 5.28 にアップデートしたのだが、 次のものがなくなってしまって、とても不便になった気がする。 ・PerlEz.dll ・ppm(perlパッケージマネージャー) ・htmlドキュメント 他の2点はいいとしても、PerlEz.dllが無いと生きていけないので、 5.22 に戻した。もう一生5.22 を使い続けることになるのかな。 なぜ、こんな事をするのだろうか?
そういやみんな最新の安定版使ってんの? うちは5.20で止めてる。特に意味はないんだけどこれが安定してるってどこかで見たから。
俺もCentOSのデフォルトだわ 5.16.x もう枯れてるしね
perlのワンライナーについて質問です。 cat /home/xxx/aaa.txt | perl -spe 's/AA/$var/; END{print "complated.\n"}' -- -var="BB" > bbb.txt 上記のようにすると、END部分の終了メッセージもbbb.txtに保存されてしまいます。 そこで下記のようにしてみたのですが、入力ファイルの指定と"--"以降の引数がうまく与えられずエラーになります。 perl -i -spe 's/AA/$var/; END{print "complated.\n"}' /home/xxx/aaa.txt -- -var="BB" どのようにすれば入力ファイルの指定と変数渡しを一緒にできますか?
perl5.26.1 perl2exe 使うので。
>>150 ご意見有難うございます。
ファイルを一番最後に入れるとできるということがわかりました。
perl -i -spe 's/AA/$var/; END{print "complated.\n"}' -- -var="BB" /home/xxx/aaa.txt
>>152 -i があるからでは?
-i.bak とかやっとくと .bak をファイル名に付加したバックアップ作れるよ。
多分新規ファイル開いてそちらに出力して後でリネームして元ファイルのバックアップを取ろうとしてるんだろうと思う。
-i の直後に何もない場合はバックアップ取らずに元ファイルにリネームだけやってるんだと思う。
>>153 コメントありがとうございます。
今回やることはファイルに上書きしたくバックアップもいらなかったので -i で良いかなと思っていました。
ワンライナーはよくお世話になってるのですが、今回-sでperl内に変数として渡せることがわかり、ますます重宝しそうです。
今日、学んだこと。 /^([a-c]){2}\1/ は 'abb' にはマッチできるが 'aba' にはマッチできない。 もちろん 'aaa' にはマッチできるが…要するに /^([a-c]){2}\1/ は /^([a-c])\1\1/ と同じではなかった。
パターンの中で\1って使えるんや… 正規表現って普通「事前に」FSMにコンパイルされてからマッチングに使うるんじゃないの…? バックトラックとかする高度な実装のやつはまた違うんかね
>>156 ¥1は、むしろパターンの中でしか使わない。外で使うときは$1のほう。
正規表現は、バックトラックがあたりまえ。しない実装なんかあるか?
いろいろ勘違いしてるぞ。
s/(pattern)/\1/ という使い方をするもんだと思いこんでいて、謎のバグに悩んだ
買われてしまった。 モダンperl入門でも買おうかな
今さら「モダン」もないやろ。w どうとでも好きに書いたらええがな。
モダンとか死語だもんな そういうワード使うしかなかった当時の状況もあるけど
>>156 決定性有限オートマトンと非決定性有限オートマトンについて調べるといいぞ。
lex は前者で Perl は後者だ。
perlの最新本って、これくらいだろ 初めてのPerl 第7版 2018/01/20 Effective Perl 第2版 2015/02/17
クリスマスまでにはperl6の本が山のように出版されるからな
非決定性有限オートマトンは決定性有限オートマトンに変換できる ていうか両者の能力は同じ(正規言語止まり
んまーできると言っても状態数の爆発を伴うこともあるので 非決定性有限オートマトンのままにしといて入力が来たときに探索(バックトラック)で解決、 というのもアリっていやーアリ
名前変えたんだよね?やっぱ違いがありすぎて紛らわしいから変えたのか?
すまん。リロード忘れて間に他の書き込みが挟まった。Perl6の話ね。
>>176 少なくとも、もうPerlでは無いと言うことだ
Perlの系譜にある別言語だね
YouTuberは「最強の職業」である理由。
VIDEO 【事例付き】YouTuberは最強の副業である件について。
VIDEO ;t=267s
【初心者向け】YouTubeの始め方・稼ぎ方を徹底解説!
VIDEO 「YouTubeなんていつか稼げなくなる」という主張を論破する。
VIDEO 収益化から丸1年!YouTubeでいくら稼いだか公開。
VIDEO ;t=103s
その動画で月商○○万!? YouTubeで稼ぐ裏技的アプローチ。
VIDEO ;t=433s
【貧者の工夫で戦え】ガラケーだっていい。YouTube始めるのにパソコンはいらない!
VIDEO 【第一回】SNS、YouTube、ブログで稼ぐ方法を、丁寧に解説します!
VIDEO Rakuは設計当初からオプショナルな型システムあるし numpyっぽい操作が言語組み込みだったり いろいろ早すぎた
ハッシュの配列とかも簡単にできるもんね。 perlで作ったプログラムをC++で作り直すと思うとゾッとするw
ハッシュの配列とかスクリプト言語の類ならどれも同じようにできる。 Perlがだめなのは、スカラとリストの二つが存在することだな 同じ書き方をしても、使い方で意味が変わってしまう。 変わるだけならともかく違う解釈で動いてしまうからバグのもとに鳴る。
>>186 リストは使わずに全部リファレンスでやった方がいろいろ安全だよ
$aと@aが区別されるので調子に乗って、 $a->[0][0][0] と一緒に $a も使ってバグる
まあ、自分で作るには兆便利だけど人のプログラムの修正やメンテはやりたくないなw やっぱ、C言語ぐらい厳しくないとプロ用は無理だよね。
他人が書いたものばかりでなく、1年前ぐらいに自分が書いたものを 修正しようとして、「なにやってんの?これ」と思う。 自分自身のために、「しつこいぐらいにコメントを入れる」を心がけてるよ。
それ以前にコメントがなくてもわかるようなコードにしてるよ
マクロなコードは読んで意味がわかるものにするのは当然として コメントはビジネスロジックと言うか、フローの説明じゃね
書いてあることを説明する必要はない。 コメントで書くのは、なぜこんなフローにしたかだ
一見すると何やってんだか分からなくてもよく辿るとスゲエなこれ天才じゃねって思うことある 自分が書いたんだけどね
書くのも読むのも全然困らないようなコードしか書かないのが理想 難解な処理は、きっともっとシンプルに解決できる
my @result = grep !$temp{$_}++, @list; 凄げーよね、@listをuniqにソートするコードだって。 パールならではだよね。 普通なにしてるかわからんよw
それは慣用句なので割と判る コメントくらい付けるけど
result = list(set(LIST)) pythonのほうが圧倒的に簡単
>>200 それじゃあソートできてないだろ
my @result = sort grep !$temp{$_}++, @list;
>>202 sort 使わずに sort できるなんて凄いな。
>>203 >>204 ゴメンソートは関係無かった。
uniqしたくて、検索したらこれが出てきたんだけど、自分で作るなら
for文で回してif文でチェックしてpushで配列に入れる。まあ、どんな言語でも動くやつね。
パッとこのコードが書けるんならいいけど、ここで時間を掛けたくないよね。
機能がはっきりしてるから、sub uniqか何かを作って言語仕様かのように書く きっと既にあるから、コピペで済む
まあ余程の理由がない限り普通はList::Util使うね
ハッシュを使ってカウントするなんてperlの定石なんだが 入門書のハッシュ解説で必ず載ってるぞ
>>209 普通は
>>204 でしょ
モジュールは精査して本当に必要なものしか入れない
まあ現場次第だと思うが
>>200 Rubyだとuniqが使えるが配列の集合演算でもできる。
result = list | []
実装は面白くても実際の所普段の仕事では わかりやすいインターフェースの関数にするから そういう点で差はでないというね。
>>214 PerlやRubyなら、わざわざ関数にはしないかな。
その場でハッシュにつめてキーだけ使うとかかなりふつうだから。
オワコンだとかすたれた言語だとか言われるけどまだまだ使われてるから
>>200 いや。わかる。
君もそのうちわかるようになるよ。
>>215 そしてコメント書くぐらいなら関数にしろ
ほら、こんなコードで実現できるんやで、 なにやってるか一見わからんやろ 説明しよか? みたいに言いたくなったら、それは可読性が悪い証拠
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; } >>219 書かないから心配するな!
1+1と同じレベルだからな!
そういう思想の馬鹿しかおらんからperlは廃れたんだよ。
if (defined $table{$var}) { $var = $table{$var}; } みたいな処理 「何か」に対して判定した結果に従ってその「何か」を採用する 何かを2回書くのが嫌な時の逃げ方は何だろう
リストの要素数を得るために空リストに代入するのも慣用句と読んでいいかな? $n = (() = <*>); みたいの。
要素数なんてどうせループにしか使わないので、 そんなのを取得しない解決がきっとエレガント pythonの何でもイテレータ思想はきっと正しい
>>227 これはあるね しばし考えるんだけど結局一時変数を使う
構造によっては$_が使える時もあるんだけどまれだなあ
>>226 じゃあRubyやらC#やらも滅びるんやな。w
ハッシュのある言語ではあたりまえのイディオムやろが。
まあ最近の言語は便利な標準メソッド呼べば終わりって感じだからね Perlは標準モジュールの範囲だけでやろうとすると結構面倒
最近はPerlのことを喋ると謎の軍団が叩きに来るからな ネット上で喋れる場所がなくなった 迫害されてる気分
Perl/Tk は使い物にならん。プログラムが大きくなると動かないでやんのw Perl/Qt を推進していくべき。 ここの人はPerlでGUIを使ったりしてる?
Windows限定だが、Win32-GUIを使ってるよ。 インストールして、次のバッチファイルを走らせると、 細かい具体例のデモが見れる。 C:\Perl\site\bin\win32-gui-demos.bat
>>231 そうではなくて独自の記号にコンテキスト毎に意味を詰め込む様な言語思想のこと言ってるんだがね。
入力も出力もテキストで完結してるのがいい と思ってたけど、最近excelデータを入出力に使い出した
短絡論理演算子を使うという方法もあるが、お気に召すかどうかは知らん。
>>227 の例だと
$var = $table{$var} or $var
で概ね動くけど、空文字列なんかが入ってた時に誤動作する
判別はdefinedしか無いとして、それでも書ける短絡評価とは
defined-or使うだけじゃないの? $var = $table{$var} // $var;
アンカー入れ忘れたのによく分かってくれたな。ありがとう。
//流行ってる気がしない。 新しい機能を積極的に使う人はそもそもperlを使わないのではないか。 断固外氏のブログのネタにしかなってなさそう。
5.8じゃ使えないからね それだけで使わない理由になる
>>227 と等価なのは
>>241 か
この例はdefinedだったから適用できるのね
判定が任意だとするとやはり2度書くしかないかね 例えば
if ($table{$var} % 3) {
$var = $table{$var};
}
perlは同一値への参照と解釈して2回読みにはいかないという気の利いたことはしないだろうね
エクセプション入ったら変わる可能性あるしね
//=の逆バージョンあったらいいなとはたまに思うね そこまで必要性ないという判断でないのだろうけども
$table{$var} が $_ に入るような無害な処理をしておいて、 $var = $_ % 3 ? $_ : $var と等価なシンタックスシュガーで処理する みたいなことができれば
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"; }
サブルーチンとか甘え。謎の記号を使って魔法のようなコードを書くのがPerlの醍醐味。可読性は悪
>>235 昔々 Perl/Tk 使おうと思ったが日本語対応が出来てなくて止めたことがある。
それ以来 Perl で GUI はやってない。
絶対やらないけど $_ % 3 and $var = $_ for $table{$var};
>>253 それ、5.6以前の話?記憶が曖昧だけど、utf8に対応した5.6あたりから、Tkで日本語使えたような気がするけど。
裏でずっと何かしてるスクリプトを走らせておきたい ActivePerlのウィンドウが出るのが嫌なので、wperlを起動してウィンドウを出さない でも、wperlを起動する為のbatファイルのウィンドウがずっと出てる batファイル以外のいい起動方法はないだろうか
>>257 start "" "wperl ..."
wperl以降を""で括ると動かないけど、無くせば動いた これでサーバ監視ができる
pingが通るようにしてしまえばwindowsでもそういうのは既にある
>>261 シェルからふつうに起動したら、親プロセスとの関連でトラブルが発生するところはどちらも同じ。
というか、むしろLinuxのほうがわかりにくくてひどい。
disownとかnohupとか知ってるか?
>>260 何か使い方間違ってない?
次のようなコマンドで、普通に通るぞ。
wperl.exe "C:\utp\foobar.PL" "C:\foo\bar.txt"
ブラウザでは普通に見られる楽天市場の商品ページ (item.rakuten.co.jp/shop_mei/a012345/)を get 出来なくなった。 ユーザーエージェントやらリファラはイジってみたけど
active perl の ppm がなくなっていろんなモジュールが動かないのだが、困ってるの俺だけ? ググっても誰も文句言ってないな
>>268 >>142 でオレが文句を言ったが。
結局、一生5.22 を使い続けることにした。
新しめのバージョン追ってる人はもう大半がactive perl捨ててstrawberry perlに移住したんじゃね
strawberry perl なら cpan インストーラ、もう少しまともに動くのか。 明日、試してみる。
>>268 WSLでLinuxそっくり環境の中で普通のPerl使うかOS丸ごとLinuxにしてしまえば悩むことはなくなる。
visual studioインストールして普通にビルドすれば? Makefileちょっと変更してnmake叩くだけだよ
>>274 MSYS2のがええで。
WSLは別物。
strawberry perl をインストールしたけど、いろんなモジュールをまたゼロから入れなきゃいけないと思ったらヤル気なくなってとりあえず active perl に戻した。 次は active perl のディレクトリを調べて同じモジュールを strawberry perl にインストールするバッチファイル作んないと。
>>279 そんな時代はもう終わってるぞ。
Windows版のPerlは使わない。WSLを使ってLinux版を使う
Perlのバージョンはplenvで管理し、いろんなモジュールは(俺が知っているときと変わってないなら)
cpanやcpanmあたりでプロジェクトごとに簡単にインストールする。
ソースコードをgitで管理してるとして、新しくプロジェクトに参加するなら、
plenvでperl入れて、git cloneしてモジュール入れるコマンド(cpanm?忘れたw)を叩くだけだ。
>>280 クリップボード使えない
アイコンダブルクリックで実行できない
オタクは自分の世界に閉じこもってシコシコやってろよバカ
> クリップボード使えない 使える > アイコンダブルクリックで実行できない CLIでアイコンって何言ってるの?
perlのスクリプトファイルが関連付けされてたらアイコンダブルクリックで実行できるんだけどね
>>285 勝手に流れ変えるなよw
>>280 がwslって言いだしてwslじゃ不便もあるって話だろ?
>>284 何が不便なのかわからない。
関連付けの設定をするのが面倒な ”だけ” か?
ならやっぱりWSLでいいだろ。
関連付けの設定方法がわからないんですは
プログラマやめれのレベルだからな
>>286 だからWSLでクリップボード使えるし、
関連付け設定を自分でやればWSL上のスクリプトを動かせる
explorerから.plファイルを起動すると、カレントディレクトリのファイルに対して処理、 みたいなこともできる?
できるだろうな。plファイルだけでできるかもしれんし、 簡単なラッパースクリプトが必要になるかもしれんが大した問題じゃない。 Windows特有の問題にぶち当たることのほうが大変だから
OSは文字コード変換なんてことは行わない。 そんなものが行われるとしたら、それはお前が 使ってる言語とライブラリがやってる。 ようはお前はPerlを知らんのだ
答えられなくなるとキレるっていうw cygwinとの互換性で困った問題いろいろは起きそうな感じだな win8.1のサポートが終わった頃に思い出したら使ってみよう
全部 emacs の中でやれば実質的にクリップボードは使えるし 実行も emacs の中でできる。マウスを使わずにキーボードだけで すべて完結するが
windows使っててマウス使わないなんてありえん
WSLってクリップボード使えるの? use Clipboardでいける? 今はどうなってるか知らんが知らんがcygwinは無理だったんで/dev/clipboard読み書きするラッパー書いてたな
>>296 マウスを使うのは権利であって義務ではないからなあ
ゆっくりとプログラミングをしたいのてあればどうぞご自由に
>>288 これマジ?
エクスプローラからWSL上のperlファイルが見えてダブルクリックでWSLのperlで実行できんの?
無理でしょ それぞれに違うファイルシステムになってる 参照はできるようになってるというだけ windows上の/usr/binって何だよ
>>300 > エクスプローラからWSL上のperlファイルが見えて
普通ほぼすべてのファイルが見える
見えないのは/procとか/sysとか特殊なものだけ
> ダブルクリックでWSLのperlで実行できんの?
ファイルが見えてるんだから当然ダブルクリックできる。
もちろん関連付けは必要だがな。
それをWSL内で実行するのもWSLを使わずに実行するのも
関連付けの設定次第
ググれば普通に見つかる
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 WSL2は、Windows側のファイル属性とかちゃんとふつうにあつかえるようになったんか? WSL1のときは完全別物で、全然ダメやったが。
WSL1もWSL2も同じ。Linuxのファイル属性として正しく扱えるようになった。 Windowsのファイル属性をLinuxアプリが正しく扱えることはありえないから 逆の発想でLinuxとして正しく扱える方向に舵をとった。 Linuxアプリから正しく扱えないなら意味ないでしょ?
そもそもファイル属性はWindowsの方が高機能で Linuxは、いろいろ拡張入れたら別だが 基本のファイル属性はUNIX初期の頃から変わって無くてかなり貧弱。 Windowsの高機能なファイル属性をそのLinuxにマッピングすることは出来ない。 逆にLinuxのファイル属性を全てWindows側に持たせることは可能 こうすることで全てのWindowsのファイルをLinuxで正しく扱えるようになった。
漏れは、Ruby のバージョンマネージャー、rbenv をWSL, Ubuntu 18.04 に入れた。 これで、Linux 側に、好きなバージョンのRubyを入れられる Windows 10 側には、VSCode を入れて、拡張機能のRemote WSL を入れる これが基本!
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の環境で試してどちらも同じ結果になったのですが、こういうものなのでしょうか…。
>>305 アホか?
バッチファイルでwsl起動してその中で実行してるだけじゃん
レジストリ編集の方もパワーシェルに引数渡してwsl起動してるだけだ
これじゃあcygwin使ってやるのとなんら変わっとらん
>>312 あのさ、おまえ頭悪いよ?
目的を一番ラクに実現する方法が
目の前にあるというのにそれを使わないのはアホだろ
ネイティブのPerlを使えばいい
今更PerlのWindows移植版なんかいらんよ。
Windows移植版なんてcygwinと何も変わらん
>>311 試してみたけど確かに同じ配列が変えるね
オライリーのDBI本見たらそう書いてあった
selectrow_arrayって方を使ってリストコンテキストで受けるといいみたい
>>314 やはりそうですか…
selectrow_hashrefを使うと$sqlでも$sthでも'A', 'B'それぞれの結果が返るので、selectrow_arrayrefだけ期待と違う動作をしている気がします。(バグ?)
>>315 バグというか仕様だと思う
作者の書いたオライリー本にも書いてあったから意図的なはず
今更変更できないからこのままになってるんだろうね
>>316 なるほど。
それでは今後、selectrow_arrayrefは注意して使うようにしたいと思います。
ありがとうございました。
>>313 へー
バッチファイル作ったりトリッキーな関連付けまでしないと動かないのが一番楽な方法ねー
cygwinで全く同じことができるしwin移植版perlならそのまま実行できちゃうんだけどね
ところでエクスプローラからどうやったらwsl内のファイルが見えるんだい?
>>311 selectrow_arrayref は最初の1行しか返さないからということはない?
ぐえ。リロード忘れたらとっくに話が終わっていて間に沢山の書き込みが
BOOKOFFに100円で売っていたPerl/CGI辞典によると、 selectrow_array:先頭行 selectcol_arrayref:最初のフィールド selectall_arrayref:すべて
>>318 Windows版Perl使って
Windowsで動かないーってやるより、
安心して使えるバッチファイルを使ったほうがシンプル
いやいやw WSLならバッチファイルなんか使わなくてもエクスプローラーからダブルクリックでWSL上のスクリプトを直接実行できるんでしょ? やり方教えてよ windows版perlならバッチファイルなんか使わなくてももちろん出来るからねw それとwindows版perlだと何が動かないのかな〜?
バッチファイルとかっていったい何歳の爺さんなんだよ
>>323 普通に、wsl.exe+スクリプトファイルのショートカットを作るだけ
>>325 やってることはバッチファイルと同じじゃん
Ruby でも、MSYS2/MINGW は、日本語でバグル・日本語入力できない。 一方、WSL は、日本語でバグらない! WSL が出たから、次第に、Windows 版のRuby Installer は、使われなくなっていく それに、VSCode の拡張機能、Remote WSL が出たから、 Windows 10 では、Ubuntu 18.04 が標準になる プロジェクトも、Windows 側のC: ドライブじゃなくても、 Linux 側に置いて、Remote WSL でアクセスできるので、本番環境に近い Windows/Linux のファイルのアクセス権限の違いに、困らない!
>>326 それで実現できるだろ
しかも完全にちゃんと動くPerlで
ハア? WSLはwindows版perlより楽できるんじゃないの? なんでわざわざそんな面倒なことすんの? それとエクスプローラからWSLのファイルが見えてそれをダブルクリックで実行できるって話はどうなったの?
WSLはあくまでLinux的システムなアプリであって、Windows側とはやっぱり高い壁がある、と思っとくほうが安全やろ。
Ruby なら、WSL から、1-liner で、
Rubyで作られた遅いウェブサーバー、WEBrick が起動する
index.html が、Windows 側のC: ドライブにあるとすると、
cd /mnt/c/〜 で、Windows側へ移動して、
または、index.html が、linux 側のドライブにあるとすると、cd で、そこへ移動して、
ruby -run -e httpd . -p 8080
これで、Windows側のブラウザで見れる
http://localhost:8080 つまり、プロジェクトが、Windows/Linux側のどちらにあっても、Windows側のブラウザで見れる
Webサーバーを経由すれば、ファイルが地球の裏側にあってもふつうに見れるなー。w
Linux 側のフォルダ内を公開した、Linux側のサーバーに対して、 Windows 側のブラウザのlocalhost で見れるんだよ!!
>>319 >>321 返信ありがとうございます。
すみませんが、selectrow_arrayrefが最初の1行しか返さないということは知っています。
そうではなく、結果(リファレンス)を変数に入れてから再度同じステートメントハンドラでselectrow_arrayrefを使用すると、リファレンス実体の方が書き換わってしまうので、1回目の結果が失われてしまうということを言いたかったのですが…。
サンプルとして'パラメータ付きクエリ'と書きましたが、複数行を返さない単純な「SELECT ?」でも再現します。
>>335 同じ変数を使い回しまくって、パフォーマンスを落とさないためやないの?
GCのないPerlならたいしてかわらんやろけど。
>332 ウェブサーバーならbusyboxでよくね?w 数MBのメモリで動作する
>>335 クエリ結果を保持してるのはステートメントハンドラオブジェクトの方でパフォーマンス優先のためにその内部変数のリファリンスを返すのが*_arrayrefって考えればいいかな
んでselectrow_arrayrefの第1引数に文字列を渡したときは内部で毎回prepareされるので後から実行しても書き変わらないと
第一引数に$sth渡せるんだって思ったね 文字列しか渡したことないし Perlはいまだに知らないことがある
>>339 そうですね。
DBI.pmで第1引数がリファレンス(ステートメントハンドラ)ならそのまま使用、そうでなければprepareしているところまではわかったのですが、その後の流れは同じのようでしたし、Driver.xstまで解析するのはやめておきました(^^;)
>>340 そういう時は
How dare you?
と言う。
関連付けの仕組みを知らない人がいるのかな? 単にレジストリに、この拡張子はこのコマンドで実行するって書くだけなんだけど
つまりcmd。exeから実行できるものは全て 同じやり方で関連付け作れるってことね
それはただの起動のしくみでしかない。 実際の動作は高い壁で分離されてるといって過言でないものをいっしょくたにはできまい。
そもそもダブルクリックできるなんて 起動の仕組みなんだから、起動の仕組みでしか無いと言われても その話をしてるんですよとしか言いようがないがw
だからエクスプローラからWSLにあるファイル見る方法教えてくれってw
それは見れる \\wsl$ エクスプローラからしか見れないのが問題
ダブルクリックてエクスプローラーの話じゃん エクスプローラーから見れるなら、ダブルクリックして開ける。 その証拠にテキストファイルだって開けるだろ
active perlのcryptのsaltにasciiでない文字を渡すと止まるんだけど何で?
>>355 理由を聞いてどうするんや?
文字コードとかややこしいから、対応してないんやろ。
暗号化って、base64 とかだろ。
ascii だけだろ
Ruby なら、こういうやつだろ
module SecureRandom
https://docs.ruby-lang.org/ja/latest/class/SecureRandom.html >>358 わかってもなにもできんくせに
ゴミクズ
>>355 ここに書き込む前に、perldocを嫁
If using crypt on a Unicode string (which potentially has characters with
codepoints above 255), Perl tries to make sense of the situation by
trying to downgrade (a copy of) the string back to an eight-bit byte string
before calling crypt (on that copy). If that works, good.
If not, crypt dies with Wide character in crypt .
おそらく、crypt はPOSIXの仕様に合わせているから、こうなるのではないかと思う。
128-255を渡しても止まるんだけどね エラーが出るとかじゃなくて異常終了する 仕様だとは思い難い
「異常終了」じゃなくて、「die」してるんちゃううんか?
>>363 にもそう書いてあるやろ。
トラップしたけりゃevalしろ。
die すると何かエラーメッセージ出しておとなしく終了するんじゃないのか? windowsに怒られとるぞ
この言語はなにが起こるかわからんので基本evalで囲わないとやってられませんね
トラップでevalってなんだっけ?w Perlやめてから結構立つから忘れた。 なんかそんなのあったなwww 今?Perlからシェルスクリプトに回帰していますがなにか?
>>368 これ
https://perldoc.jp/func/eval eval BLOCKってやつ
try catchみたいなもん
エラーが返るならtryできるだろうけど、試してみたら異常終了するようなもんも避けられるのか?
evalでもトラップできない
man にはどう書いてあるの? Perl の crypt じゃなくて C のライブラリの方だよ。
WindowsだしActivePerlのようだし、何がおきてもふしぎじゃないな。w
Windows10、activeperl 5.20なんだけど、次のコードできちんと動く。何が問題なのか解らない。 $res = eval {crypt('aaa', 'ppp')}; print "1. $res\n"; $res = eval {crypt('aaa', 'あ')}; print "2. $res\n"; $res = crypt('aaa', 'ppp'); print "3. $res\n"; $res = crypt('aaa', 'あ'); print "4. $res\n"; __END__ 1. ppFj4OYENOP9c 2. 縺VSnoxRf90hw 3. ppFj4OYENOP9c 4. 縺VSnoxRf90hw
検索が遅い いろんな条件に対してファイル全体を検索、ということをする時に、 OSのキャッシュに頼って毎回 `grep` する方が速い メモリに読み込んで検索すると負ける ループで$data[$i] =~ /$pattern/ した方がまだ速くて、 grep {/$pattern/} @data するともっと遅くなる 大量一括検索の高速化のテクニックみたいなの何かあるのかな
MCE::GrepはCPUの使用率は上がるけど遅くなった grepよりは正規表現の処理のあたりが時間かかってるんだと思う 感覚的にはもっと高速でも全然おかしくない感じなのに
100MBのファイルからパターンに合う行を全部抽出するのに1秒かかるくらいの感じ で、パターンが250もあるから、コーヒーが飲めるくらい待たされる
俺だったらgrepでやっちゃうなぁ 結果はファイル経由で
>>376 qr//で事前に正規表現をコンパイルしてみたら?
同じパターンで繰り返し検索するのではなくて、 いろんなパターンで同じ対象を検索するので、コンパイルはできない でも、パターンのリストは実行前に確定しているので、 qrで作ったものを配列に持たせておけば速くなるだろうか
もはや perl の能力を超えているな C とかで書いた方がいい
パターンの内容にもよるが、flex で書いて Inline::C で呼ぶという方法もある。
色んなパターンで? grep -f でパターン読ませてやるのと同じか?
素の Perl は NFA だけだから、どうしても速度的には不利になる。 パターンが250もあるなら尚更だ。 grep との差はPerl と C の差はもちろんあるだろうが DFA でできるパターンなら、その差が大きいと思う。
linuxだったら素直にgrep呼べばいいだけだけど、 windowsだと素性が良くて高速なgrepを探すところでまず困難がある さらに、grepに引数を渡すところにもエスケープ文字の困難があって、 結果の受け取りにも文字コードの困難が
そういえば awk は DFA じゃなかったかな。
perl の Memoize は関数全体に掛けるようですが、 ruby の @memo、javascript の memo の変数に掛けるのは新し目の使い方でしょうか
>>388 WSLのUbuntuだとどうなのだろうか?
あれ遅い?
NFA でなければならない理由がないなら DFA にするだけで速度 1000 倍は堅いかも。 でも Perl のままでも正規表現のチューニングは可能だ。まだやってないならね。 実際に使ってるパターンを見せてもらわないことにはなんとも言えないが。
win8.1のサポートが終わった頃に思い出したら使ってみよう
@array = ($str =~ /(PAT1).+?(PAT2).+?(PAT3)/g); みたいにすると、パターン3つ分が配列に入るけど、他にもマッチするとそれも続けて入る できれば2次元配列になって欲しい そんな技はある?
そういうことをする時のセオリーはスカラコンテキストで $str =~ /\G$pat/g
可能? $str = '1a2b3c1x1d2e3f1g2h3i'; を与えられて [[a, b, c], [d, e, f], [g, h, i]] を得るにはどうすれば
my @arr = (); while ($str =~ /\G.+?([a-z]).+?([a-z]).+?([a-z])/g) { push @arr, [$1, $2, $3]; }
[[a, b, c], [x, d, e], [f, g, h]] になっとるよ
でも判った 普通に$1使えばいいだけか 結果を一つずつスカラに取るんだと思ってた
/\G.*?1(.)2(.)3(.)/g これがやりたかったこと
結局コードはあんまり変わらなくて、ループで push @array, ($1, $2, $3) にするか、後で splice(@elements, 0, 3) を使っていくかの違い パターンを3つから4つに増やした時に、 $4を追加するか、3を4に増やすかのメンテはやっぱり必要 いきなり2次元配列が得られるスマートさからは劣る
どうやら今回は必要ないみたいだけど事前にグループの個数が
判らないという前提なら @- とか見ればいい。
あるいはグループに名前を付けて %+ を使えばいい。
全部ここに書いてあるよ。
https://perldoc.jp/pod/perlretut Perlで、とある配列を指定した要素数ごとに別の配列リファレンスに分割する処理をList::MoreUtilsモジュールで書き直してみた
https://perl48.hatenablog.com/entry/2018/08/19/005304 名前を付けるような性格のものじゃなくて個数が変わる可能性があるなら 個数だけ与えてパターンを組み立てればいいよ。 $1,$2 とか書かなくても map { ${$_}} 1 .. $n で同じことができるし。 リストコンテキストで配列に入れてから splice する方がいいと思うならそうすればいい。
目指すのは、個数がいくつなのか人間が把握しなくていいコード
できるでしょ。自分がスマートになってスマートなコードを書けばいい。
完全に数値って決まってるんなら、俺ならsplit使っちゃうな @a = split /\d/, $str; まあこんな単純な話じゃないんだろうけど
activeperlで $res = `exefile $file`; みたいなことをした時に、 コマンドプロンプトからスクリプトを起動するとちゃんと動く でも、スクリプトをランチャーから起動するとno such fileになる ファイル名が英数ならどちらもok 2byte文字が混じると挙動が変わる 起動の仕方によってパスの取り扱いとか変わる?
あ、違う 2byte文字ではなくドライブの違いだった ネットワークドライブにあるとアクセスできない コマンドプロンプトからならできる
結局、ランチャーに管理者権限が付いてるのが原因 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System EnableLUA 1 -> 0 これで解決する perl関係ない
ランチャー自身か、ランチャーの起動方法がよくないんやろ。 ネットワークドライブの認証(ログオン)かそのタイミングがあやしい。
質問させてください。 WindowsでActivePerlを使っています。 perl で、あるファイルを、関連付けられたアプリケーションで開く には、どのようにすればよろしいでしょうか? 例えば、xx_system('foo.txt') のようにすると、'.txt'に 関連つけられたアプリケーションで、'foo.txt'を開くような 動作を実現したいのですが。
最近 python を使い始めたんだけど、使うほどに perl 凄げーって思う。 perlって細かいこと気にしないでも書けるって感じ。 まあ、 python に慣れてないってのもあるけどw
細かいことを気にしないせいでバグの原因になるので、 きちっとしか書けないようにした perlの不満を解消してもっと簡単に書けるようにしたのは、 rubyの方が正常進化だと思う
>>418 use strict;
use warnings;
Perl は、暗号のような記号が多いから、皆嫌う Ruby は可読性を上げるために、それらの記号を無くそうとしている
>>420 変数の型を知るのに
宣言まで見ないとわからないのがJava
代入まで探さないとわからないのがpython
見るとその場でわかるのがperl
宗教論争は終わらない
マウスオーバーで判るようなものをいちいち書かなくても
いやいやPerl書いてるときマウス触らんでしょ まあ人によるんだろうが
ロジックが逆だ perlが型が判るからマウスを触らないのではなく、 マウスを触らないで作ったからマウスなしで型が判るようになってる MT免許だからといってATに乗ってはいけない訳ではない
Perl の IDE って、どんなのがある? Eclipse とか IntelliJ IDEA のプラグインで使えたとは思ったが、拡張子を .pl にしておかないと Perl だと判別してくれなくて ただのテキストファイルと認識されちゃって使い辛いなと思ったことはあるが、もっとまともなのある?
vscode + Perl::LanguageServer
拡張子を ,pl にしないメリットってなんかある?
実行ファイルはpl モジュールはpm そんな事も知らんのか(´・ω・`)
>>430 Linuxでは、いちいち拡張子をつけないのがふつう。
中身を気にしなくてよくなる。
>>434 cとかshellとか拡張子をつけるのが普通なんじゃないの?
ソースは付ける 実行ファイルは付けない スクリプトはソースよりも実行ファイル寄り
拡張子つければ伝わるであろう情報を削るとか 一人で管理してるサーバならいいけど そうじゃなきゃ害悪だと思う
人間がエディトするファイルは付ける 人間がエディトしないファイルは付けないんじゃないの?
運用においては、実行ファイルの実装方法なんかどうでもいい。 むしろ、実装方法を変えたら、ファイル名も変わるほうがはるかに害悪。 たとえば、シェルスクリプトをPerl スクリプトに変えただけで、そのスクリプトを使っているところをすべて変更しないといけなくなる。
昔々 MS-DOS (更にそれの元になった CP/M)はファイル名に固定で3文字の拡張子があり、 それによって実行ファイルかどうかを判定していて、Windows はそれを引き継いでいるので 拡張子を使っているだけ。 UNIX系OSはそもそも拡張子という概念はなく、実行ファイルは実行パーミッションのビットが 立っているかどうかで判定していた。C言語のソースに .c を付けたりはするが、あれは拡張子 ではなく接尾辞で主に人間やそれを読むコンパイラ等がファイルの種別をファイル名から判断 するためにある。だからOSから見たら .c の部分に特別な意味はなくファイル名の一部でしかない。 Windows だと例えば .exe のファイルなら .exe を抜いた拡張子なしのファイル名を指定して OSに実行させる事は可能だが、これはOSが拡張子部分を特別扱いしているからだ。 UNIX系OSではそのような方法では実行できずファイル名を全て指定する必要がある。xxx.pl なら xxx.pl と指定する必要があり xxx のみでは実行できない。その代わり実行パーミッションが立って いればファイル名がどうであろうともOSはそれを実行しようとする(実際に実行できるかどうかは ファイルの内容による)。
拡張子が無くても判定できるようにすればいいんじゃないの? Emacs みたいに。
>>439 運用のために保守は犠牲にするんですか?
>>443 実装の変更は、保守の範囲ではない。
二次開発かな?w
>>445 >>440 はその前の話やろ。
シェバンがあるだけで、テキストファイルが勝手に起動されたら恐ろしいわ。w
言語変えて作り直すって、俺の感覚ではシステム置き換えのイメージだわ コンパイル済みのバイナリならともかく、スクリプト言語動かすって環境づくりも入るじゃん
>>445 >>440 に書いてあること読んでないだろ。
その前って何?
だからシェバン使えば拡張子なんか使う必要はないってことだよ?
>>439 みたいな書き換えはいらないってことを言ってる
あと自演して書き込みは見苦しいぞ
読解力理解力がなくて、複数から指摘されたからって、自演扱いで返すとは見苦しいぞ。
「local $| = 1;」と言う記述見たんですけど、 「$|」の局所化って意味あるのでしょうか? ただ単に「$| = 1;」と等価であり「local」を記述しても無駄な気がするんですけど、 私の勘違いでしょうか? 「local $| = 1;」とやることで、 そのファイルの出力だけみたいな感じになるのですか? となると、 同プロセスなのに標準出力バッファが出力毎に別個に用意されてる事になってしまいますよね? 分かるかた教えてください。
>>453 スコープを抜けたときに、もとの値に戻る。
横からだけど知らなかった… 毎回もとの値別変数で退避してた
なんとなく直感的にグローバル変数だけだと思ってた だから元の値を退避しておくという発想の方が自然 わざわざぶつけて便利に使おうという発想はいずれバグる
>>454 レスありがとうございます。
「もとの値に戻る」と言う事は、a.plから参照される異なるスコープのb.pmがあり、
b.pmに「local $| = 1;」の記述があった場合、
b.pmに定義されたサブルーチンが呼び出される毎に、
「$| = 1;」と同等の処理が行われ、
戻る際には元の値がセットされるのでしょうか?
それとも、スコープによって異なる「$|」を、
標準出力側でスコープ毎に切り替えてるという事でしょうか?
printする度に今見えてる$|が渡ってるんだろうな
>>458 まぁ、そうですよね。無駄な処理になるし後者ですよね。
(OOP的に言うと、スコープ毎のインスタンスを参照的な)
ありがとうございました。
>>456 Perlにあっては「わざわざ」ではない。
localはダイナミックスコープ、my/ourはレキシカルスコープであることは意識しておくべき。
宜しくお願いします。 $1をクリアしたい場合は「'' =~ /()/;」等として 無駄なマッチングをして空文字列を設定しないとダメですか? 数億件のデータを捌く際とか、めちゃくちゃタイムロスになりますよね? 皆様はどうされてるのでしょう?
>>461 ↑に追記です。
$2以降のクリアも含めてお願いします。
最適な解を頂ければ幸いです。
>>461 まず、scalar変数の場合
=()はできない
=''や""は明示的に空文字列を設定することになる
なので既存変数をクリア、というか不定状態に設定するには
= undef;
あるいは数値を設定するためのシンボルを値0に戻すには
= 0;
undefは値として評価されれれば0,文字列として評価割れれば空文字列''が返った
(と思う)
答えではないのだけれど、そういう場面に遭遇したことがないんだよね 簡単でいいのでどんな時に必要なのかしら?
>>463 あの…すみません。
スカラー値の評価の話をしている訳ではありません。
$1や$2や$3と言った特殊変数の値をクリアをする方法を聞いています。
これらの特殊変数に値を代入したらエラーになります。
引き続き
>>461-462 のベストな解をお待ちしています。
宜しくお願いします。
>>464 計 数億件のデータがあり、
それぞれにはCのラベルのような項目名がありまして、
それに続く文字列がその項目の値になるのですが、
(例えば「name: value…\n」な感じです)
これを一時的にDBに収めるためnameをキーとしてライブラリに渡したいんです。
一般的に思いつく方法としては、
「if( $ln =~ /^(パターン)://g ){ func( $1, $ln ); … }」
とすれば良いのですが、
なにせ件数が多いので、無駄な条件文を省きたいのです。
(条件文は処理が重いので)
検証実測値では1日以上の処理速度差がでるかもなのです。
(他にも同等の処理があるのでかなり省ける感じがするんです)
func()は、キーや値が未定義値もしくは空値であれば、
なにも処理をせず抜けるので、
$1がクリアできればif文を無くすことが出来ます。
そこで思いついたのが、
>>461 の「'' =~ /()/;」ですが、これでは本末転倒です。
と言うのが経緯です。
>>465 そもそも、$nはマッチしたときのみ参照する変数であるから、わざわざリセットする必要がない。
if (m/(.*)/) {
say $1;
}
これ以上の回答は
>>464 に答えてから。
あら、いきちがった。。。 そういう話であれば、気にするな、ってところやろ。w オレの感覚では、ifで判定して関数を呼び出さないほうが速そうだと思うがなあ。 Perlの処理としては、関数からすぐ戻ると言っても、呼び出しもそこからの戻りもそんなに軽くはなかったような。 「かも」とか言ってないで、真剣ならまず計測してみろ。
説明してくれたけど、やっぱイマイチ分からん $1をクリアして無条件でfunc( $1, $ln )を呼び出したい、ということかしら その時funcは通過するだけ、と パフォーマンスを気にするならやっぱり $1 && func( $1, $ln )とかの方がいいと思うけどな 多分、何か事情があるのでしょう。 美しくはないけど'' =~ /()/;なら誤差の範疇と思いますよ。 数値としてはベンチマークで
$1をやめる選択肢は? ($label) = $ln =~ /^(パターン)://; func($label, $ln);
答えじゃないんだけどさ、 $x = $ln =~ /^(パターン):/ && $1 これで以降は$xを使う、とか。
え、array使わないの? 俺としては ($label) = $ln =~ /^(パターン):/; func($label, $ln) if $label; を推したい
Ruby で特殊変数などは、スレッドローカル変数だから、 マルチスレッドでも共有しないから、安全だけど 特殊変数をクリアする必要など、考えたこともない
マッチに失敗してるのに古い$1を使ってしまって、 みたいなケースはちょいちょいあるな それはクリアしてなかったからではなくて、失敗をトラップしてないバグ
>>466 もうCで書いちゃえよ。速いよ。
コロンまでの文字列抜き出すのは簡単だろう。
速くしたいなら正規表現でマッチするかどうかなんてことやることそのものが間違いだとも思える。 同じPerl使うのであってもindex関数使うとか、他にやりようがあるんじゃないか?
大量のデータを効率よく扱うのは、データベース構築するのが正解 個人が扱う範囲だと、テキストで持って全検索で困らないけど、 量が増えるとそのうち破綻する
>466 $ln =~ /^(パターン):|(.*?)/ にすると、「^(パターン):」にマッチしないときに$1を空文字にできる。
ただ、(試してはいないが)if文のオーバーヘッドより、 関数呼び出しのオーバーヘッドのほうが大きいと思うけどな。
そこまで速度に気にするならC++とかで書いた方がいい気がするね
そんなデカいデータをよくパールでやるね。 C で書け。
https://developers.srad.jp/story/20/06/26/1324207/ > Perl 7が発表される。実質的にはPerl 5系のリネーム
> ストーリー by hylom 2020年06月26日 17時08分
> 現代における素人にはオススメできない言語 部門より
現代における素人にはオススメできない言語
…なら、文字列処理をやりたい素人は何を学べばいいの?
>>484 事情を知らなくても最新版だとわかりやすくするために。
Perl6、Rakuがあるなかで、Perl5と言われたら古いとかEOLとかの疑いを持たれかねんから。
それに、必要であれば非互換も?
デフォルトの状態が変わるだけで 適宜オプションつければ後方互換も保てるらしいよ Perlのこういうところ好きだわ
Perl7は進化を求める この10年で完全にオワコン言語になってしまった
効率化して高速化しようとしても、過去に足を引っ張られる
単純に過去を切り捨てたら、Rakuの二の舞になる。過去を切り捨てるのであれば、 Python に勝てる程度の言語仕様にしなければ、見向きもされないだろう。 しかし、それはもう既にPerlではないだろう。
Perlはこのままでいいと思う レガシーなのがPerlの強さ
>>492 はい。
Wiki>「Perlに続く」という意味で、6月の次の誕生石(7月)のルビーから名付けられた
逆に頑張って作ったPerl6が古いみたいな感じになっちゃうな(´・ω・`)
Perl6はさっさと開発中止すべきだったのになぜ続行したんだろう
ま、いいじゃねえか。新しい言語が一つ増えたようなもんだし。
>>498 「すべき」って、おまえは何様なんや?
やりたい人がやってただけ。
結果としてうまくいかなかっただけ。
>>500 何様ってw
匿名掲示板で何を言ってるのw
強いていうならPerlユーザーですw
___________________________________________ /media/xxx/DVD_HDVR/HDVR_SOB/*.SRO というのが動画本体で、 SROファイルの構造は 000000-00007F 東芝ヘッダ 000080-007FFF (データA) 008000-00807F 東芝ヘッダ 008080-00FFFF (データB) 010000-01007F 東芝ヘッダ 010080-01FFFF (データC) となっていて、東芝ヘッダからみたオフセット0x1C番地にある0x40値を=>0x00に書き換えるそうです。 東芝ヘッダは1つのファイルに複数ある(?)そうで、それらすべてを書き換える必要があるようです ↑ これをperlスクリプトでお願いします
同じような目的の別のスクリプトです これに近いイメージでしょうか (全文書くとブロックされる) _________________________________________________________ HR_MANGR.IFOのコピー禁止フラグ解除は、 0x20 0x2C 0x23のシーケンスを0x20 0x24 0x23 に変更 perlスクリプトの例は以下のとおり。 # freeifo.pl # HR_MANGR.IFOの変換 use strict; use warnings; my $infile = "HR_MANGR.IFO"; my $buf; my $sTarget = " ,#"; # 0x20 0x2C 0x23 # ファイルのオープン # バイナリモードに変更 binmode INFILE; binmode OUTFILE; my $sizIFO = -s $infile; # IFOファイルを読み込み # 0x20 0x2C 0x23 の並びがあれば、0x20 0x24 0x23 に置き換え #他にあれば継続、無ければ終了 # ファイルのクローズ close INFILE; close OUTFILE;
書き換える番地は、N は、0 以上で、以下の法則か? 0x8000 × N + ( 0x80 + 0x1C ) つまり、ヘッダは必ず、0x8000 毎にあるのか?
>>511 レスありがとうございます ________________________________________________ SROファイルの書き換え 000000-00007F 東芝ヘッダ 000080-007FFF (データA) 008000-00807F 東芝ヘッダ 008080-00FFFF (データB) 010000-01007F 東芝ヘッダ 010080-01FFFF (データC) というふうに、0x8000バイトで1セットとなっている。 東芝ヘッダとは、0x80バイトからなるデータブロック。途中に## Toshiba 〜という文字列を含んでいる 東芝ヘッダのコピー禁止フラグ(CPP)のあるオフセット0x1Cを 0x40 ⇒ 0x00 に修正。 オレなら、バイナリーエディタの置換機能を使うと思うが。
数が多いとツール作った方が早い 手動でやってもツール作っても時間同じなら、ツール作った方がいい 仕事では、ツール作ったせいで余計に時間かかってもツール作る
>>513 データが大きいのでLinuxのバイナリエディタでは上手く行かないのです
この文字列が一定間隔で現れます
データが大きいので
>>514 さんの言うとおりツール(スクリプト)で処理したいのです
perl -e "binmode STDIN; binmode STDOUT; while (read STDIN, $_, 0x8000) { substr $_, 0x1c, 1, 0; print }" < IN > OUT これが最短?
>>517 レスありがとうございます
泣きそうです(解らなすぎて)
>>509 のスクリプトはバイナリ修正したコピーファイルを作成するものでした
小さなファイルなので問題ないのですが、目的の対象ファイルは10GB~20GBもあるものなのでマネ出来ません
>>509 の全文です
後出しのクセが強すぎすいません
>>515 なるほどね。しかし、perlが扱えるデータ量にも、よく解らない限界があって、
巨大なデータを突っ込むと勝手に途中で切られたりするみたいだよ。
巨大なデータを扱うなら、seek関数みたいな低水準な手法を使う必要があるかもしれない。
直接書き換えたいならこんなとか? perl -e 'open F, "+< IN"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0"; seek F, -$l, 1; print F }'
>>521 ありがとうございます
Fはファイル名でよろしいでしょうか?(素人でごめんなさい)
Can't find string terminator "'" anywhere before EOF at -e line 1.
となります
GBレベルのファイルがオンメモリで処理できるわけないだろ。w
Stream 処理なら、バッファサイズ分のデータを、読んでは捨ててを繰り返すから、 必要なメモリサイズは、バッファサイズ分だけ それか、seek みたいに、その番地をシークして、そこだけ書き換える
0x8000 は、32,768 バイトだから、32 KiB。 (ただし、Kib は、1,000 倍ではなく、1,024 倍) 32 KiB * 32 個 = 1 MiB 1 GiB なら、 32個 * 1,024 = 32,768個 10GiB なら、0x8000サイズのブロックが、327,680個もあるの? データ部分は固定サイズなの? 変動サイズで、そのサイズがヘッダ内に記録されているとかじゃないの?
まーだやってたのか
>>523 で
perl -e 'open F, "+< ファイル名"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0"; seek F, -$l, 1; print F }'
がエラーになったのは Windows のコマンドプロンプトで試したんだろ
コマンドプロンプトでは ' でなく " を使ってこう
perl -e "open F, '+< ファイル名'; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, qq/\0/; seek F, -$l, 1; print F }"
もちろん read や print は流れで残してただけでまったく必要ないから
perl -e "open F, q/+< ファイル名/; binmode F; seek F, 0x1c, 0; while (! eof F) { seek F, 0, 1; print F qq/\0/; seek F, 0x7fff, 1 }"
で十分なのは言うまでもない
コマンドラインで書き捨てじゃないならperl7で不可予定の F じゃなくて $fh にするかな
くれぐれも、データのバックアップを取っておいてから、実験しろよ。 もし、プログラムが間違っていたら、回復できないから そもそも、他人のプログラムの意味が分からないのに、 それをそのまま実行するのは、非常に危険!
Binary fileをupdateモードでopenして
目的の位置にseekしpackで元のファイルの内容を直接書き換える方法なら
https://docstore.mik.ua/orelly/perl/cookbook/ch08_14.htm >>530 検証に時間がかかってしまって返信遅くなりました
できました!! ありがとうございました!
推察の通りコマンドプロンプトでのエラーでした
本命のLinux(Ubuntu)の端末上からも書き換え成功しました
感謝です
ほかの皆様もありがとうございました
不愉快に感じた方も多かったと思います ごめんなさい
ここで「進捗状況表示(%)をさせるにはどうしたらいいですか?」とか聞くと嫌われることは、僕もいい大人なので知っています
進捗状況を表示させるには、最初にファイルサイズを取得する。 そして、データを書き換えるたびに、現在のseek 番地を取得して、 現在のseek 番地 × 100 / ファイルサイズ 例えば、300 × 100 / 1,000 = 30 %
>>538 レスありがとうございます
本当にうれしいのですがド素人なので理解出来ないのです
>>530 のコマンドラインに絡めるかスクリプトにしていただけると卒倒するほど喜びます
これを機会にperlを勉強したいと(心から)思いますが、今の段階ではこんな図々しいお願いをするしか出来ません
進捗表示は、計算自体は簡単だけど、ちゃんと見えるように表示するのが ちょっと面倒なんだよな
そんなもんがいちいちあるのか まあ、凝ったことをするなら共通化はするだろうけど 凝ったことしなくても、どういう頻度で表示するかとかの調整は必要で、 UI特有の機能と関係ない面倒臭さの部分なんだよな
ターミナルの機能を使いきるなら面倒だろうけど、ただ垂れ流すだけなら簡単やろ。
>>512 最適化するとすると手順はこんな感じかな。
1. 0x1c バイト読んでそのまま書く。
2. 1バイト読む。読めなかったら 5 へ。読んだ内容が 0x40 なら 0x00 に変えて書く。0x40 でなければそのまま書く。
3. 最大 0x7fff バイト読み、読めたデータをそのまま書く。
4. 2へ。
5. 終わり。
STDIN から読んで STDOUT で書くならこうなる。
read(STDIN, $buf, 0x1c);
print $buf;
while (read(STDIN, $buf, 1)) {
print $buf eq "\x40" ? "\x00" : $buf;
read(STDIN, $buf, 0x7fff);
print $buf;
}
>>530 さんからの頂き物に、ファイルサイズを取得。。。まではできました(訳:パクれました
みなさんありがとう
し、進捗。。。
----------------------------------------------------------------
open F, "+< ファイル名";
binmode F;
my $filename = "ファイル名";
my $filesize = -s $filename;
print "$filenameのサイズは$filesizeです。\n";
while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0"; seek F, -$l, 1; print F }
readして変更しないところまでprintするのは無駄なのに 無駄を省けば進捗表示がいらないくらい高速化するだろうに
コピーを作っておいて、そのコピーの一部だけ変更して書き戻せば一瞬 信頼性が上がったら、コピーは作らずにオリジナルを変更する
>>550 ファイルサイズがGBレベルなら、そんなに速くはならんやろ。
ていうか
>>548 は
>>530 を参考にしてるのになんで遅い方を使ってるんだ
呼ばれた気がしたので 約10分のデータ(1.3GB)で比較しました readあり real 1m34.485s user 0m0.888s sys 0m6.100s readなし real 1m5.851s user 0m0.340s sys 0m3.563s USB2.0()でUbuntuにマウントさせた外付けHDD上のデータを直接書き換えています 特殊なフォーマットなのでWindowsでは認識できないのです
残念ながら暗号化解除まではされないんです 別の機器にコピーしようとしても「コピープロテクトがなんちゃら。。」と、ちゃんとハネられます 機器内の制限を緩くするためのオフホワイトな作業です
>>559 理由は関係ないはず
秘匿目的で暗号化されているものを解読することそのものが犯罪
>>557 お前は裁判になって負けたら責任全部背負うのか?
自称”法律専門家”の底辺ニート達が不毛な議論を展開すると予想
コピー許可するフラグをいじるのは私的利用の範囲なら自由じゃないですか? ここでその方法を聞いたりその答えを書いたりした人がどうなるかはわかりませんが
>>567 他人が使うためにプログラムを公開することに問題がないとでも?
Winnyの作者は捕まるが利用者は捕まらない 包丁の販売は捕まらないか利用者は捕まる事が有る YouTubeであるけど包丁を自作して販売したら捕まるのか?
>>568 コピー許可フラグを取り除くプログラムを公開することは問題ありと見ているわけですね
確かに東芝の全機種に対して動作可能であるなら影響は大きそうです
おかしな雲行きになってきたので説明(釈明)を まず第一に、このスクリプトだけでは目的を達成することができません いくつか別ファイルを修正する必要があります 当然ながらこのスレではそれらは公開されていません 不完全な変なデータが出来上がるだけです 第二にこの手法が通用するのは、10年以上前に発売された「ある機種」のみです 次機種以降ではこの"バグ"はすっかり塞がれました ディスクの中身をこれほどたやすく弄れるなんて話は聞いたことがないです 今現在どれほどの人がこの機種を使っているか知りませんが。。。 そしてこれは「暗号化解除」を目的としていません ヘッダの一部分をちょっと弄っただけでプロテクトが外れるとか、幼稚園児ですか? これはデータを細工して機器を「騙している」にすぎません
「暗号化解除ではない」と書いているのに裁判(w)とか責任(w)とか言ってる人って
字が読めないのか、頭が悪くて理解できないのか、あるいは目が見えないのか
10年前も当時の2ちゃんねる()で話題になって多くのスクリプトやプログラムも配布されました
彼らは訴えられたのかなぁ?心配です(棒
ついでに言えば
実は
>>530 は私です
壮大な自作自演です(今時)
進捗表示を教えてほしかっただけなのです。。。
みなさん釣り堀へようこそ
そして農家の朝は早い
それでは最後に 普段から社会にこれっぽっちも貢献してないくせに、こんな匿名掲示板で妙な倫理観や底が浅い正義感を振りかざすとか 以降、間抜けな人たちの「負け惜しみ」のレスが続きます 屁理屈、論点ずらし、人格否定など、つたない書き込みをしばらくの間お楽しみください 合わせて「おかしな雲行き まで読んだ」もお楽しみください
釣り堀する前に、Linuxインストールできるようになれよ。
Linuxで思い出したが、最新のUbuntuとかでは(仕様変更で)その機種の外付けHDDを「書き込み可」
でマウントできない
手動で”-RW”オプション付けてマウントしようとしてもダメ
書き込みできないからスクリプトもエラーになる
仕方ないのでUDF関連のソースファイルを弄ってカーネルをコンパイルしている
多分世界で私だけだと思う(そんな需要があるわけない)
>>574 頑張って
パソコンはコマンドが基本だからな。 コマンド出来るようになれよ。
readの有無で差がなさすぎて信じがたいんで実験してみた RAMディスクで fsutil file createnew data 2000000000 して Measure-Command { perl -e 'open F, q/+< data/; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, qq/\0/; seek F, -$l, 1; print F }' } | % TotalSeconds 2.8214867 Measure-Command { perl -e 'open F, q/+< data/; binmode F; seek F, 0x1c, 0; while (! eof F) { seek F, 0, 1; print F qq/\0/; seek F, 0x7fff, 1 }' } | % TotalSeconds 1.3621179 readしなくても32KB毎に書く時に読むだろうからこんなもんか
約13GBのデータで(usb2.0) 2ch配布Linuxネイティブアプリ@10年前 64bit版 12m10.357s Perlスクリプト readあり 12m5.101s Perlスクリプト readなし 8m38.678s
>>583 ネットでの暴言はインキャがすること。
てめぇはこうなれ!!!
http://re-file.com/18k/1669/ (結構グロ)
殺したいほど嫌悪するような事か? おそらく心の病気だから早く病院行った方がいい
>>585 あの〜傍観者なのですが、これって584と583
どっちに言ってるんですか??
ネットはこうでなくちゃ!明日の学校めんどいけど、この争いみたら 楽になれる!
なぁお前らってホントにコード書けるの? 何でここにいるの?
明日の学校とか五十過ぎのオッサンが恥ずかしくないのか?
>>590 福岡県福岡市東区在住
西南学院中学二年〇組テニス部
学力推移調査:225/223位
全教研赤坂本校筑女,西南合同vクラス
明日の時間割英会話.社会.聖書.体育
(保護者面談なので4限授業)
頭は悪いがプログラムができるのでマークザッカーバーグ
のように校内snsをつくって流行らせようとしてます笑笑。
昨日、無断で水曜日に部活休んだのでめちゃくちゃ怒鳴られました。
明日の聖書は、「手紙」というくだらない日本映画を見ます。
今日は一時から「爆笑問題カウボーイ」というラジオがあるので、
monsterのんでずっと起きてます。2年になって運が悪いことに親しかった
友達は2組と五組に分かれてしまい、僕だけ〇組という
辺境の地に飛ばされました笑笑。好きなアーティストは「ずっと真夜中でいいのに」
という顔出ししていないバンドです。さっき5chのずとまよ専用スレで顔写真をみて、
とても美人だったので今すごくうれしいです。好きなサイトは、「リファイル」というグロサイトです。
「西南学院中学2年という名前でコメント投稿してるので、グッドボタン押して下さい。
>>591 というか、こんなにネットにさらすのはやばかったかな?
>>590 逆に聞きますが、あなた五十過ぎのオッサン
何ですか?( ´∀` )
>>593 リアル厨房なら、perlなんかやめたほうがいいね。
python のほうがずっと言語仕様が綺麗で、複雑な処理も簡単にこなせる。
今、perlを使っているのはな、20年前からperlを使ってて、
他の言語に乗り換える気力も失ったオッサンばっかりだよ。
>>597 最近はperlよりphpに力を入れてます
>>597 互換性重視ならPerlしか。
Rubyはとんでもないし、Pythonもあやしい。
問題 ---- $flags に格納されているフラグ 0x40 をリセットして 0x00 にする 次の3通りの処理から採用する方法を理由を添えて答えなさい a. $flags = 0x00 b. $flags = 0x00 if $flags == 0x40 c. $flags &= ~0x40
でも、そこだけ書き換えて、ちゃんと動いたの? もし、チェックサムがあれば、エラーになるはずだけど
>>597 個人的にはサーバプログラムはgo
時点でpythonかな
perlはlinuxなら環境を選ばないという点で、シェルスクリプトはperl一択
それぞれに良さがある
>>603 a, b は他のビットが0になっても良い場合、及びbは他のビットが0の場合に動く。
cは
あ、ちょっと今書いてる時間ない。誰か他の人よろしく。
Cは他のビットを崩さずに 0x40 の所のビット(2進だと01000000)だけ0にする。
何を 0x00 にするのか不明確な時点で出題者の頭が悪い。 a を意図しているなら 0x40 は関係ないし b を意図しているなら「0x40 をリセットして」ではなく「0x40 がセットされていれば」と 書かれていなければならない。 ひょっとして、元の値が 0 だったらリセットしたことにはならないということか? c を意図しているなら他のビットが全部 0 の場合に限り「$flags の値を 0x00 にする」 ことになるだろうが、そのようには書かれていない。 $flags & 0x40 を 0 にするということなら、 0x00 と表記するのは 値としては同じでも適切な表記なのか疑問が残る。 しかしこれが最も無理のない解釈だろう。 こんなに忖度させるようでは出題者は落第だ。
うわあ恥ずかしいやつが来ちゃった
>>603 は
>>505 からの流れがあって出された問なのに・・・
pythonいいけどちゃんと書かないとすぐバグるから気をつけてな
水掛け論でしょ 言語仕様を理解しないで適当に書いてちゃんと動くかどうかの話
仕様からコードを自動生成すればバグらない 仕様はちゃんとしか書けないものとする
>>608 >>505 をよろしくお願いします
美しいスクリプトを期待
病気の人か 5ちゃんねるで悪態つくだけの惨めでみっともない人生
>>616 >>505 をよろしくお願いします
期待していい?
>>614 数万人の天才が挑戦しているがいまだに達成していない
>>621 むしろ天才よりも秀才のほうやろ。
本当の天才はそういうことに関わらん気がする。
直感的に不可能か、現実的に意味がないかを悟っていそうというか。
バグの無いことの証明が不可能なのは、 ゲーデルの不完全性定理とかあのへんまで突っ込んでいくからであって、 99.9%okなら良しとする現実世界なら普通に可能
>>623 そしてその0.1%が理由になって戦争になるわけですね
UTF8からShift-JISに変換し、その中で変換できなかった文字列はhtml数値文字参照に変換したいです
(UTF8)楽しいね🙂→(Shift-JIS)楽しいね🙂 ;
このような風にです
こちらのサイトを参考にして↓のように書いてみたのですが
https://blog.netandfield.com/shar/i/details/004482.html#home use Encode;
my $word = "楽しいね🙂";
Encode::from_to( $word, "UTF8", "Shift_JIS", Encode::FB_HTMLCREF);
print "$word";
(結果)
?y??????🙂 ;
と、元の日本語が文字化けしてしまいます
どこを直せばいいでしょうか?
Perlのバージョンは5.18.2
Encodeモジュールのバージョンは2.49です
その出力先(ターミナル?コンソール?)は、そもそもシフトJISテキストを表示できるのか? できない場合は、プログラムは関係なく、ターミナルが文字化けする。 ためしにtext.htmlのようなファイルに出力してから、その内容を確認したら?
前にやろうとして諦めた pythonだと簡単 try: str_sjis = str.encode("CP932") except UnicodeEncodeError: print str.encode("utf-8")
>>628 そのレベルならPerlでも簡単
絵文字だけ抜き出してHTML特殊文字化 でしょ
>>627 ターミナルです
ファイルに出力してそれをShift-JISとして開いたら文字化けもなく見ることができました
内部的には問題なかったのですね
ありがとうございました
プロトタイプ属性の指定がどうやってもできん use feature 'signatures'; sub foo :prototype($$) ($left, $right) { return $left + $right; } これで構文エラーになる理由が全く分からん
え???? use feature 'signatures'; sub NAME(SIG) BLOCK # with signature sub NAME :ATTRS (SIG) BLOCK # with signature, attributes sub NAME :prototype(PROTO) (SIG) BLOCK # with signature, prototype 構文こうなってるけど?
以下のようなhtmlがあるとします <div> <p>AAA</p><p>BBB</p><p>CCC</p><p>DDD</p> </div> <p></p>の構文が4個の場合は、構文を文字列として2個ずつ別の変数に分けたいです。 ($str1 に"<p>AAA</p><p>BBB</p>" 、 $str2に"<p>CCC</p><p>DDD</p>" <p></p>の構文が6個の場合は3個ずつ、8個の場合は4個ずつ・・・と前半と後半で分けて 2つの変数に代入したいのですが、方法はあるでしょうか?
そら一発では無理だろう 一旦配列に入れてから真ん中で分ける
ちょろい問題。単なる初心者で釣りなんかじゃないでしょう。 @foo = (); @bar = (); while ($str =~ s{^[\s\S]*?<p>(.+?)</p>(.*)<p>(.+?)</p>[\s\S]*$}{$2}){ push @foo, $1; unshift @bar, $3; }
2行目間違えてた。 while ($str =~ s{^[\s\S]*?<p>(.+?)</p>(.*)<p>(.+?)</p>[\s\S]*?$}{$2}){
# 元ネタ my $html = '<html><p>hoge1</p><p>hoge2</p><p>hoge3</p><p>hoge4</p><p>hoge5</p><p>hoge6</p><p>hoge7</p><p>hoge8</p><p>hoge9</p><p>hoge10</p></html>'; # 全部のpタグの中身を引っ掛ける my @p_list = $html =~ /<p>(.+?)<\/p?/g; # 引っかかった数取得 my $size = int(@p_list); # 前半と後半に分けて突っ込む my @mae = @p_list[0..int($size/2)-1]; my @ato = @p_list[int($size/2)..$size-1]; # 結果表示テスト print Dumper([\@mae, \@ato]);
なんだこの糞改行(´・ω・`) # 全部のpタグの中身を引っ掛ける my @p_list = $html =~ /<p>(.+?)<\/p>/g; # 引っかかった数取得 my $size = int(@p_list); # 前半と後半に分けて突っ込む my @mae = @p_list[0..int($size/2)-1]; my @ato = @p_list[int($size/2)..$size-1]; # 結果表示テスト print Dumper([\@mae, \@ato]);
俺のは巨大なHTMLだとメモリが死ぬ
安全策なら
>>640 >>644 まあ、そんなに巨大だったら、どっちにしろ死ぬやろけどな。w
本気で心配するならチビチビつままないと。
Ruby の、Nokogiri で、スクレイピングしてみた require 'nokogiri' doc = Nokogiri::HTML(<<EOT) <div> <p>AAA</p><p>BBB</p><p>CCC</p><p>DDD</p> </div> EOT p_tags = doc.css( "div > p" ) # div の直下のp half_cnt = p_tags.length / 2 def make_p_str( ary ) # 要素の配列から、文字列を作る str = "" ary.each do |elem| tmp = elem.to_html # 要素 tmp.chomp! # 末尾の改行を削除する str += tmp # 連結 end str end p str_before = make_p_str( p_tags[ 0...half_cnt ] ) # 前半 p str_after = make_p_str( p_tags[ half_cnt..-1 ] ) # 後半 出力 "<p>AAA</p><p>BBB</p>" "<p>CCC</p><p>DDD</p>"
Mechanize とか、curl + Nokogiri でも、静的なページなら、DOM を取得できるけど、 Ajax など、JavaScript で、動的にDOMを組み立てている場合は、 sleep するとか、Selenium WebDriver などを使わないと、DOMを取得できない 5ch などは、空のHTMLを送ってきてから、 Ajax で、ページの内容を取得しているから、 HTMLをスクレイピングするだけでは、タイミングによっては内容が存在しない
Ruby で、curl, Nokogiri の例
require 'nokogiri'
html = `curl
http://www.example.com/ `
doc = Nokogiri::HTML( html )
elements = doc.css( "h1" )
puts elements.first.content #=> Example Domain
open-uri の例
require 'open-uri'
require 'nokogiri'
url = '
http://www.example.com/' doc = Nokogiri::HTML(open(url))
プロテクトのつもりは無いんだろうけど、機械にやさしくない 最近だとメルカリのページ取得して、なんで空? と思った
Selenium WebDriver なら、指定した要素が出現するまで、指定した時間だけ待ってくれる 漏れは、10〜20秒ぐらいを指定してる
webであれこれしたいなら、javaが近道なのは自明だな
逆にPerlできないことってなんだ? ライブラリは揃ってるものとして
あんまりない 弱いのはライブラリ面なので言語的に不足してる機能はそれほどない
なら、C++があれば他の言語は要らなくなる。 さらに極言すれば、アセンブラがあれば他の言語は要らなくなる。
GUIは弱い。 まあ強いと言っていいのはC#くらいだから、しゃあない?
返信が遅くなってすいません
>>640 ,643,646
勉強になりました
ありがとうございました
GUI必要なツールはC#使うけど、CUIだけとか引数もなくて単に実行するだけとかそういうのだいたい全部Perlで書いてる
GUIって結局、裾野の方々でも使えるようにする工夫であって、 テキストエディタで条件設定した方がよっぽど効率いい場合が殆どなのでは 自分専用ツールでGUIで作った記憶がない
>>661 スマホのアプリはテキストエディタを使うのが主流か?
スマホのは作ったことすらないけど、 CUIなんて選択肢がそもそもあるのか?
>>661 だからなに?
ああそう、とかいってほしいの?
GUIが必要ないものはPerlでって話でしょ
これに噛み付いた
>>661 が意味不明
噛みつかれた、と思っちゃうのが糖質なんだよな 書き込みがみんな攻撃に見えるっていう
>>653 だってJavaとPerlでスマホのGUIを比べるのがどうかしてる
>>667 わけがわからなすぎるからな。
攻撃に見えてもしゃあない。
オレには隙自語に見えた。
で、本人はどういうつもりなの?
そうだねでいいんでね おれもそう思う GUIがあった方がいいなって時はつければいいし
あー。PerlでスマホのGUIか。書けたらいいな。 ていうか世界は広いからとっくの昔に誰かが作ってそう。
Perl(パール)[Pathological Eclectic Rubbish Lister] Google翻訳[病理学的折衷的なゴミリスター] どうしてこうなった?
perlのguiといえばTk, Tkx, wxWdget, Qt, GTK …色々あって やろうと思えばやれると思うけど。 オレはPerlではTk, Tkxしかやったこと無いけどさ
>>677 「病理的に異常な妥協を寄せ集めたゴミくずリストを作るものです」と?
処理が終わったらwindowsにポップアップを出すくらいでいいわ
>>676 同感
適材適所
Perlは高度なバッチ処理が適所だと思う
やれるというのと、それを目標に人が集まってくるのは別 rubyのrailsとかpythonの機械学習とかみたいに、 GUIの為にperlを覚えたような奴を見たことない
GUIのために言語を選ぶ? 少なくともperlにおいては、そんなことないだろJK
>>682 そんなに出来のいいものではなかった記憶。
Tk自体も、Perlとのなじみかたも。
CでXを直接使うよりはマシに違いないが。
>>682 その前にWindowsのGUIの方が普及しただろうが
あれはperlで書かれていたのか?
馬鹿は黙っていればいいのに
もはや何の話題だかわからん罠 CGIでPerlを使う話からどうやったらこんなカオスが生まれるのか
Microsoftが卑怯な手段を使ったから普及したのでは?
Microsoftがどうこうというよりも、ほかがどんくさかっただけやろ。 Windowsは、メッセージループとかコピペとか、最初からけっこうこなれてたような。 どっちも、今ならあんな仕様にはきっとしてなさそうな気はするが、当時としてはなかなか。
で、GUIと言えばperlと言われたのはいつの時代のどのアプリやOSなのかね 個人的な思い込みではなく
そういや Perl/tk はその後日本語対応うまくいったのかな? 最初使った時にダメでそれ以来使ってないのだが。
perlはモジュールの品質が悪すぎたな どうにでもかけすぎた上にperlのオブジェクト指向きつい感じ
オブジェクト指向は万能じゃないからな ライブラリを効率的に使い回す方法をあれこれ模索してたら、 名前空間の衝突を積極的に使う方法に行き着いて、 いろんな型を統一的に扱えるように書けるようになったら、 これ何も知らない人から見たらただのオブジェクトだよなということで出来た 最終的なものに付けた名前であって、最初からオブジェクト指向を目指した訳ではない そこからオブジェクトなんだったらどうせだからと、面倒くさい宗教に変わっていってしまった だから、大層なものである必要は全然なくて、メンバーとメソッドが使えるだけで十分便利
データ(オブジェクト)を中心に処理を考えるみたいなのが発展してオブジェクト指向になったのでは? どう発展して来たかは今更どうでも良い話だが。
オブジェクト指向でやるようなアプリはPerlでやるべきではないと思ってる Perlはバッチ処理一択
別にOOPで作りたいならPerlでいい。
Perlは文字列を扱うスクリプトで本領を発揮するもんだけどね。
>>770 そもそも動的片付けの言語でOOPはクソだと思ってるわ。
膨大なライブラリはオブジェクト指向のお陰なのに 小規模なダクトテープ的な処理しかしない人には不要だろうけど
>>703 ライブラリはその通りだった…
ただメインモジュールを上位でオーバーライドしてどうのこうのとか
そういうのはいい思い出無い
>>703 Perlでダクトテープ以上のものを作ろうとは思わないから。
ま、しゃーない。
普段は過疎っているクセに誰かが質問を書き込んだ途端クソどうでもいいヤジ馬(質問には一切答えられない)がわらわらと湧いてくる
数日前からLWPでhttpsにつながらなくなったんですが、verify_hostnameを無効にするとつながります Windows 10、straberry perlなんですが、Windows側の証明書の問題とかあるのでしょうか? Mozilla::CAなど関係しそうなモジュールは最新にしてみましたが、改善しませんでした
>>709 直るかもしれないけど、また何かが更新されてダメになるよね
ほかにないですか?
証明書関連なんだろうけど、サーバの証明書が悪化してしまったのでは クライアントとしては無視しないといけない状態に
Let's Encrypt みたいな無料の証明書を使っているサイトかも。 そういうサイトが多い 証明書の期限切れ
>>708 特定サイト(接続先)の話でしょ?
そのサイトの証明書の期限切れだと思うよ
レスありがとうございます 特定サイトではなく、また、ブラウザでアクセスできてLWPではできないという状況です その後、セキュリティソフトにESETを使っているのですが、 ESETにブロックされていることが分かりました Mozilla::CAの証明書が気に入らないのか、ESETの不具合なのか.. どちらかが更新されるのを待ちたいと思います
別にブラウザ作ってる訳でなし どのサイトでも、ではなくて単に、複数の特定サイトでしょう
確かにgoogleやyahooは大丈夫です twitterはダメですが、こんな所もオレオレ証明書なんですか...
chocolateyでwindowsにstrawberry perlいれてたんだけど upgradeしたらアンインストールされてインストールでこける すでにインストール済みだとか、でも実態はアンインストール済み どうすればいいのか
木こりが明日のためにと残しておいた大木が次の日になったらどうにも見つからない 来る日も来る日も探すけれどどこだったか思い出せずとうとう10年の月日が過ぎてしまった そこで木こりは思い直してその辺にあった木を切り倒したそうだ 「はっ!?」木こりはようやく気付いた a.「木なんてみな同じ」 b.「理想を追い求める自分に酔ってた」 c.「Windows入れ直せ」
Strawberry Perl 5.32.0 入れたんだけどcpanでinstallコマンドを使うとperl.exeがCPU消費したまま戻ってこなくなる現象が起きるね。
今までになくTkをインストールするのが大変だった、5.32.0。 ソース改変してcpanの外でgmake & gmake installせざるを得なかった。 さっさと修正してほしい。
こんな過疎ったクソスレだけど、たまにやって来る質問者をガヤが追い出そうと必死になるんだよな 頭の中どうなってんだろ
すいません、あるサイトの記述で下みたいな構文なんだけど $aiueo = [AAA =>123,BBB=>345]; 変数は変えてあります ハッシュのリファレンスとは違うようなんだけど何をやってるかわかりますか? それと、この構文で123をprintで表示してみたいのですがどうやればいいのでしょうか
$$aiueo{AAA} $aiueo->{AAA} だっけ?
だね。配列のままなら print $aiueo->[1];
配列() のリファレンスが [] ハッシュ() のリファレンスが {} というややこしい部分に引っかかって間違って書いてるだけと予想
教えて下さい。Windows10 で、ActivePerl 5.20.3 (Win32-x86) を使っています。「use blib;」の一行だけのスクリプトを実行すると、 次のようなエラーが出ます。 Cannot find blib even in C:\ BEGIN failed--compilation aborted at C:\bin\blibtest.pl line 1. しかし、C:\Perl\lib には、blib.pmというファイルがあり、 @INCには、C:\Perl\lib が含まれています。 blib を使うためには、どのようにすればよろしいでしょうか?
>>735 ありがとうございました。
しかし、環境変数PERL5LIBを使っても、同じでした。
Cannot find blib even in C:\
BEGIN failed--compilation aborted at C:\bin\blibtest.pl line 1.
C:\doc>set perl5lib
PERL5LIB=C:\Perl\lib
>>734 ですが、
そもそも何をしたかったのかということも書いておきます。
Windows の名前付きパイプを使おうとしており、このページ
https://metacpan.org/release/JDB/Win32-Pipe-0.025 にあるサンプルコード(test.bat、Client.pl、Server.pl)
を実行すると、Cannot find blib even in C:\ とのエラーが
発生しました。
そこで、問題を単純化して、
>>734 を書きました。
blib.pmはカレントまたは指定したパスから数レベル上まででblib/libとblib/arch両ディレクトリが存在したら@INCの先頭に追加、無ければエラーで終了するだけのモジュール 該当ディレクトリが無かったからC:\にたどり着いたというだけ Active PerlはWin32::Pipeバンドルされてたはずなのでblib不要
>>739 よく解りました。ありがとうございました。
blib.pmはちゃんとuseされていて、blib.pmの動作としてエラー終了したということですか
die "Cannot find blib even in $dir\n" って blib.pm のソースに思いっきり書いてあるがな
ライブラリが読めてないのか、読めてるけどエラーになるのかの切り分けが必要だったな
あ、でもやってみたら@INCにない場合とメッセージ違うんだな。 とはいえ知らないと分からないよね。
>>747 ブラウザを遠隔操作することだろうね。
昔、Win32::IEAutomation 使っていたけど、
今はどんなモジュールがいいのかよく解らない。
>>747 Linux とかなら wget または curl コマンド。
Windows は知らないけど探せば同じコマンドあるんじゃないかな。
それとかPowerShellだと何かないか?ありそうだよな。俺知らないけど。
難しいのう firefoxから証明書をエクスポートして食わせてwgetしてもまだ成功しない
Ruby では、open-uri でHTML を取得して、nokogiri でスクレイピングできる。
または、begin〜end 内に書いた、curl コマンドでも取得できる
他には、wget や、VSCode の拡張機能、REST Client とか
require 'open-uri'
require 'nokogiri'
=begin
html = `curl
https://example.com/ `
doc = Nokogiri::HTML( html )
=end
url = "
https://example.com/" ;
doc = Nokogiri::HTML( open( url ) )
elements = doc.css( "h1" )
puts elements.first.content #=> Example Domain
Windows 10 には、curl.exe も入っている。 これは、PowerShell のcurl エイリアスとは異なる コマンドプロンプトで、 where curl C:\Windows\System32\curl.exe
LWP::Protocol::https
がインストールされていれば
$url = "
https:// …";
require LWP::UserAgent; # with LWP::Protocol::https
$ua = LWP::UserAgent->new;
#$ua->agent('Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko');
$s = LWP::UserAgent->new->get($url)->content;
そこはマジで面倒だなと思うね pythonのrequestsモジュールとか何も考えずにできるし
今ならコアモジュールのHTTP::Tinyで十分でしょう IO::Socket::SSLかNet::SSLeay をインストールする必要がありますが pythonだってrequests
Ruby なんて、よく使うものは、標準で入っている Battery Included・電池付き言語
>>762 Rubyとかプログラム言語よりも「読点(、)」の使い方を学んだほうがいい
自分の書き込みを声に出して読んでみるとわかるよ
読点の使い方に決まったルールは無いんだよな なんとなく集合的に多数派の使い方はあるけど、 それを気にしてる人しか身につかないし、 気にしてない人はどういう使われ方をしてても何も思わない 多数派の使い方から外れると何か困るかというと、特に困らない 気にしてる人だけなんか変と思うだけで、意思疎通に支障は無い 気にした方が負けという悲しい現状がある
そもそも言葉がそういうものだろ だからかまわないというのは極論 というかそういう話もrubyも該当スレでやってくれ
読点は、基本的には使わない 意図的に区切りを入れたい箇所で使う 区切りを入れる目的がいろいろあって、それが理由で明文化できない 一旦間を置くことで強調することができる 主節と従属節を明確にできる 誤読を防ぐ 読みやすくなる、等々 より良い文章を心がけている人しか読点はそもそも必要ない 自分は、文節の区切りが漢字で連続しているあるいはひらがなで連続している時に、 読みやすさの為に入れることがよくある
読点ふつうに使った文章でそれ言われても説得力ゼロやんな
普段文ではあんまり使わないかな 空白を使うようになった てか。もあんまり使わない。改行するようになった。 これ最近の傾向ね。 ちゃんとした文章の時は学校で習ったようにちゃんとするよ。 たまに見かける、多用の文章はバカっぽくて好きになれない。
お前ら得意のうんちく・知ったかで生き生きしてるな どうでもいい話題になると湧いてくるのな
Perl好きの住人がいるんだよ。 なんかネタがあると湧いてくるが自分からは投入しない。 というか今更ないんだよな。
LWP::Protocol::https はインストールしなくても入ってるみたいだけど、 やっぱりアクセスできない
>>770 かつてのPerlハッカーたちが完全に沈黙してるからね
Rakuとかもっと使えよって思います
IO::Socket::SSLかNet::SSLかが入ってないんじゃね?
入ってなかったら入ってないというエラーになるんじゃないのかな プロトコルのエラーになるんだよな
>>772 Perl6できたてのころにちょっと試したけど、スクリプト言語的な使いやすさがなくなってたからなあ。
きっと普及せんやろな、と思った。
Strawberry Perl 5.32 向けのTk、相変わらずビルドエラーを手動修正しないとインストールできない。 バンドルされているコンパイル環境の問題かもしれないけど、そのままってのはちょっと。 Tkって重要じゃね?どうよ?
>>775 ほんのちょっと改善するだけでも十分だったのにな
>>777 いや、大きな追加機能自体はおもしろそうなんだよ?
Grammarとか。
また、識別子にハイフンが使えるとか、トークンの区切りが原則はスペースとか、文法も興味深いかわりに、ほかと違いすぎて。。。
>>778 grammarは一見良さそうだけど字句解析と構文解析を同時にやる感じですげー難しくない?
字句解析と構文解析は、表を使ったアルゴリズム自体は同一なので、一つの表にまとめられる。 しかし、分離できる場所で分離した場合に比べて表が大きくなるので、あまりお得じゃないと思う。 もちろん数ギガバイトのメモリーを積む現代のコンピュータでは、100メガバイトの表は決して非現実的ではないけれども。 ドラゴンブックが書かれた時代には、分けなければ実装できない程度の大きさだったと思う。
>>779 いやー、ちゃんと使ってみたかった。
難しいならそれを体感したかったな。
lex/yaccのめんどくささは知ってるけど、あれよりはマシやろ。w
C#のSpracheみたいなもんじゃないの?
>>774 例えばlwp-downloadとかでもアクセスできない?
>>781 アルゴリズムが違うからなんとも言えんが
バックトラックしないのでカーソルの位置を常に意識しなきゃいけないのがすごくキツい
あこれマッチしないの?ってことが多々あって慣れなんだろうがキツい
デバッグも大変
Perl5のParse::RecDescent.を使えれば Perl6のGrammarも大丈夫だと思う 多分
Raku の Grammar というのは、「クラス定義+演算子のオーバーロード」 と比較して、何が優れているのだろうか?
えっ。 ターゲットというか、適用領域が違うんでは。
処理済みかとか、除外対象か、みたいなチェック用に %except = (aaa => 1, bbb => 1); みたいなテーブルを作っておいて、 if (!$except{$x}) { ... } みたいなことをする で、=> 1 の部分は何でもいい訳で、これが無駄に見える @except = (aaa, bbb); の方が自然だけど、判定部分が複雑になる なんとか判定をシンプルに書けないものか
リストを使用してのケースなら " @except " =~ / aaa / とか。
でもハッシュの方がよくないかなあ。 %except = map { $_, 1 } qw(aaa bbb ...); とか undef $except{$_} for qw(aaa bbb ...); で判定はexists とか
>>788 無駄に見えるのは気のせいなので、気にするな。
何が気に入らないのか、意味不明なレベル。
せいぜいが判定をexists()に変えるくらいか。
でも、処理の意図は明確になっても、記述量は増えてまう。
結局、もとのほうがいい。
pythonのin演算子を真似た関数を用意するくらいか
ここの人ってpythonもできるの? pythonを最近覚えたんだけど、pythonで書き始めてからperlに戻る気がしないw
常にuse strictで書いてるような人はpythonの方がいいかも 危険を承知でとにかく楽に、という書き方がpythonはできない
>>793 pythonも書いてるけど感覚としてはそこまで差はない
pythonの方が厳格ですぐエラー吐いてくれるから
それを良しとするか
あとはライブラリの質が段違い
デフォルト以外のブラウザを開くことはできませんか? デフォはこれでいけてます use Win32::FileOp qw(ShellExecute); ShellExecute($url);.
例えば、デフォが他のブラウザで、あるurlをFirefoxPortableで開きたいとき、
次のようなコマンドを実行させているが、これをPerlでやればいいんじゃないの?
"U:/FirefoxPortable/FirefoxPortable.exe"
https://foo/bar/ ありがとう `C:/Program Files (x86)/Google/Chrome/Application/chrome.exe` とりあえずここまででchrome開くことはできたのですがURLの指定はできないでしょうか?
system("\"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe\"
https://www.yahoo.co.jp/" ;);
完成しました
ありがとうございました。
>>800 wperl.exeからsystem()を呼び出すと新しいコンソールウィンドウが開くので要注意。
指定した年月日からx日後の日付を数で得るにはどうするのが一番楽だろう
「数で得る」というのがよく解らないが、timelocal()とlocaltime()を使えば、 多分、やりたいことができると思う。
これから仕事ではじめてperlを使うんだけど、メッセージやメール出力などにマルチ言語対応が入ってる resourceに言語ファイルをいれる形で実現したいけど、どのようにするのがいいか教えて下さい 複数のスクリプトを開発して連係させる予定
ヒアドキュメントの中で数式を使うやり方は? @{[数式]} のようにやってもエラーで動かなかった
>>802 Ruby on Rails なら、時刻計算用のライブラリがある
require 'active_support/time'
p Date.new( 2020, 2, 28 ).advance( days: 2 )
出力。うるう年
Sun, 01 Mar 2020
そんな感じの気楽で使いたい $date = date->new('2020-12-05'); $date += 100; ($y, $m, $d) = ($date->year, $date->month, $date->day); こんなん
>>805 おかしいな。それで合ってるように思えるんだが。
この辺りを読んで、何か誤解してないか確認したらいいかも。
https://perldoc.jp/docs/perl/5.26.1/perlref.pod 「perl 時刻 計算」で検索すれば? 日付・時刻を扱う標準モジュール、Time::Piece が標準で添付されています。 もっと便利なモジュールを、誰かが作っているかも
localtimeからスタートする時はそれが便利 何か基準の日付から計算しようとすると面倒になる
>>805 数式自体にエラーがあるんやろ。w
じゃなきゃエラーをはれ。
>>811 print <<"eos";
@{[print "aaawww";]}
eos
これでエラーだった
>>812 だからエラーの文面をはれっつーの。
でも、わかった。
「[]」の内側に書けるのは、式のリスト。
最後に「;」を書くのは、「式」でなく「文」というか。
しかし、それだとうまくいっても「aaawww1」と表示される気がするが、どうなの?w
print <<"eos"; @{[print "aaawww"]} eos $ perl aaawww.pl aaawww1 ;を省くと動くが、「1」とか余計なものがつくな
>>813 CGI 実行エラー syntax error at test.cgi line 10, near ""aaawww";"
Execution of test.cgi aborted due to compilation errors.
単なる構文エラー 無名リストの中に裸のセミコロンがあったらまずいでしょ ["A", "B", 3, ";"] OK ["A", "B", 3, ;] エラー 余計な1じゃなくてprint関数の返り値 printが成功したので真(1)を返して無名リストの要素になった printで"aaawww"が表示された後デリファレンスされて展開された1がヒアドキュメントで表示される
>>814 仕様どおり。w
記述したとおりに正しく動作しているな。
>>802 今更だけど日付をエポック秒で表して日数×24*60*60を足すんじゃだめ?
車輪の再発明というかただの製作を承知で、自分で日付変換の関数を一通り作ったらそれで十分だった
便利そうなライブラリを探そうとしたこともあるけど、オブジェクト指向的なやつだと結局その
オブジェクトを介した変換が頻出することになってスラスラ書けないなあと思ったのです。
もし今後UTCとかJSTとか出てきたときはそのときまた考える。
PerlのYAML関連のモジュールが全部重くて厳しい 高速なYAMLモジュールはないのか?
>>803 だが、
>>802 の質問は
>>803 で終わったと思ったのだが、不親切だった?
例えば2019年12月1日から365日後の日付は、次のようにすれば得られる。
use Time::Local;
$year=2019;$mon=12;$mday=1;$hours=12;$min=0;$sec=0;
$intvl=365;
$basetime = timelocal($sec, $min, $hours, $mday, $mon-1, $year-1900);
$basetime += $intvl*24*60*60;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($basetime);
$mon+=1;$year+=1900;
print STDERR "$year.$mon.$mday\n";
$basetime = timelocal_nocheck($sec, $min, $hours, $mday+$intvl, $mon-1, $year-1900);
Time::Piece はよくできてて、何かのログとかに現在時刻を書き出す、 とかの用途には十分に使える でも、時刻計算や日数計算はあまり考慮されていない 現在時刻からの計算はできても、任意の時刻からだと弱い
>>807 use Time::Piece;
use Time::Seconds;
my $day = Time::Piece->strptime('2020-12-05', '%Y-%m-%d');
$day += ONE_DAY * 100;
print $day->date, "\n";
print $day->year, "\n";
print $day->mon, "\n";
print $day->mday, "\n";
まあ、strptime さえ目を瞑れば こんなもん、何か見ないと書けない
use POSIX; を宣言してCの標準関数に似た時刻処理機能を使うのが普通じゃないの? Cの時刻処理サンプルコードを円滑にPerlに移植できるよ。
>>826 DateTimeモジュール使えば全て解決なんだが
クソデカくて重いという弱点が
Time::Pieceの弱点は strptime()で作ったインスタンスのtimeゾーンをいじれないとこかな? 後1つなんか弱手あった気がするが忘れた
strptimeはpythonでもrubyでも同じだから、もう慣れなんだろうな 'YYYY-MM-DD' とかではあかんかったのか
>>821 timeLocal()の年は1900引かない方がいいよ。これちょっとCのライブラリとは違うんだよ。詳しくはドキュメント読んで。
すみません、ソートで教えて欲しいんですが下記のようにみたいな枝番号が付いてる文字列をハッシュのキーとして ハイフン前の数値でソートした後にハイフン後の数値でソートしたいのですが 普通に$a <=> $bだとハイフンの後の値がバラバラになって上手くいきません キーを作る際に別々に作ってループ増やすくらいしか自分には解決方法が無いのですが、スマートに出来る方法は無いのでしょうか? 1-1 1-2 2-1 2-2 3-1
>>833 シュワルツ変換で検索!
たとえば :
mapでソート用の値として、前の数字×10000+後ろの数字の値をつくって、それともとの値のペアにする。
それを<=>でソートする。
mapで、ソート結果からもとのデータ部分を取り出す。
要は、map{...} sort{...} map{...}となる。 変換のためのループが2回入る(map)が、記述としてはあっさりなので、特殊なソートをしたいときにはよく使われる有名な方法。 伝わるかな?w
それで書けるなら、sort { } でも書けるよね
>>833 こんな感じかな。デバッグはしていないが。
@newlist = sort compare @oldlist;
sub compare{
my ($ap, $bp) = @_;
($ap1, $ap2) = $ap=~/([0-9]+)\-([0-9]+)/;
($bp1, $bp2) = $bp=~/([0-9]+)\-([0-9]+)/;
return 1 if $ap1 > $bp1
return -1 if $ap1 < $bp1
# $ap1 == $bp1;
return 1 if $ap2 > $bp2;
return -1;
}
>>836 ,
>>837 それだと、要素の比較のたびに、値の変換処理が行われる。
比較は何度も行われるため、変換処理が軽くない場合、ソート全体としてかなり重くなりうる。
すくなくとも「スマート」とは言えない。
そこで、変換結果をキャッシュするような形になるのがシュワルツ変換。
知らんならググれ。
sort { s1($a) <=> s1($b) } keys %x; sub s1 { shift =~ /(¥d+)-(¥d+)/ && 100*$1+$2 } sortならこんなかんじ
順番が変わるだけで処理量は変わらんでしょう どっちにしろ重い 次にソートする時はソート対象が変わっているんだから、キャッシュできない 有効な局面もあるんだろうけど、今回に関してはトリッキーなだけでメリットがない
次のソートじゃなくて、1回のソート内部の複数の比較に対してか あー、確かに速くなりそうな気がする 処理系が気を利かせて変わらない気もする
>>841 ソートの内部処理が想像できんのか?
もとの並び方にはよるが、ふつうは大きく異なる。
「処理系」とやらが気を利かせられる範疇ではない。
比較処理にsayでもいれて試してみろっつーんだよ。
内部の話だからsayでは判らんだろ 関数で評価しないといけないと判っていて、動的に処理する必要も無いんだから、 評価済みのテーブルを内部に持たせようというのは自然な発想
>>843 試してから言え。
きっと、想像以上の出力が出てきて驚くから。
判ってないのかな 処理速度に配慮した処理系があっても不思議ではないという話 手元で試して遅かったとしても、全ての処理系に対する証明にはならない
そもそも重いかどうかが疑問で、どっちでやっても一瞬で終わるのが普通 それなら読みやすい方が優れている 重くて困ってから対策を考えればいい
map { $_->[0]; } sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2]; } map { [$_, /(\d+)/g ]; } 読みにくい…かなあ?
別に短く書かなくていいんだよ @r = sort s2 @a; sub s1 { my $str = shift; $str =~ /(\d+)\-(\d+)/; return $1 * 100 + $2; } sub s2 { return s1($a) <=> s1($b); }
>>848 おまえ、ハードな処理を実装したことがないやろ?w
慣れたPerl使いはわざわざ
>>851 みたいなコードは書かない。
遅いし、くどくて逆に読みにくいからな。
>>850 C#でも、タプルが使えるようになったので、似たようなコードは書く。
LINQなぶんだけPerlより読みやすいけど。
ハッシュテーブルにs1($val)の戻り値を保存して、そのハッシュテーブルを使って比較関数を呼び出すとかするのが普通でしょ。
読みやすい優れたコードが
>>851 か。
自分のコードを出してくれた点は評価するが
$1 * 100 + $2
って何?
考え方は同じだけど最初からソート用の値をデータに持たせてみる。 my %x = ( '3-1' => ['e', 301], '1-2' => ['b', 102], .... , ); sort { $x{$a}[1] <=> $x{$b}[1] } keys %x;
複数キーでのソートに帰着させるべきなんだろうな 1-1-1 も許容する、とかになった瞬間に破綻する
sub s1 { my @a = split /\-/, $a; my @b = split /\-/, $b; my $dim = @a > @b ? @a : @b; for my $i (0 .. $dim) { my $cmp = $a[$i] <=> $b[$i]; return $cmp if $cmp; } return 0; }
>> 833 には数値の値域については何も書かれてないんだから 勝手に想定しない方がいいと想うよ。 どうしても比較を簡略化したいなら pack 関数で数値を全部 ビッグエンディアンで並べればいいんじゃないかな。
>>860 最初から想定されてるのでなければ、ひどい仕様変更なんだから、実装変更もやむなしやろ。
数字じゃなくてアルファベットにします、と言われただけでパーやし。w
>>862 勝手に想定するのもあたりまえ。
じゃないと、なんにも例示できなくなるで?
値域がどうこうなんか、自分でなんとでもすればいいだけ。
本題のソートには関係ない。
1-1があるなら1-1-1もあると予測するのは自然な拡張 1-1-1-... に無限に対応できるように作っておいて、 その特殊ケースとして要件を満たす、で十分 アルファベットにも対応するのは次元が違う
>>864 こういうひとがコーディングすると
バッブァオーバーランとか起こしてセキュリティに穴を開けるんだな
>>866 アホなの?
他人のコードのバッファオーバーランなんか知らんわ。
自分で責任を持て。
普段は過疎ってるのに少し書き込みがあるとクソ雑魚が湧いてきてグズグズ文句たれる 頭の中どうなってんだろうな
>>837 だが、実は、このコードは、オレが実際に、数字とかアルファベットとかが
複雑に絡んだ文字列を、ある規則に従ってソートするために作ったものを
流用したんだ。だから、応用範囲が広いという点では、これがいいと思うけどな。
>>870 にしたって、超激遅やで?
要素数が充分に少なきゃええけど。
どう見ても章のタイトルとかそんなんなので、1000も無いよ 高速化の工夫は遅くて困ってから
>>833 perlのsort()アルゴリズムは5,8以降マージソートになってsort結果は安定なアルゴリズムなので
手短にコードを書くなら右の数字でsortしてから左の数字でsortすれば所望の結果が得られる。以下サンプル実装
use List::Util 'shuffle';
%h = map{$_ => $i++} shuffle qw{1-1 1-2 1-3 2-1 2-2 2-3 3-1 3-2 3-3};
use feature qw{say signatures}; no warnings experimental;
@k1 = keys %h;
say "@k1";
sub f($s) { [$s =~ /(\d+)/g, $s]};
@k2 = map{$$_[2]} sort{$a->[0] <=> $b->[0]} sort{$a->[1] <=> $b->[1]} map{f $_} @k1;
say "@k2";
実行結果
~ $ perl 64_833_n-n_sort_1.pl
1-1 2-3 3-3 1-2 3-1 2-2 2-1 1-3 3-2
1-1 1-2 1-3 2-1 2-2 2-3 3-1 3-2 3-3
言語処理系内部のsort()関数のアルゴリズムに依存しない書き方がしたいなら
左と右の数値で二段階のソートをするか、右の数字と左の数値で順位に一貫性のあるキーを作って
一段階のソートで済ませる方法もあると思う。
そういったサンプル実装を見たいのであれば、時間があればくけれども…
つか、実は Tie::IxHash を使ってhashに登録したデータの順番を維持して取り出せれば いいだけの話だったりしてな。しらんけど
>>876 Perlでバッファオーバーランを実装する方法を教えてください。w
バッファオーバーランつまり out of range なんてすぐ起こせるでしょ。
pack に誰も食いついてこないのはちょっと寂しいな。 正しくやれば C でさえ 1 回の memcmp で比較が済むのだが。 ましてや、Perl の pack/unpack は Perl4 の時代からある超便利関数なのだが。 まあ、「ひょっとして比較をシンプルにしたいのかな?」と思ったから書いただけだし 今回のニーズには合ってても万能というわけではないし 自分が良いと思う方法でやればいいと思うよ。
数1つあたりのbit数が決められないがな 何とかしてmap使いたいから無理筋言ってるだけとしか
>>833 >>874 に書いた左の数字と右の数値両方で順位に一貫性のあるキーを作って一回でsortするサンプル
数値は4桁以下であることを仮定してます。
use List::Util 'shuffle';
%h = map{$_ => $i++} shuffle qw{1-1 1-2 1-3 2-1 2-2 2-3 3-1 3-2 3-3};
@k1 = keys %h;
print "@k1\n";
@kk = map{[sprintf("%4d%4d", /(\d+)/g), $_]} @k1;
@k2 = map{$$_[1]} sort{$$a[0] cmp $$b[0]} @kk;
print "@k2\n";
こうやって幾つかコード書いてみて…
>>849 かTie::IxHashで十分な気がしたわw
>>881 慣れたヤツには最適解過ぎ、慣れてないヤツには意義がわからん、ということで、そんなに食いつきようがないやろ。w
>>833 もしそれが桁数固定で、例えばその例のように一桁の数、ハイフン、一桁の数という文字列ならば、何も考えずにそのまま文字列として比較して sort すればいい。つまりただ sort するだけ。
そんなもんは9で終わる訳がなくて10も100もある筈、と自然に拡張して考える それと同様に、枝番号ならサブサブセクション以降もある筈、という拡張は 自然なのに、そっちには思い至らないんだよな
>>887 外野が考えることじゃない。
>>886 は、簡単なケースの例を言ってるだけだから、それでええやろ。
「数値でソートしたい」って最初から書いてあるだろ……
今だけはいいけどすぐに駄目になりそうな設計を、 裏技見つけたみたいにやりたがる奴がいるんだよな ユーザは予想を超えた無茶をしてくるものなのに
よい設計というのは自然とシンプルになるものなんだよ
sub Schwalts { @tmp = @_; @tmp = map { [$_, /(\d+)/g ] } @tmp; @tmp = sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] } @tmp; ( map { $_->[0] } @tmp); } を短く書いたのがシュワルツ変換だよ くらいの説明はした方がいいのかな。
最近raku触ってるけど面白すぎるわこれ、識別子をパース?して組み合わせるの楽しい もうこれ半分lispだろ
演算子の前後に空白が必須なの、なんかイヤじゃない? ツメツメで書きたいのに。 Perl6のころだけど、オレが降りた理由のひとつ。
>>895 面白いんだけどね
他の言語では無いような機能のオンパレード
ちょっと先を行き過ぎてる感が強すぎるかなあ
言語なんて、他の言語のいいとこ取りで進化していくからな 常に便利になった部分と実験的な部分がある
ローカルで一番最初にperlの呼び出しの部分は#!c:/Perl/bin/perl.exeって書くけど サーバーに上げるときは毎回#!/user/local/perlというように書き直すのがめんどうだけど #!/user/local.perlのまんまでもローカルで動かす方法ありますか?
あれ? /usr/local/perlのままでもいけるんじゃないの? Windowsはそこのパスを見てなかったような。
Apacheは見てる そんでApacheのあるドライブにuser/localのフォルダ作ってperl.exeをコピーしたら動くよ
そうだっけか? ちなみに、もしそのファイルに拡張子があるならレジストリで指定する方法もある。 「windows apache レジストリ 拡張子」で検索!
perlプログラム中に指定するルートパスについてだけど open(IN,"/test.html"); my @lines = <IN>; print "@lines"; close(IN); とやっても@linesは空で何も取得できなかったけど print "<a href=\"/test.html\">リンク</a>"; でリンクをクリックするとちゃんとドキュメントルート直下のtest.htmlに飛べる これはどうしてか? test.htmlの中身は空ではない
>>903 ファイルシステムのルートとドキュメントルートはまったく異なる。
ファイルシステムはプログラム自身が処理するが、URLはまずブラウザが解釈する。
まず落ち着いてよく考えろ。
>>904 つまりperlプログラム中で指定する/test.htmlはファイルシステムのルートパスになり
リンクタグで指定する/test.htmlはドキュメントルートのパスになるということですか?
>>905 わかってるやん
レスコジキなら他に行ってくれ
初心者が嫌いな「上級者」で過疎っているほうが落ち着くなら、このスレがいいな。
【Perl上級者コーナーPart01】
http://2chb.net/r/php/1024741312/ >>907 わかってるとはいえんよ。
結果のおうむ返しだけみたいだからな。
落ち着いて考えればわかるはずだし、それでしっかり納得したほうがいいことだから、元コメに返事はしないが。
ブラウザのクッキーを許可してるかどうかを調べるにはどうしたらいいんですか? クッキーを書き込めたら許可されているというやり方だと 書き込んだ直後はクッキー読み取れない 更新ボタンでページを更新しないとクッキー読み取れないので他のやり方で
お、今年初めの質問だね。 君の悩みは質問箱住人が解決するよ。 ささ、甘酒どぞ。つ甘 みんなーお客さんだよー。
>>911 javascript併用したくないならHTTPヘッダで
print "Set-Cookie: hoge\n";
print "Location: hage\\n\n";
みたいな感じでクッキー書いてリダイレクトすればいいんじゃね
>>913 なるほど、でもそれ無限ループにならないっすか?
>>914 サーバーで判定したらええやろ。
そもそもそういう話のはず。
U+10000からU+1FFFFまでの文字があったら置換したい時はどう書けばいい?
あー U+10000という文字列を置換したいのではなく、それが示すサロゲートペアを置換したい
>>920 s/([¥x{10000}-¥x{1ffff}])/unpack(q{U},$1)/eg
かな?
ダメな気もするが。
つーか、さっきのURLにいろいろ書いてあるから、一度目を通して自分で試してみろ。
んで、うまくいったら、結果を貼るようにな。
$line =~ s/\x{1f306}/置/g; これは成功する $line =~ s/\x{1....}/置/g; こんなことをやろうとしてた $line =~ s/[\x{10000}-\x{1ffff}]/置/g; これが正解だった
Perlの場合、マルチバイト文字で正規表現を正しく使うには、あらかじめEncode::decode()でデコードしておく必要があるので厄介。
>>923 Perlに限らんやろ。
エンコーディングをまったく気にせず対応している処理系なんか存在しない。
start:aaa1 end:bbb1 value:1.23 start:aaa2 end:bbb2 value:2.34 … データとして上記のようなstart,end,value値が違うデータがだらっと繰り返ししてるファイルがあって 下記の正規表現で名前付きキャプチャを使って繰り返しマッチングし%+ハッシュを配列に格納したいのですが、こんな感じでやるとそれぞれのデータが順に入ってしまいます。 どう書けばマッチングした各ハッシュを配列に格納出来るのでしょうか? $re=qr|start:(?<start>\S+).*?end(?<end>\S+).*?value:(?<value>\S+)$|sm; my @data = m|$re|g =~ $txt;
正規表現を使うところではない気がするな。w ちょっとおちついて、行単位で処理していけよ。
>>926 そういうもんなんですか?
pythonだとre.finditerでイタレータ毎に取れるので似たような感じにperlでもどうにか出来るんだろうと思ったのですが無理そうなら諦めます
Ruby なら、 line_num = 0 # 行番号 # 行末の改行を削除して、1行ずつ処理する results = File.foreach( "test154_data.txt", chomp: true ).with_object( [ ] ) do |line, accm| line_num += 1 # 3行毎に、ハッシュを作って、蓄積変数に追加する accm.push Hash.new if line_num % 3 == 1 ary = line.split( ':', 2 ) # 左からコロンで、2つに分割する hash = accm.last # 最後の要素 hash[ ary[ 0 ] ] = ary[ 1 ] end p results 出力 [{"start"=>"aaa1", "end"=>"bbb1", "value"=>"1.23"}, {"start"=>"aaa2", "end"=>"bbb2", "value"=>"2.34"}]
>>927 可不可の話なら、while (m/start..end/g) {...}みたいにしたらきっとできる。
しかし、オレならやらん。
Pythonは詳しくないが、たぶんそれでもやらんやろなあ。
正規表現の使いどころとしては非効率的だし、エラー対応が非現実的だし。
また、対象はファイルの内容だそうだが、ReDoSは知ってるか?
perlリスペクト公言言語だから敬意を評してるんじゃないかな、大目に見てあげよう
元がファイルだからなあ 1行ずつ分かれてるものを合体させてまた分離する、というのが無意味に見える 正規表現は柔軟性なので、使わなくていいくらいかっちりしてるものには 使わない方が安全側に倒れる 元ファイルが手書きで、無駄な改行やコメントが入ってるなら正規表現
forkがハングする。 見えてる範囲だと、memoryの使用量が関係してかもしれないです。 firefoxを使って1G程度メモリを食わせてからスクリプト走らせると、forkが返ってこなくなる。 この時のメモリ使用量は他も併せて25%程度。閉じてから再度走らせるとちゃんと動く。 エラー値返してくれたら助かるのだけど、ハングなんで困ってます。 アドバイスいただけるとたすかります。 Strawberry perl 64bit 5.32.1 Windows10Pro 64bit version 2004 Corei3-4370, Memory 12G
安定して動かないならバグっている だいたい動くけど、ごく稀に動作がおかしい、ということがforkはある forkがコケても動くような仕組みにすればok
そもそもWindows APIはfork()をサポートしてない。
>>934 ありがとう。 メモリ使用量が低いと成功。 firefoxでもタブ1枚ぐらいなら成功。 firefoxでタブ(yahoo.com)10枚開くと、確実にハング。 ラクダ本にも、失敗(戻り値undef)の対処法が書いてありますね。 WindowsOSがらみなので、イロイロありそうなのは察します。 でも、forkを呼び出したらハングして帰ってこないからなぁ。 コケるというよりは、forkを呼び出さない: if( $can_fork ) {fork;} ってな書き方が必要になってしまう。 追記: perlスクリプトとfirefoxは関係ありません。 単に、デスクトップで調べものしながら、コマンドプロンプトでperlインタプリタ を起動して作業しているだけです。連投失礼しました。
ActivePerl の Windows 版では fork() がエミュレーションされているらしい。 実際に呼び出してみるとスレッドがひとつ増える。 中ではおおかた CreateThread() でもしてるんだろう。
windowsで安定動作させたいならforkを使わずに自分で別スレッドか別プロセス立てるのが吉
>>938 perldocによると、ActiveStateとMSが頑張ったらしいよ。
エミュあつかいとのことです。
>>939 ありがとう。
スレッドでするわ・・・さすがにハングはだめだわ(^^;
forkとか再帰呼び出しとか、魔術的で楽しいけど、大抵罠にはまる
再帰はええやろ。 forkはもともとUNIX用で、Windowsとは相性が激悪なだけやから、しゃあない。
階層ディレクトリを辿る、みたいなとこに再帰を使うと止まらなくなったりする 絶対止まると保証されてるとこにしか使えなくて、そういうのは別に再帰でなくてもやれる 隅々までどうなってるか判らないものに再帰は威力を発揮するけど、 そういうのは往々にして停止性が保証されない
>>943 再帰終了をちゃんとできないヤツは、ループ終了もできないやろ。w
ディレクトリうんぬんに限って言えば、ファイルシステムへの知識が足りないとかか。
リンク系の。
軽く考えてるけど、プログラムの停止性ってもっそい奥が深い ゲーデルの不完全性定理と密接に絡んでる
tarのhオプションってよくできているよな 無限ループに陥りやすいが
再帰処理は考えてるの楽しいよな 実装するかとなると状況次第
>>947 バグが存在しない証明は超難しいから、ふつうやらない。
かわりに、テストを必要なだけする。
それだけのこと。
原理とやらは学者に任せておけばいい。
ggl先生に "perl dir tree" で検索かけたら自作ページが多いね。 安心安全鉄板ライブラリとかってあるかな? 素人考えでなんだけど・・・OS別、FS別なんてあるんかの。
親にリンクしていてループするのが困るので、 全部の子に対してカウンタを持たせる、くらいしか回避方法が無いんだよな それだと再帰でやってるうまみが無くなってしまう
>>952 リンクを不用意にたどるな。
既存コマンドでもオプションにしがちだし、ディレクトリ構成によっては死ぬくらいだから、しゃあない。
>>955 何と比べて?
no_chdirを指定したりしたらマシになったりしない?
ディレクトリならどこかにある実体のコピーだろうから、リンクなんか無しで済むけど、 より一般化したリスト構造だったら辿らない訳にいかない だから、事前にループしていないことを確認してから処理することになって、 そのテストがループにはまる
>>957 試してみたが、no_chdirは関係ない。
File::Findは、dir /S /B コマンドのパイプ読み取りに比べて、3倍も時間がかかる。
File::Findは遅いだけでなくコールバックでユーザー変数を扱えない欠点があるから、私はFile::Findを使わない。
File::FindはUnix系OSで使う場合は find コマンドのパイプ読み取りと同等か少し速い。 File::Findが明確に遅いのはWindows向けにビルドされたPerlの場合のみ。
>>960 WindowsのどのPerl?
ひょっとしてCygwin版?
ActivePerlやMSYS2版ならマシだったり?
>>961 残念ながらネイティブに最適化されているはずのActivePerl や Strawberry Perl でFile::Findが遅い。
原因は知らないけどWin32APIの使い方が良くないからだと思う。
$^WIN32_SLOPPY_STAT じゃね? File::FindはWindowsだと、SJISで全角「構」などの2バイト目が\(0x5c)のフォルダに遭遇すると 無限loopしたり誤動作するから、結局Wndowsでフォルダ階層を再帰的にたどるには utf8化したperl sourceで自分でopendir, readdirして、encode, decodeせにゃならん。
別件だがWindowsではSJISで全角「構」などの2バイト目が\(0x5c)のフォルダには perlからlstatやutimeが出来ないみたいで難儀した。 Linuxのutf8のファイルシステムと違ってWindowsのSJISファイルシステムは面倒
>>962 そうやったか。。。
>>964 NTFSファイルシステム自体はUTF-16やぞ?
MicrosoftがようやくいよいよコマンドプロンプトとかNotepadとかのUnicode対応を考えはじめてるし、いずれWindows版も対応するんちゃうか。
いっそツッコんだら?
>>925 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
コマンドプロントはとっくにUTF-16対応している。出力フォントが表示に対応していないだけ。 コマンドプロントにはもう機能追加されないから Windows Terminalに乗り換えたほうがいい。
コマンドプロントは今でもすでに非システムコード文字(アラビア文字やハングルなど)をコマンドに引数渡しできる。 受け取る側のアプリがUTF-16形式で起動時の引数を取らなかったり、batファイルが非システムコード文字に対応していないだけ。 コマンドプロントの努力だけではどうしようもない。 なお、Windows向けビルドされたJavaやPerlは非システムコード文字を引数で受け取れない制約がある。 プログラム側で自力でbase64エンコード対応するなどして回避するしかない。 一方、Windows向けビルドされたPythonは非システムコード文字を引数で受け取ることができる。 Pythonのプラグインを作ったことある人なら分かると思うが、Pythonはインターフェース間の文字列のやりとりにUTF-16を使っている。
NTFSってUTF-16だったのか、 しかしperlのreaddirはcp932で返してきているような気がs…
NTFSはUCS-2で、windowsがUTF-16 それをわざわざcp932に変換して寄越す
>>968 > コマンドプロントの努力だけではどうしようもない。
そらそうや。
ついにcp932から離れようとする世の方向性を受けて、Perlも変わるんじゃねえの、という話。
Perl7とかでそういう話は出てないんかな?
知らんけど。
> なお、Windows向けビルドされたJavaやPerlは非システムコード文字を引数で受け取れない制約がある。
制約つーか、むしろ互換維持とかただ昔のままほったらかしとかやろ。w
>>971 そのおかげで、20年以上昔からふつうにWindowsで使えてきたわけだからしゃあない。
むしろありがたかった話。
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 は欲しい
正規表現のパターンの中に変数を書くとおかしくなりますが、どうしたらいいでしょうか。 やりたいこと:「hoge」の後ろがカンマか行末の場合を抽出したい $pat = "hoge[,\$\]"; if( $str =~ m/$pat/ ){...} こう書くと $pat が「hoge[,$]」になることはデバッガで確認できたのですが、思った通りのマッチになりません。マッチングの部分に $pat ではなく定数で「hoge[,$]」と書けばマッチングします。 どう書いたらいいでしょうか?
[]内は文字セットだからその$は行末マッチじゃないし
色々やって混乱して間違った事を書いていました。
やりたいことは
>>976 の通り。
>>979 を見てそれならばと「$pat = "hoge,{0,1}\$"」と書いたら目的を達成できました。
お騒がせしました。
>>980 hoge,xxxx
にはマッチしないが、ええんか?
>>976 の目的と違うで。
>>980 近いといえば近いが、そういう書き方をしたいなら「, で始まる文字列」じゃないか。
hoge(,.*)?$
あと、Perl には \z もあるよ。
みなさん、こんなアホに付き合ってもらってありがとうございます。 疲れてたのかな、俺。 まだ試してませんが、教えていただいたやり方でチャレンジしてみます。
$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
もしかして ¥bhoge¥b がよかったんじゃないの?
Python勉強中 print('梅') exit()
-curl lud20241227031355caこのスレへの固定リンク: http://5chb.net/r/tech/1548981877/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「Perlについての質問箱 64箱目 YouTube動画>8本 ->画像>5枚 」 を見た人も見ています:・Perlについての質問箱 65箱目 ・【古典的モダン】Perlについての質問箱 51箱目 ・??何でも質問箱??43箱目?? ・??何でも質問箱??43箱目?? ・??何でも質問箱??43箱目?? ・TAKARAZUKA SKY STAGEについての質問を答えるスレ ・沖縄県の米軍機の事故についての質問に自民党議員がヤジ「それで何人死んだんだ」 ・【初心者歓迎】最新COBOLについての質問スレ ・【白宝箱】Ver4装備ドロップについて語るスレ 3箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 13箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 15箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 7箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 10箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 24箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 4箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 18箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 22箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 19箱目 ・ストレスのゴミ箱 4箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 6箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 21箱目 ・【白宝箱】Ver4装備ドロップについて語るスレ 23箱目 ・バネに関する運動について質問です ・映画製作の投資について詳しい人に質問 ・昨日化学のmolについて質問した者だがまだ理解できない ・遁甲質問箱 ・臨時召集についての質問 ・ラーメン屋の店長やけど、平素お世話になってる皆様に料理についてプロとしてご教授致します。ご質問があったら何なりとどーぞm(__)m ・東進衛星についての質問 ・ユバの徴についての質問です ・インフラの概念についての質問スレ ・会場、会場周辺などの情報についての質問など ・香水・香りについての総合質問スレ 20 ・PC周辺機器(大容量HDD)についての質問です ・いつかの神職だけど神社についての質問ある? ・初心者・創作文芸についての質問スレッド ・総合!革靴についての質問スレッド 40足目 ・香水・香りについての総合質問スレ 14 ・香水・香りについての総合質問スレ 22 ・総合!靴についての質問スレッド 37足目 ・シティヘブンネットについての質問 ★4 ・総合!靴についての質問スレッド 39足目 ・コンサート・ライブ会場 座席についての質問スレ ・真女神転生Vnocturneについての質問(急募) ・タイムトラベルが引き起こす事象についての質問 ・偏差値30台から国立受かったけど勉強についての質問に答えるよ ・▼▲▼▲▼▲ 競輪についての質問スレ 22▼▲▼▲▼▲ ・▼▲▼▲▼▲ 競輪についての質問スレ 21▼▲▼▲▼▲ ・聖ヨハネの宗教質問箱 ・【格闘技】武尊、マギーとの熱愛報道についての質問に笑顔「そっちも激しくて」 ・【エイプリルフール】石野卓球、ピエール容疑者の薬物使用についての質問に「知りません」と回答 ・【将棋】藤井聡太四段(15)の対局後インタビューで、終戦記念日についての質問が飛ぶ…「平和な時代ありがたい」と回答 ・【芸能】奇抜な水着で話題のゆりやんレトリィバァ 闇営業問題についての質問に「ギャグ」で返し続けて批判殺到![07/03] ©bbspink.com ・《“羽生世代”か“大谷世代”か》羽生結弦、記者に「1994年代についての質問はNG」と通告 大谷翔平との“相思相愛”に異変 [ネギうどん★] ・【海外】テイラー・スウィフト、インタビュアーからの結婚&出産についての質問にお怒り! 「それって男性には聞かないわよね?」 ・【Webアプリケーション】XAMPP質問箱 ・ぼるじょあ(・3・)質問箱 セキュ板出張所34 ・ぼるじょあ(・3・)質問箱 セキュ板出張所33 ・次の人に質問・要望するスレ 再1 ・■□■法律に詳しい人に質問■□■ ・2年の時進研模試偏差値40だったけど現役で慶應法学部に受かった僕に質問ありますか? ・数学と物理の勉強方法について質問がある ・ストレスのゴミ箱 6箱目 ・マホトの一人のファンについて質問なんだが… ・【白宝箱】Ver5装備ドロップについて語るスレ 29箱目
13:33:29 up 16 days, 14:37, 2 users, load average: 12.81, 10.55, 10.19
in 4.0352630615234 sec
@4.0352630615234@0b7 on 013003