Perlについての質問箱 43箱目at TECH
Perlについての質問箱 43箱目 - 暇つぶし2ch511:507
10/06/01 06:24:42
>>509
そうですか。うーん。
正規表現とか、考え方とかはそんなに変わらないかと思ったんですが、
有害なんですね。
できれば、オンラインで学習できるのが一番なんですが、まとまったサイトってありますか?

>>510
ありがとうございます。
でも読むコマンドがわかりませんでした。
私は、Macなので、ターミナルを起動して
>perldoc perlintroとコマンドを入力してみましたが、
perlintroというドキュメントはないというようなエラーが出ました。
No documentation found for "perlintro".


512:デフォルトの名無しさん
10/06/01 07:15:01
>>511
URLリンク(perldoc.perl.org)
URLリンク(www.perldoc.jp)
>>2

513:デフォルトの名無しさん
10/06/01 08:34:09
>>511
サンプルコードによるPerl入門
URLリンク(d.hatena.ne.jp)

日本の Perl ユーザのためのハブサイト
URLリンク(perl-users.jp)


514:デフォルトの名無しさん
10/06/01 14:55:03
スレリンク(saku2ch板:183番) 2010/04/01 21:55:59 HOST:softbank221101001151.bbtec.net
スレリンク(sakud板:209番) 2010/04/13 22:40:00 HOST:softbank221101001151.bbtec.net
スレリンク(sakukb板:196番) 2010/04/16 23:34:20 ID:GYnmPEAj0
スレリンク(sec2chd板:904番) 2010/05/30 16:54:09 ID:NuvDjPvV0

スレリンク(stadium板:687番) 2010/04/01 22:00:01 ID:mB5AiSFL
スレリンク(tennis板:27番) 2010/04/01 22:01:15 ID:+EaxE3Yd
スレリンク(sports板:78番) 2010/04/13 22:44:20 ID:bew0Nrvf
スレリンク(sports板:294番) 2010/04/14 09:35:45 ID:hjGULPLG
スレリンク(war板:319番) 2010/04/14 18:23:30 ID:+lNQ2DXA
スレリンク(kyozin板:91番) 2010/04/14 18:29:06 ID:3CDN5Ccw0
スレリンク(wres板:47番) 2010/04/14 18:30:38 ID:9IsRU2FN0
スレリンク(ski板:573番) 2010/04/16 23:39:04
スレリンク(goveract板:510番) 2010/04/18 17:31:32 ID:pk5WfpDm
スレリンク(gutter板:517番) 2010/04/18 17:34:51 ID:34DVdrjm

スレリンク(stadium板:707番) 2010/05/10 22:44:12 ID:hX93YGf3
スレリンク(cancer板:273番) 2010/05/10 22:46:25 ID:nHvjUfwZ
スレリンク(sports板:636番) 2010/05/11 18:17:35 ID:yYc33zVj
スレリンク(war板:342番) 2010/05/16 18:50:43 ID:6cddBk0z
スレリンク(war板:217番) 2010/05/30 16:50:31 ID:2FL8NGA8
スレリンク(equestrian板:760番) 2010/05/31 21:06:11 ID:34qn98Gz


515:507
10/06/01 22:30:15
>>512
>>513
丁寧にありがとうございます。
無事Perlintroを読み終えることができました。
まだデータ形式のハッシュはよく理解していませんが、少しずつ理解しようと思います。
サンプルコードによる・・には、新しい版用のコードの書き方の解説もあったので、
今持っている初めてのPerl本と見比べながら学びたいと思います。

ありがとうございました!


516:デフォルトの名無しさん
10/06/03 16:42:25
2ちゃんねるにアクセスしたいんですがもうずっと人大杉となってしまいます。
回避する方法はありますか?

517:デフォルトの名無しさん
10/06/03 16:55:32
まず服を脱ぎます。

518:デフォルトの名無しさん
10/06/03 18:23:10
脱ぎました。
次はどうすればいいですか?

519:デフォルトの名無しさん
10/06/03 18:50:55
>>518
口に鉛筆を咥える。

520:デフォルトの名無しさん
10/06/03 19:02:34
マジレスすると2chはUser-Agentがlibwww-perlとかだと弾くようになってる

521:デフォルトの名無しさん
10/06/08 11:05:28
文字列をutf8からsjisに変換するのに、jcode を使用すると特定の文字が変換されずに?になってしまいます。('1~5' → '1?5')
正しく変換するにはどのようにすればよいのでしょうか。

