X



Perlについての質問箱 63箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2014/02/19(水) 23:36:23.29
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板: http://kohada.2ch.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.18.2)

▼前スレ
Perlについての質問箱 61箱目
http://toro.2ch.net/test/read.cgi/tech/1381561905/
Perlについての質問箱 62箱目
http://toro.2ch.net/test/read.cgi/tech/1385039352/
0446442
垢版 |
2016/09/23(金) 05:21:37.52ID:CNgCRT2E
>>443
「WindowsのFork」の意味は分かりませんが(Windows用PerlのFork?)、
Cygwin の perl は、
  C:\cygwin64\bin\bash --login -i -c "perl ...
等としなくても、Windows から直接起動出来るので、
あのスプリクトで直接起動しても、メモリエラーは出ませんでした。

Cygwin の perl を、Strawberry Perl の代わりに、、、と思ったら、
いきなり chomp が、CR+LF を削除してくれなかった。


>>444
perldoc.jp からのコピペです。


>>445
if ( 文字列 =~ /パターン/ )
もし「文字列」の中に「パターン」が含まれていれば、

if ( $hoge =~ /(\d+)$hoge3$/ ) { $hoge2 = $1 }
もし「 $hoge 」の中に「 \d+$hoge3$ 」が含まれていれば、「 $hoge2 」に「 \d+ 」を代入
0447445
垢版 |
2016/09/23(金) 08:03:28.29ID:Ay1vA5a9
>>446
ありがとうございます。
他言語の底辺SEなので助かりました。
0448デフォルトの名無しさん
垢版 |
2016/09/23(金) 14:09:14.63ID:eBfGtRhY
普段それを読む文化にない人がいきなり読めたら逆にすごいと思う
PerlってPerlが分かる人だけの言語
0449デフォルトの名無しさん
垢版 |
2016/09/26(月) 17:38:36.14ID:ak8zLIw0
Perl on Bash on Ubuntu on Windows10 での、
モジュールのインストールで、無駄に苦労した。
  解決法: Config.pm の修正