#!/usr/bin/perl

use Jcode;

my $utf = "1~5";
my $sjis = jcode($utf)->sjis;
my $euc = jcode($utf)->euc;

print jcode($sjis)->utf8 . "/" . $utf . "/" . jcode($euc)->utf8;


522:デフォルトの名無しさん
10/06/08 11:28:59
>>521
すみません。自己解決しました。
use Jcode; を use Jcode::CP932; に変えるだけでした。


523:デフォルトの名無しさん
10/06/08 11:35:22
昔の人がユニコードと既存の文字コードの対応関係を決めるときに
統一に失敗したので面倒なことになってます。ほんと迷惑。

524:デフォルトの名無しさん
10/06/09 11:02:37
Apache2+mod_perlやってるんですが、
その回のリクエストが終わっても残り続けるグローバルな変数って
ありますか?
メモリ上に残り続けるフラグを持ってリクエストのたびに処理を分岐したいです。

525:デフォルトの名無しさん
10/06/09 11:13:11
>>524
ファイルか、DBに残せばよいのでは?

526:デフォルトの名無しさん
10/06/09 11:40:52
アクセス数(マルチスレッド)が半端ないので
ファイルはなるべく避けたいです。
フラグ一つのためにDB構築するのもなんか微妙なので。

527:デフォルトの名無しさん
10/06/09 11:51:05
IPC::ShareLiteとか使うのがいいんじゃね?

528:デフォルトの名無しさん
10/06/09 11:53:33
printf "%.2f\n", 90.1730;
printf "%.2f\n", 90.1740;
printf "%.2f\n", 90.1750;
printf "%.2f\n", 90.1760;
printf "%.2f\n", 90.1770;

printf "%.2f\n", 90.1630;
printf "%.2f\n", 90.1640;
printf "%.2f\n", 90.1650;
printf "%.2f\n", 90.1660;
printf "%.2f\n", 90.1670;

この処理ですが、上の段は、5捨6入しているのですが、
下の段は4捨5入の処理をしています。

90.17
90.17
90.17
90.18
90.18

90.16
90.16
90.17
90.17
90.17

いろいろと試したのですが、printfがどういったルールで
丸めの処理をしているのかまったくわかりませんでした。
ググッてもこの処理の違いに関する説明もでてきません。
この処理の違いがわかる人はいませんか?

529:デフォルトの名無しさん
10/06/09 12:08:50
>>528
内部は2進数なので、2進数だと無限小数になっちゃう
数は有限桁数で表すと誤差が出るんだよな。

もう少し先の桁まで出すと

% perl -e 'printf "%.20f\n", 90.1750;'
90.17499999999999715783

なので四捨五入だと切り捨ての方になっちゃうんだよね。

530:デフォルトの名無しさん
10/06/09 12:09:59
>>526
なら、WebPage側にhidden項目でも作って、そこに保存しておくとか・・・

531:デフォルトの名無しさん
10/06/09 12:22:41
mod_perlは使ったことないけどmod_speedycgiなら……

532:デフォルトの名無しさん
10/06/09 13:35:48
>>530


533:デフォルトの名無しさん
10/06/09 16:10:35
>>524
グローバル変数で変数を持たせるとセッションが続く限り、内部データは引き継がれる。
これはspeedycgiでも同じ。

普通は変数が引き継がれると困るので、局所変数で宣言するが、普通のcgiだと、cgiが
実行されるごとに、グローバル変数はリセットされるため、局所でもグローバルでもあま
りあまり関係ない。そのため後からuse strict;で変数管理をしようとしてもエラーだらけで、
直しようがなくなる。

534:デフォルトの名無しさん
10/06/09 22:41:24
use strict するとエラーが発生するCPANモジュールは登録しないで欲しい。

535:デフォルトの名無しさん
10/06/10 00:15:55
>>534
まさかstrictにrefs入れてないよね?

536:デフォルトの名無しさん
10/06/10 02:01:07
use stritc;
しておいて必要なところだけブロック切って
no strict 'refs';
だろjk

537:デフォルトの名無しさん
10/06/10 12:14:48
>>534
obsoleteなブツなんでないの?
同等以上の新しいモジュールがあるだろ。

538:デフォルトの名無しさん
10/06/10 17:21:59
test.txt文書内にある
abc001.jpg
abc002.jpg
という2行の文字列を
<Vol.001>abc001.jpg
<Vol.002>abc002.jpg
と書き換えてoutput.txtに書き出すPerlスクリプトを書きたいと思っています。
しかし、test.txt内の文字列が1行の場合には上手くいきますが、
例のような複数行では
<Vol.001>abc001.jpg
abc002.jpg
となってしまいます。
どこが間違っているのでしょうか?

#!/usr/bin/perl
use strict;
use warnings;
$a="test.txt";
$b="output.txt";
open my $in , '<', $a or die "Cannot open '$a': $!";
open my $out, '>', $b or die "Cannot open '$b': $!";
while(<$in>){
s/abc(.+?)\.jpg/<Vol\.$1>abc$1\.jpg/;
print $out $_;
};
close($in);
close($out);

539:デフォルトの名無しさん
10/06/10 17:55:00
そのままコピペしたけどちゃんと動いたぞ?
あと関係ないけど、せっかくuse strictしてるんだから$a , $b はつかうな

540:デフォルトの名無しさん
10/06/10 20:11:20
配列の宣言についての質問なんですが
my @x=(1,2,3,4,5,6,7,8);
my $y=100;
my @pi =(@x/$y);

この様に@で配列を制限し
my @piの中身を1/100,2/100,3/100,4/100,・・・
として以下の計算につなげたいのですが、
どうしても上手くいきません・・・

foreach文なども試してみましたがダメでした
非常に低レベルの質問ですがどうかご教授よろしくお願いします

541:デフォルトの名無しさん
10/06/10 20:19:29
my @x=(1,2,3,4,5,6,7,8);
my $y=100;
my @pi;

foreach my $tmp (@x){
    push(@pi, $tmp/$y);
}

foreach my $tmp (@pi){
    print "$tmp, ";
}

542:デフォルトの名無しさん
10/06/10 21:06:34
key1, key2, ..., keyN, Value (N=10程度)
のようなレコードを持ったCSVファイルに対して,
keyA=AAAかつkeyB=BBBのレコードのValueの合計,平均,...etc
といった統計を計算する最もスマートな方法を教えてください.
レコード数は数十万~数百万行を想定しています.

543:デフォルトの名無しさん
10/06/10 21:38:31
>>524
ourで宣言すればおk。
でも保持できるのはプロセス単位だから共有メモリ使った方がいいと思う。storableとか

544:デフォルトの名無しさん
10/06/10 22:03:32
>>540
URLリンク(perldoc.jp)

my @pi = map $_ / $y, @x;

545:デフォルトの名無しさん
10/06/10 22:19:50
my @pi = map {$_ / 100} (1 .. 8);
print "$_, " for (@pi);

546:540
10/06/10 23:13:47
>>541>>544>>545
わざわざ理解しやすい回答ありがとうございます
早速スプリクトに組み込んでみます

547:デフォルトの名無しさん
10/06/11 00:01:18
>>542
その数ならDBに突っ込んでSQLでやる

548:デフォルトの名無しさん
10/06/11 00:24:13
合計と平均なら頭から読んで足したり数えたりするだけで
いいと思うけど。

549:デフォルトの名無しさん
10/06/11 03:47:48
>>539
コメントありがとうございます。
問題点は、入力用ファイルの改行コードでした。
改行コードをUnixではなくMacの改行コードにしていたので、
2行が1行と認識されてしまっていたようです。

ずっと正規表現の問題だと思っていたので、コメントのおかげで別の観点で見直すことができました。

素人なのでもう一つ質問させてください。
>$a , $b はつかうな
というのは、意味のない変数名を使うのではなく、
$infile,$outputfileなどのように一目で意味のわかる変数名を使いなさいということでしょうか?

550:デフォルトの名無しさん
10/06/11 03:51:22
>>549
$aと$bはsortの時に使われる。つか、use strictしてるのにmyなしで動いてる時点で「あれ?」ってなったでしょ?
perldoc -f sort
> global variables $a and $b

551:507
10/06/11 06:33:39
>>550
丁寧にありがとうございます。
色々調べてやっと仰っていることが理解できた気がします。
やはり、初めてのPerl初版本を読んでいた弊害がありそうです。

でもこのサンプルコードによるPerl入門は素晴らしいですね。
URLリンク(d.hatena.ne.jp)

552:デフォルトの名無しさん
10/06/15 18:38:48
指定の処理を行いログを出力するプログラム hoge.plと
そのログを読み込み解析し出力する analyst.plを作り、
普段はhoge.plを使いたまにanalyst.plを実行するという事をしてきました。