Windows10 のコマンドプロンプトでも、
エスケープシーケンスが使えるらしい。
  PROMPT $E[96m$T$E[3D $E[93m$P$G$E[37m$E[1C
懐かし
0452デフォルトの名無しさん
垢版 |
2016/10/03(月) 19:32:24.04ID:tI+B9pP0
ザメフォン元気?
0453デフォルトの名無しさん
垢版 |
2016/10/06(木) 18:37:40.82ID:fMpg74pi
ビット演算を多用したいんだけど、変数のサイズを指定したい。longとか。
とりあえず、16bitと32bitと64bitの整数が欲しい。
あと数値と文字が勝手に切り替わらないようにしたい。

ビット演算してるブロックだけでいいんで。
あと環境の保証も欲しい。どのマシンでどのbitのPerlとか関係なく。
俺が32bitのビット演算って言えばそれはもう絶対32nit演算。
もちろん不当に遅くなる方法は許さない。
0454デフォルトの名無しさん
垢版 |
2016/10/06(木) 20:14:48.16ID:rUXrZJG3
C で書け。
0455デフォルトの名無しさん
垢版 |
2016/10/06(木) 20:56:23.24ID:Wdgc44Vq
C++でもいいぞ
0459デフォルトの名無しさん
垢版 |
2016/10/07(金) 07:25:20.66ID:codMUtxm
vec かな。それでも不満なら perlfaq3 を読んで C で書け。
0460デフォルトの名無しさん
垢版 |
2016/10/07(金) 12:43:21.52ID:codMUtxm
実際に何をして、その結果何が問題だったの? そのくらいは書いてくれないと……
0461デフォルトの名無しさん
垢版 |
2016/10/08(土) 01:08:43.11ID:hitB9rm0
>>457
xsと言うのがあるが、一時的に値が複製されて良いなら標準入出力(メモリ渡し)のほうが絶対に楽だと思うのだ。
ま、perl使ってるなら複製されたメモリのほうが元のデータより圧倒的に小さいはずだが
0462デフォルトの名無しさん
垢版 |
2016/10/08(土) 09:19:23.51ID:ZgFPdp2t
ビット演算したいなら普通にすればいいよ。
◯ビット変数がほしいといわれても、それは適切にマスクすればいいだけだし。
◯ビット変数のように振る舞うものがほしいということなら、Perl は C よりも期待に応えられると思うよ。
まずは C と同じ書き方をして速度を計ってみてよ。話はそれからだ。
0464デフォルトの名無しさん
垢版 |
2016/10/09(日) 00:00:21.79ID:ja1MeL+I
>>453 に言ってるんだよ?
0465デフォルトの名無しさん
垢版 |
2016/10/10(月) 16:43:42.37ID:zhEtfxQ/
もう連休終わっちゃうんだけど結局何をしたかったのかな。
0467デフォルトの名無しさん
垢版 |
2016/10/11(火) 00:28:33.80ID:SYi+Wrc4
しかし普通の言語やったあとにPerlやると異常なほど即座に短く書き終えるからなにか書き忘れてるんじゃないかと不安になる。
正しく動くと分かると異常なほど楽で嬉しくなるし、C++とかが馬鹿らしくなる。
そして実行速度計ると結局全部納得してため息。
0468デフォルトの名無しさん
垢版 |
2016/10/11(火) 19:01:16.50ID:A+TNY00d
stat($file_path);でファイルを作成したtimeは
atime,mtime,ctimeのどれなの?
0469デフォルトの名無しさん
垢版 |
2016/10/11(火) 19:50:08.12ID:Mt8tOIIr
>>468

http://perldoc.jp/func/stat
> 8 atime 紀元から、最後にアクセスされた時刻までの秒数
> 9 mtime 紀元から、最後に修正(modify)された時刻までの秒数
> 10 ctime 紀元から、inode 変更(change)された時刻までの秒数 (*)

> 明らかに、ctime のフィールドは移植性がありません。
> 特に、これから「作成時刻」を想定することは出来ません

http://perldoc.jp/docs/perl/perlport.pod#Files32and32Filesystems
> ファイルシステムはアクセスタイムスタンプや変更タイムスタンプに
> 対応していないかもしれません (つまり移植性のあるタイムスタンプは
> 変更タイムスタンプだけです); またタイムスタンプは 1 秒単位では
> ないかもしれません (例えば、FAT ファイルシステムは時刻の単位は
> 2 秒単位です)。

>「inode 変更タイムスタンプ」 (-C ファイルテスト) は (Unix 以外では)
> 実際には「作成タイムスタンプ」かもしれません。
0470デフォルトの名無しさん
垢版 |
2016/10/12(水) 08:39:20.39ID:9k51B2Do
Perlのオブジェクト指向読んだばっかりで理解が曖昧なんだけど、
これだと、オブジェクトがオブジェクトなのか関数なのかって呼び出し側で決める事にならない?
コンストラクタもメソッドも。
ついでに、インスタンスのカプセル化どうこうも、呼び出し側の権利?

みたいに見えたのですが。
0472デフォルトの名無しさん
垢版 |
2016/10/12(水) 14:33:18.63ID:9k51B2Do
>>471
ありがとう

以下みたいな感じの記述は使っても問題ない?
あと穴があった場合も教えて欲しい。
(複数回に分けて書くので途中で書けなくなるかも)



use utf8;
use strict;
use warnings;

#ただの実験
# 1: メソッドとインスタンスをカプセル化する。
# 2: クロージャを、あたかもオブジェクト指向と同じ記法で呼び出せるようにする。(クロージャとオブジェクト指向の同一視)
# 3: クロージャをクロージャのまま使いたければそうできるようにした。そもそもクロージャのほうが速いので。
0473デフォルトの名無しさん
垢版 |
2016/10/12(水) 14:33:37.13ID:9k51B2Do
{
package Class;

sub new{
my $class = $_[0] eq __PACKAGE__ ? shift : undef ; #オブジェクトとして呼び出されたかどうか
my $self = {
Name => shift,
};

my $method = {
NameGet => sub{ $self->{Name} },
NameSet => sub{ $self->{Name} = shift; },
};

return $method if(!$class); # 普通の関数(クロージャ)として呼ばれた場合
return bless $method, $class; # オブジェクトとして呼ばれた場合
}

sub AUTOLOAD {
our $AUTOLOAD;
my $method = shift;
ref($method) eq __PACKAGE__ or return("error");
my @load = split '::', $AUTOLOAD;
my $load = $load[-1];

$method->{$load}->(@_);
}
}
0474デフォルトの名無しさん
垢版 |
2016/10/12(水) 14:34:03.93ID:9k51B2Do
{
package test;

my $c = Class::new("Closure"); #クロージャとして呼び出すと、一般的なクロージャと同じように使える。
print $c->{NameGet}->() . "\n";

my $o = Class->new("Object"); #オブジェクト指向として呼び出すと、オブジェクト指向と同じように使える。(中身はクロージャ)
print $o->NameGet() . "\n";

print Class::NameGet(); #関数のように呼ぶとエラー
}

__END__

以上です
0475デフォルトの名無しさん
垢版 |
2016/10/12(水) 16:49:58.02ID:HdFKT2Ip
オブジェクト指向=カプセル化ではないし、perl5でももう少しスマートなカプセル化のやり方もあるが筋が悪いからおすすめはしない
perl6はオブジェクト指向に関してはかなりマシだけど、そもそも速度気にするならperlは向かない

perl5じゃないとダメなら規約などで上手く付き合うしかない
ちなみにそのコードだとまともに継承できないね
0476デフォルトの名無しさん
垢版 |
2016/10/12(水) 21:51:13.12ID:9k51B2Do
やりかたがあると言うのなら、提示して欲しいのだけど。(ただの俺は知ってるぞ自慢?)

事前に試しましたが、継承はできましたよー。
複数クラスを書くと長くなるので書きませんが、
まったく同じように別のクラスを書いて、ベースにしたいクラスを呼び出して更新すれば
とりあえずインスタンスもメソッドは継承されるですね。

あと穴は一つ発見しました。
これは後出しにしようかな。
0480デフォルトの名無しさん
垢版 |
2016/10/14(金) 22:56:09.64ID:GnnBnQfG
スーパーコンピューターのアプリケーションしか作ったことがないのですが、
そんな私でも作れるでしょうか?
0482デフォルトの名無しさん
垢版 |
2016/10/17(月) 02:26:31.41ID:WRe7I7Bu
2つのテキストファイルを比較し、一致した文字列を取り出したいんですが、教えていただけませんか
0483デフォルトの名無しさん
垢版 |
2016/10/17(月) 03:43:08.25ID:sXplblvU
一致した文字列を穴なく完璧に厳格に定義して示して下さい。
そしてそれが出来ればプログラミングの8割は終了しています。
0484デフォルトの名無しさん
垢版 |
2016/10/17(月) 09:06:26.12ID:z3YwWHWS
diff 系かなあ。CPAN で検索してみるといいよ。
0486デフォルトの名無しさん
垢版 |
2016/10/17(月) 09:33:07.31ID:z3YwWHWS
いやいや、一致した「行」とは言ってないから。何を望んでいるのかを確認しないと。
0488デフォルトの名無しさん
垢版 |
2016/10/18(火) 22:42:04.03ID:kO2WqMh/
my $input = [];
CSVファイルを一行づつ配列にして多元配列にした後
for (my $i=0; $i<$#$input; $i++) {print Dumper($input->[$i]),"\n";}
で全データ出力するのですが、その後(?)関数内で同じく
for (my $i=0; $i<$#$input; $i++) {print Dumper($input->[$i]),"\n";}
とすると、1行目の内容が、$#$inputの数だけ繰り返し表示されます。
関数内でも全データを出力したいのですが、どうしたらよいでしょうか。
どなたか教えてください。よろしくお願いします。
0489デフォルトの名無しさん
垢版 |
2016/10/18(火) 23:56:04.56ID:sMICGAt6
1回ずつループしながら、デバッグして、使っている変数を見れば?

変数のwatch 機能、あるだろ?
0490デフォルトの名無しさん
垢版 |
2016/10/19(水) 00:45:58.03ID:cfM1WNHO
>>489
アドバイスありがとうございます。VisualStudioCodeを素で使ってまして
perlのwatch機能は無いようなのです。
0491490
垢版 |
2016/10/19(水) 00:48:54.12ID:cfM1WNHO
watch機能はないのですが、添字の$iを具体的な数字を入れてはprintで確認して
1行目のデータになっていると気づいた次第です。
0492デフォルトの名無しさん
垢版 |
2016/10/19(水) 08:22:02.29ID:p26QOV7Y
>>488
こういうこと?再現しないよ

use Data::Dumper;
my $input = ["abc", "def", "ghi"];
for(my $i=0; $i<=$#$input; $i++) {
print Dumper($input->[$i]), "\n";
}
&func;

sub func {
for(my $i=0; $i<=$#$input; $i++) {
print Dumper($input->[$i]), "\n";
}
}
0493デフォルトの名無しさん
垢版 |
2016/10/19(水) 09:10:37.02ID:cfM1WNHO
>>492
要はそういうことなんだと思います。csvファイルを読み込んで
$input[[1, 2, 3],[4, 5, 6],[7, 8, 9]];
for (my $i=0; $i<$#$input; $i++) {print Dumper($input->[$i]),"\n";}
でDumperのフォーマットですが[1, 2, 3],[4, 5, 6],[7, 8, 9]を表示
sub funcの中で同じforをすると
Dumperのフォーマットですが[1, 2, 3],[1, 2, 3],[1, 2, 3]を表示します。

必要なところを抽出して現象がでたらソースをアップします。
0494490
垢版 |
2016/10/19(水) 13:56:56.14ID:cfM1WNHO
ループ内で行っていた条件分岐の間違いでした。お騒がせしました。
489さん、492さん、ありがとうございました。
0495デフォルトの名無しさん
垢版 |
2016/10/22(土) 10:51:15.40ID:NzADNRlY
良い回答はないと思うんだけど、正規表現で指定する内容をランダムで作り出す方法ってないかな。

例えば
/^[0-9][0-9a-zA-Z]{4}[A-Z]$/;
だったら
5scDuZ
とかが得られますよ的な。
0498デフォルトの名無しさん
垢版 |
2016/10/22(土) 17:34:20.47ID:BSsXTeb9
CPANのモジュールも更新されないものが増えてきた
もうオワコン
0499デフォルトの名無しさん
垢版 |
2016/10/25(火) 21:00:26.38ID:EVpxycMx
Windows環境でUnixのテキストファイルを処理します
改行LFがCR+LFに変換されてしまうのを防ぐために
perl -i.bak -p -e "BEGIN{ binmode STDIN; binmode STDOUT; } s/unko/manko/g;" hogo.txt
みたいな風に書いてるんですけど
もうちょっとスマートな書き方ありませんか?
0500デフォルトの名無しさん
垢版 |
2016/10/25(火) 21:11:38.78ID:U4JQUv53
binmodeしないと自動変換されるの?
まぁ試してないけど、ワンライナーをやめれば良いのさ
0503デフォルトの名無しさん
垢版 |
2016/11/10(木) 22:48:13.72ID:SbD3rZb1
perlの場合は文字コードがEUCのデータファイルがあって
入力フォームからハングル文字で書き込むと自動的に&#○○○;の形に変換されて書き込まれるのですか?
0506デフォルトの名無しさん
垢版 |
2016/11/10(木) 23:30:34.65ID:XrxEtHdJ
最近はフォームを知らない人がいるんだ
おぢさん、世代ギャップを感じるよ
0508デフォルトの名無しさん
垢版 |
2016/11/11(金) 12:07:09.49ID:PHyMHsut
my $str = "aaa〹&bbb&ccc";
という文字列があって
&#以外の&を&に置換するやり方は?
0509デフォルトの名無しさん
垢版 |
2016/11/11(金) 12:09:09.25ID:PHyMHsut
my $str = "aaa&#12345;bbb&ccc";
という文字列があって
&#以外の&を&に置換するやり方は?

#はここでは全角で入力したけど半角です
0510デフォルトの名無しさん
垢版 |
2016/11/11(金) 12:09:58.95ID:PHyMHsut
訂正
my $str = "aaa&#12345;bbb&ccc";
という文字列があって
&#以外の&を&amp;に置換するやり方は?

#はここでは全角で入力したけど半角です
0513デフォルトの名無しさん
垢版 |
2016/11/11(金) 17:35:35.83ID:KyOrnFnp
こういう時日本語は全角文字を使えて便利だね
海外の人は&や#が入力できない時苦労しそう
0515デフォルトの名無しさん
垢版 |
2016/11/11(金) 23:23:43.62ID:PHyMHsut
できました
それとこの文字列で
my $str = "&amp;&amp;&am";
それとこの文字列で&amp;でない&(この場合一番後ろの&)を&amp;に置換するには
どうすればいいんでしょうか?
0517デフォルトの名無しさん
垢版 |
2016/12/07(水) 13:14:37.83ID:AwnLgrFF
すみません教えてください。
DBD::CSVというのは
標準モジュールに含まれるのでしょうか?
0521デフォルトの名無しさん
垢版 |
2016/12/07(水) 15:18:54.39ID:AwnLgrFF
>>519
なるほど納得です。
開発環境がAcrivePerlで、libに入ってるモジュールは標準と思ってました。
ありがとうございました。
0522デフォルトの名無しさん
垢版 |
2016/12/10(土) 20:16:28.52ID:cBnztJW7
perlの乱数生成器の内部状態を保存するにはどうしたらいいですか
seedだけ保存しても100万回 rand を呼んだところで中断したら再開するときまた100万回呼ばないとダメですよね
0524デフォルトの名無しさん
垢版 |
2016/12/14(水) 23:50:40.69ID:6q3W8zza
と言うか動作の保証が求められる乱数みたいなのはオブジェクトごとに専用で実装する
0525デフォルトの名無しさん
垢版 |
2016/12/15(木) 13:10:06.97ID:ZL343Whf
乱数用のモジュール使うしかないんだろうけど有名どころの Math::Random::MT は状態保存はできないみたいだな
pure perl実装の方は無理矢理シリアライズすればできそうだけど
0529デフォルトの名無しさん
垢版 |
2016/12/19(月) 00:17:41.32ID:qsdLnaaR
push pop shift unshiftが未だにどれがどうだったか覚えられません。
毎回ググるのも面倒なのですが、何か覚えるコツみたいなものはありますでしょうか。
ディスプレイに付箋を貼るのは嫌です。
0531デフォルトの名無しさん
垢版 |
2016/12/19(月) 16:34:48.89ID:CDWthwTd
あああ、オレも覚えるのに苦労した
だって、アセンブラの push 命令とは伸びる方向が真逆なんだよ

shift はバッチファイルにも同じ命令があるから分かるよね
前にズラす
はい、お次の方、どうぞ、って感じ
朝勤、昼勤、夜勤、って感じ

push は後ろから押す、背中から押す、ケツから押す、とにかく押すんだ
満員電車に乗るとき、押さないでください、押さないでください、って感じ
0532デフォルトの名無しさん
垢版 |
2016/12/19(月) 18:32:42.82ID:RxkoIqKm
スマホかどうか判別するには
if(
$ENV{'HTTP_USER_AGENT'} =~ /iPhone/ ||
$ENV{'HTTP_USER_AGENT'} =~ /iPad/ ||
$ENV{'HTTP_USER_AGENT'} =~ /iPod/ ||
$ENV{'HTTP_USER_AGENT''} =~ /Android/
){
print "スマホだよ";
}

これでいいんですか?
0533デフォルトの名無しさん
垢版 |
2016/12/19(月) 21:42:52.71ID:BI+h437s
push,popは一般的なCPU命令のpush.popと同じだね。スタック末尾に積んだり取り出したり。
shift,unshiftは直感的とは言いがたいけど、まあ覚えるしかない
0534デフォルトの名無しさん
垢版 |
2016/12/19(月) 23:41:08.79ID:iJGCCAlx
対にして使うならば、push-pop、ないしpush-shift、unshiftはいったん忘れたほうがいい
0535デフォルトの名無しさん
垢版 |
2016/12/19(月) 23:58:59.01ID:qsdLnaaR
>>531,533-534
ありがとうございます。
pushは何とかそれで覚えられそうです。
何とかpush-shiftで覚えてみます。

>>530
レスしたいだけのゴミクズはさっさと消えろ。
まともに回答もできないクセに自己顕示欲だけは人一倍。
お前みたいな奴が社会のお荷物なんだよ。
お荷物=捨てるに捨てられないゴミ、だからな。
本当はさっさと処分したほうが社会のためだが憲法と法律によって処分できないだけ。
0538デフォルトの名無しさん
垢版 |
2016/12/20(火) 02:47:43.15ID:sHqfd7is
無理のある例えだが、配列がロケット鉛筆だとしたら
<0[1][2][3]

ケツに押し込むのが push
<0[1][2][3] ← [4]

ケツから飛び出ちゃうのが pop
<0[1][2] → [3]

芯を引っこ抜くのが shift
<0 ← <0[1][2]

先から無理矢理突っ込んじゃうのが unshift
→ <0[1][2][3][4]
0539デフォルトの名無しさん
垢版 |
2016/12/20(火) 03:25:48.63ID:Wy6+Up2x
まあどうせすぐ忘れるだろ
結局は染み付くまで調べるのを繰り返すしかない
0540デフォルトの名無しさん
垢版 |
2016/12/20(火) 04:26:14.23ID:VxeGortQ
>>535
いやいや、毎回調べるのも十分ありだと思うぞ。
俺はそのうちになんとなく覚えちゃったことけっこうあるよ。
0541デフォルトの名無しさん
垢版 |
2016/12/20(火) 05:58:50.42ID:Wy6+Up2x
うろ覚えで使うとバグの発見に苦しむんで
ほんのちょっとでも不安を覚える感じがしたら大丈夫だとは思ってても
必ず調べる方が良いよね
0544デフォルトの名無しさん
垢版 |
2016/12/21(水) 00:24:41.66ID:nmy+aY6o
毎日のように使ってりゃそりゃ忘れることは無いだろうけど
数ヵ月とか間を空けると忘れてて調べなおすことはままある
記憶障害って言われるのはちょっときつい
■ このスレッドは過去ログ倉庫に格納されています

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