今回その解析済みログを利用するためにhoge.plの中でanalyst.plを実行させたくなったのですが
require('analyst.pl');としたところ"\x{00cd}" does not map to cp932 at analyst.pl line 12.
というエラーが大量に出ました。

これは両方のplファイルにuse utf8; binmode STDOUT ":encoding(cp932)";があり
analyst.plでutf8からcp932に変換されたものがhoge.plでさらにcp932に変換されているからのようで
analyst.pl内のbinmode~;をコメントアウトするとうまく動くようになりました。
しかしanalyst.plの単独実行時にうまく動かなくなりました。

このような場合どうすれば両立させることができるのでしょうか?お知恵を貸して欲しいです。

This is perl, v5.10.1 built for MSWin32-x64-multi-thread

553:デフォルトの名無しさん
10/06/15 19:01:09
>>552
ちょっと面倒だけど新たにAnalyst.pmを作成し、そこにanalyst.plの機能を全部放り込んだサブルーチンを作り、
hoge.plとanalyst.plはそれを読み込み実行すれば両立出来るよ。

hoge.plとanalyst.plの二つのファイルだけでは・・・できるのかな?

554:デフォルトの名無しさん
10/06/15 20:02:21
>>553
そこまでするならモジュール化すればいいだろw

555:デフォルトの名無しさん
10/06/15 20:06:22
試してないけど ':raw :encoding(cp932)' みたいにレイヤー重ねがけすればとりあえず動くんじゃね

556:デフォルトの名無しさん
10/06/15 20:43:23
>>552
requireする前にbinmode STDOUT=>":raw";
あるいはanalyst.pl内のbinmode文をbinmode STDOUT=>":raw:encoding(cp932)";

557:552
10/06/15 21:25:50
なるほど、:rawを重ねると生データにリセットできるんですね。
requireする前に一行追加することで簡単に実現出来ました。
呼び出し前に:rawにして呼び出し先で:cp932に再セットされるという流れもなんだか良いです。

>>553-556
みなさんレスありがとうございました。

558:552
10/06/15 21:54:21
このスレ雰囲気良いね

559:デフォルトの名無しさん
10/06/16 03:43:58
一気に雰囲気が悪くなった

560:デフォルトの名無しさん
10/06/16 05:22:30
そんなこというなよ…

561:デフォルトの名無しさん
10/06/16 17:53:09
perlスクリプトファイルのコメント部分だけ取得する良い方法はないでしょうか?

単純に # より前を消すみたいのを自分で作ってたんですが、print '#'; とか、s#a#b#;
というのも考えられるなとか、ヒアドキュメント中の # はどうするとか、、、

私の脳みそでは確実に無理なので、なにかないでしょうか?

562:デフォルトの名無しさん
10/06/16 19:11:59
つ正規表現

563:デフォルトの名無しさん
10/06/16 19:59:14
m{
hoge # not comment
}



m{
hoge # comment
}x

の区別とか想像しただけで嫌になるよなw

564:デフォルトの名無しさん
10/06/16 20:23:53
>>561
perltidyとかは?

565:デフォルトの名無しさん
10/06/16 20:30:46
$_ = '1"##"#a"';
print qq#\# match #, '#', "\n" if /"#a/ && m#[^\#]\##; # こめんと; { #" ですよ}

考えてみようとして例を作っただけでつらくなってきた

566:デフォルトの名無しさん
10/06/16 20:42:23
PPIとか使ってみれば? 正規表現の中のコメントは対応
できてないみたいだけど、他は結構いけるようだよ。

567:デフォルトの名無しさん
10/06/16 23:08:27
正規表現のxオプション使ってる?

568:デフォルトの名無しさん
10/06/17 00:40:40
>>561
Text::Balanced とかは?

569:デフォルトの名無しさん
10/06/17 03:22:58
とりあえず#の後に;がない行を抜き出してみて、それでどれくらい引っかかるか見てみれば?
厳密にやろうと思えば何らかのPerlパーサを使わないと、正規表現でちょいちょいやるっていうのは無理だろうな。

570:561
10/06/17 10:33:00
>>562-569
ありがとうございます。なかなか難しいんですね・・。

気づいたのですが、秀丸とか(ほぼ)ちゃんとコメント色分け出来てますよね。
やっぱり偉大なソフトですね・・。

571:デフォルトの名無しさん
10/06/17 11:57:22
どの辺までフォローしてるのかしらんけど
Regexp::Common::commentとか


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch