Perlについての質問箱 ..
49:デフォルトの名無しさん
08/04/27 22:13:44
use libはインクルードパスを変えるだけだぞ…
50:デフォルトの名無しさん
08/04/27 22:21:09
置いたファイルを use していない、のだ。
51:デフォルトの名無しさん
08/04/27 22:42:16
>>49-50
なるほど! わかりました。
use lib でパスを通した後で、
改めて use CGI::Ex::Fill qw(form_fill fill); を行う必要があったんですね。
Fill.pm の置き場所を ./lib/CGI/Ex/Fill.pm に変更し、use したところ
まだ値は復帰しませんが、とにかく form_fill は通るようになりました。
ありがとうございました。
52:デフォルトの名無しさん
08/04/27 23:52:55
インストールすりゃいいだろ!!
53:デフォルトの名無しさん
08/04/28 03:02:57
∩___∩ /)
| ノ ヽ ( i )))
/ ● ● | / /
| ( _●_) |ノ / コイツ最高のアホ!
彡、 |∪| ,/
/__ ヽノ /´
(___) /
54:デフォルトの名無しさん
08/05/01 00:19:43
∩___∩ /)
| ノ ヽ ( i )))
/ ● ● | / /
| ( _●_) |ノ / コイツ最高のアホ!
彡、 |∪| ,/
/__ ヽノ /´
(___) /
55:デフォルトの名無しさん
08/05/01 02:11:38
Template Toolkit の質問でも良いですか?
Template Toolkit でファイルの存在判定ってできるんでしょうか?
例えばあるテンプレート内で
[% INCLUDE hoge.tt %]
を使って異なるディレクトリにあるファイルを include させたいのですが、
実際に hoge.tt が存在しない時は、"file not found"にて処理が失敗しています。
今作ってる仕組み上、hoge.tt は時と場合に応じて有ったり無かったりするので、
ファイルが無いときは、include させない制御をテンプレートのみで実装したいのです。
お願いします。
56:デフォルトの名無しさん
08/05/01 07:35:17
>>55
ここの「例外処理、フロー制御」の項読めば?
URLリンク(www.hakoniwa.net)
57:デフォルトの名無しさん
08/05/01 13:12:30
>56
ありがとうございます。
まさにそのままでしたね。
どんだけ視野狭いんだ俺。
58:デフォルトの名無しさん
08/05/02 03:25:33
perlからvb.net で作成したクラスライブラリにアクセスはできないのでしょうか?
例えばperlから、
URLリンク(homepage1.nifty.com)
のサンプルで作成したMyLibrary.dllの関数の"Add","Total"等を
使用する場合、次のような書き方では、Died となってしまいます。
どなたかご教授お願いします。
use Win32::API;
$Add = new Win32::API( "MyLibrary.dll", "Add", [N], "N") || die;
$Total = new Win32::API( "MyLibrary.dll", "Total", [], "N") || die;
<結果>
Died at D:\work\DLL_Access.pl line 27, <DATA> line 164.
59:デフォルトの名無しさん
08/05/02 14:16:23
Perl で LWPを使用したとき(activePerl) HTTP/1.1 を使用しちゃうんですが
HTTP/1.0 で通信したい場合どう指定すればいいか分かりますか?
60:デフォルトの名無しさん
08/05/02 19:07:41
>>59
環境変数PERL_LWP_USE_HTTP_10をセットする。
61:デフォルトの名無しさん
08/05/05 12:28:42
CGI掲示板を自作していますが、書き込み送信メールのSendmailによる送信処理でつまづきました。
以下のように記述すると、管理人である自分には登録メールが送られますが、
管理人以外に、書き込みした人にも登録確認メールが送られるようにしたいんです。
#Sendmailによる送信処理
if (open(MAIL,"| $sendmail -t")){
print MAIL "X-Mailer:legend2\n";
print MAIL "To: $administrator\n";
print MAIL "Errors-To: $administrator\n";
print MAIL "From: $administrator\n";
print MAIL "Subject: $subject\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "$mail_comment\n";
print MAIL "\n";
close(MAIL);
}
}
以下のどれかを使うのでしょうか?
print SENDMAIL "From: $sender <$from>\n";
print SENDMAIL "To: $to\n";
print SENDMAIL "Cc: $cc\n";
print SENDMAIL "Bcc: $bcc\n";
どうすれば良いか御教授下さい。宜しくお願いします。
62:デフォルトの名無しさん
08/05/05 13:30:13
>>61
>>1
63:デフォルトの名無しさん
08/05/06 12:23:32
>>62
知らないなら出しゃばるなよ
64:デフォルトの名無しさん
08/05/06 13:31:21
>>63
>>1
65:デフォルトの名無しさん
08/05/06 13:36:14 BE:212257038-DIA(100004)
sendmail のスレ行けよ
純粋な Perl の質問なら
標準モジュールの
Net::SMTP 使って質問しろ
66:デフォルトの名無しさん
08/05/06 13:49:56
既にwebprogに移動したようですよ。
67:デフォルトの名無しさん
08/05/06 14:41:58
こういう赤ん坊のムニャムニャみたいな質問に良く答えられるなあ。
webprogはエスパーが多いのか。
68:デフォルトの名無しさん
08/05/06 15:51:47
あっちは隔離施設なので訓練をつんだ回答官が配備されてます
69:デフォルトの名無しさん
08/05/06 16:00:05
こっちのスレは素人なので、答えられない質問が来ると他所へ追いやります。
70:デフォルトの名無しさん
08/05/06 16:01:24
>>69
> こっちのスレは素人なので、答えられない質問が来ると他所へ追いやります。
その通りなので、最初からあちらへ行ってください。
71:デフォルトの名無しさん
08/05/06 16:29:08
訓練を積んだ回答官が配備されてるんじゃなくて
「&jcode'convert(*value, 'sjis', 'euc') の *value って何ですか?」
「&ReadParse(*in) の *in って何ですか?」
「open() or &error("読み込みエラー") で読み込みエラーが表示されて困っています」
「エラーメッセージは 500 Internal Server Error です」
任務が厳しくて鍛えられてしまうんです。
72:デフォルトの名無しさん
08/05/06 18:18:54
激務だな。
それはそうと、未だにjcode.plつかってるのが出回ってるのかね。
73:デフォルトの名無しさん
08/05/06 18:28:12
use Jcode や use utf8 がクソだから jcode.pl から乗り換える気にもなれない。
わざわざ労力をかけてコードを書き直す価値が無いんだよ。
過去の古い資産をそのまま使うのでじゅうぶん。
74:デフォルトの名無しさん
08/05/06 19:26:17
最近グロブ使って書かれてるスクリプトに触ってないから
グロブはあまり使わなくなっちまったなあ。
75:デフォルトの名無しさん
08/05/06 22:59:14
しょこたんブログも飽きたな
76:デフォルトの名無しさん
08/05/07 11:44:34
Perl/tkで書いたものをWin32exe形式にするにはどうしたらいいんでしょうか?
77:デフォルトの名無しさん
08/05/07 20:09:07
perl2exe
78:デフォルトの名無しさん
08/05/08 06:57:50
UNIX環境でコマンドラインからスクリプト動かしたとき、
動かしたユーザーのidを取得するにはどうしたらいい?
スクリプトの使用制限をはかりたい。
79:デフォルトの名無しさん
08/05/08 08:26:58
>>78
$<
manくらい嫁。
80:デフォルトの名無しさん
08/05/08 13:05:01
>>78
コピーされて無効化されるぞ。
81:デフォルトの名無しさん
08/05/08 20:53:48
教えてください。
テキストファイルの中から、
hoge
を含む行を検索して、
その行をprintしたいのですけど、
一行一行読み込んで、パターンマッチして、真であれば、printする、
という方法以外に、何か方法ありますか?
(perlはテキスト処理が得意と訊いたのですが、『一行一行読み込んで』のステップがプログラムで必要か気になりました。)
ところで、cygwinでperlをはじめたのですが、何か気をつけることはありますか?
82:デフォルトの名無しさん
08/05/08 20:54:34
hogeを見つけたら前後の改行を探し出すとか。
全く意味ないけど。
83:デフォルトの名無しさん
08/05/08 21:51:51
>>81
perl -ne '/パターン/ && print' <file
84:81
08/05/08 22:37:56
レスありがとうございます。
さっぱりわからないので、教わったことをキーワードに調べてみます。
また、御願いします。
85:デフォルトの名無しさん
08/05/09 16:18:45
>>81
そういう事のためにあるのが、grep
86:デフォルトの名無しさん
08/05/09 18:25:10
まあ正規表現なんだけどな !
87:デフォルトの名無しさん
08/05/09 18:32:04
grepやsedを素っ飛ばしてperlから始めたのかな。一行野郎
なんて知らないんじゃないのかな。
88:デフォルトの名無しさん
08/05/10 14:33:02
目的:perlTk で GUI のテキスト検索ツールを作成しています。
状況:ユーザから入力された検索文字列の正規表現が不正であると、プログラムが
終了してします。 (invalid regular expression at * )
$search_string に格納された文字列が正規表現として有効であるかを、
eval を使って事前に評価したいのですが、どうしたら良いのでしょう?
if (eval (m/$search_string/)) ? これだと常に true が帰ってしまいます。
エロい人、教えてください。
89:デフォルトの名無しさん
08/05/10 14:49:04
困ったときのクックブック
6.11 パターンが有効かどうか検証する
90:デフォルトの名無しさん
08/05/10 15:12:19
qx
91:デフォルトの名無しさん
08/05/10 15:52:18
>>88
エロイ人への質問はURLリンク(venus.bbspink.com)でしなさい。
92:88
08/05/10 16:16:44
>>89
ありがとう。正規表現の箇所は全部呼んだつもりだったのに。。。
解法(p.254):
eval { ""=~ /$search_string/ };
warn "パターンが無効 $@" if $@;
>>91
性器表現に困ったときはそうします。ありがとうございました。
93:デフォルトの名無しさん
08/05/10 19:00:21
Win32::OLEを使って wordドキュメントの編集をしようとしています。
読み出しはできるのですが、テキスト編集を受け付けてくれません。
下記のようなソースで、「ABC」→「abc」としたいのですが、元の「abc」のまま出力されてしまいます。
どのようにしたらよいでしょうか?
WindowsXP SP2上で、ActivePerl 5.10と、5.8.8で試してみました。
-------------------
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Word';
$word = Win32::OLE->GetActiveObject('Word.Application') || Win32::OLE->new('Word.Application', 'Quit') || die;
$doc = $word->Documents->Open( 'test.doc' ) || die;
$paras = $doc->Paragraphs;
foreach (in $paras){
$_->Range->{'Text'} =~ tr/A-Z/a-z/;
print $_->Range->{'Text'}."\n";
}
$doc->Close( 0 );
-------------------
94:デフォルトの名無しさん
08/05/10 22:36:57
URL転送なんだけど今こうしてます↓
#!/usr/bin/perl
print "Location: URLリンク(*****\n\n)";
これに転送するまでHTMLの<meta content="x">みたいに
一定時間ウェイトかける事って出来るのでしょうか?
95:デフォルトの名無しさん
08/05/10 22:55:03
いいえ
96:デフォルトの名無しさん
08/05/10 23:04:42
>>94
>>1
97:デフォルトの名無しさん
08/05/11 02:50:29
>>94
できなくはないがやるな。
それと>>1
98:デフォルトの名無しさん
08/05/11 12:59:18
教えて先生!
01 や 11 などの文字列を数値に変換するにはどうすればいいの?
99:98
08/05/11 13:26:41
自己解決っす
他のスクリプト同様 -0 でよかったのかw
100:デフォルトの名無しさん
08/05/11 14:17:20
intでいいよ
101:デフォルトの名無しさん
08/05/12 21:23:54
モジュールでモジュールのファイル位置を知るにはどうしたらいいでしょうか?
|-foo.pm
|-data/data1
こんな感じのフォルダ構造になってて、foo.pmの中からdata1を相対参照したいのです。
102:デフォルトの名無しさん
08/05/12 21:31:33
あとcgiとして使う場合。cgiが呼ばれる度毎回dataファイルを読み込むのは処理が重くなると思うんですよ。
最初の一回だけ読み込む方法とかありませんか?
103:デフォルトの名無しさん
08/05/12 22:57:05
mod_perl
104:デフォルトの名無しさん
08/05/12 23:35:05
fastcgi
105:デフォルトの名無しさん
08/05/13 00:00:09
>>103 >>104
有難うございました。fastcgiを調べてみます。
106:デフォルトの名無しさん
08/05/13 00:14:04
>>105
Speedy-CGI
107:デフォルトの名無しさん
08/05/13 00:18:38
perlはインタプリタだから、見下すべき言語なんだろ?
108:デフォルトの名無しさん
08/05/13 00:36:37
perlはコンパイラつんでます。
109:デフォルトの名無しさん
08/05/13 00:37:57
所詮JIT
110:デフォルトの名無しさん
08/05/13 13:52:10
質問です。
package number;
sub get_codeNumber(){
my $number = 1;
if ($number > 0){
print "0より大です。";
}else{
print "0以下です。";
}
}
このplをローカルで実行しても何もコンソールに表示されません。
これをコンソールに表示するには、どうしたらよいのでしょうか。教えて下さい。
111:デフォルトの名無しさん
08/05/13 13:56:45
>>110
そんな断片だけ書かれていては釣りだとしか思えない
112:デフォルトの名無しさん
08/05/13 14:03:43
>>111
サブルーチンの中身をデバッグしたいのです。
113:デフォルトの名無しさん
08/05/13 14:13:19
>>112
問題がサブルーチン内にあるとわかっているのですか?
114:デフォルトの名無しさん
08/05/13 14:20:44
>>113
いいえ。perlの仕事がはじめてなのですが、
渡されたサブルーチンが仕様通りに動いているかを自分で確認したくて書き込みました。
Javaでいうと、
public class hoge1{
System.out.println("0より大です。");
}
public class hoge2{
System.out.println("0以下です。");
}
のような確認をしたかったのですが、おかしいでしょうか。
115:デフォルトの名無しさん
08/05/13 14:24:25
呼べ
116:デフォルトの名無しさん
08/05/13 14:30:44
>>114
ごめん,俺に理解力がないせいか何をしたいのかがよくわからない.
もうちょっと詳しく説明してくれたら助かるんだが.
117:デフォルトの名無しさん
08/05/13 14:42:28
もうちょっと実際のplに近いものを書いてみます。
お待ち下さい。
118:デフォルトの名無しさん
08/05/13 14:42:50
package number;
#sub get_codeNumber(){
my $number = 1;
if ($number > 0){
print "0より大です。";
}else{
print "0以下です。";
}
#}
119:デフォルトの名無しさん
08/05/13 14:55:04
>>118
単純に改行が入ってないからとか
stdout が flush されてないからとか
じゃないよね?
120:デフォルトの名無しさん
08/05/13 14:58:48
ちゃんと実行されてるかどうかがあやしいような
121:デフォルトの名無しさん
08/05/13 15:05:45
#torikomi.pl
package torikomi;
#戻り値:String(分類コード)
sub get_code(){
($organizationcode,$sectioncode,$itemcode) = @_;
$itemcode = "999999";
my $i1cd ="";
my $i2cd ="";
my $i4cd ="";
$i1cd=substr($itemcode,0,1);
$i2cd=substr($itemcode,0,2);
$i4cd=substr($itemcode,0,4);
if($itemcode eq "000000"){
return "A00";
}
if( $itemcode eq "999999" ){
return "Z00";
}
}
このperlが、きちんとA00やZ00を返しているかを確認したいのです。
122:デフォルトの名無しさん
08/05/13 15:11:54
「サブルーチンの中」を詳細に書けっていうんじゃなくて、
それを呼び出す側とか、実行している環境とかの詳細を書けって話だと思うよ。
123:デフォルトの名無しさん
08/05/13 15:37:02
あー、呼び出す側や実行環境のソースはもらっていません。
124:デフォルトの名無しさん
08/05/13 17:03:19
質問です。
1つのデータを複数に分割して、それぞれをgnuplotで
表示しようとしているのですが、実行すると
gnuplot> 'plot './X1.txt' using 1:2 w l 1'
^
line 0: invalid command
という風なエラーが分割したデータ全てに対して出ます。
(X1.txtというのが分割したデータの1つです。)
分割まではうまくいっているので、gnuplotの部分で問題があると思うのですが、
わかる方がいましたらよろしくお願いします。
gnuplotの部分のプログラムは以下のような感じです。
for( $j = 0 ; $j < 10 ; $j++ ){
open ( GP "| gnuplot -persist" )
or die "no gnuplot";
print GP "set term postscript color 20\n" ;
print GP "set output './X1.eps\n'" ;
print GP "plot './X1.txt' using 1:2 w l 1\n" ;
close GP;
}
125:デフォルトの名無しさん
08/05/13 17:08:42
>>124
スレ違いだが、、、
w l 1 の「1」って何だ? そんなのあったっけ?
126:124
08/05/13 17:14:59
>>125
スレ違いで申し訳ありません。
perlでプログラム書いてたんで、perlのスレで質問した方がいいかなと・・・
「1」はlineの色ですのであまり気にされなくても大丈夫です。
127:デフォルトの名無しさん
08/05/13 17:20:15
>>125
色だか線種だかを1に指定ってことだったはず.
>>124
gnuplotに流してるコマンドの最初と最後にいらないシングルクオートが入ってるせいじゃないかな?
このコピーでは問題なさそうだけど,ソースのprint文を確認してみたらいいと思う.
128:デフォルトの名無しさん
08/05/13 19:57:39
' なんてコマンドはねえよ、って言ってるだけじゃねえの?
129:124
08/05/13 23:28:23
124です。
124で書いたプログラムの間違いに気づきました。
プログラム中の「X1」は「X${j}」でした。
じゃないと、for文の意味ないですもんね。。。
あと、今自分で間違いに気づきました。
print GP "set output './X1.eps\n'"
じゃなくて、
print GP "set output './X1.eps'\n"
でしたorz
こんな簡単なミスに気づかないとは。。。
大変ご迷惑おかけしました。
130:デフォルトの名無しさん
08/05/14 00:54:44
>>121
>このperlが、きちんとA00やZ00を返しているかを確認したいのです。
Test::Base使えば良いじゃん。
131:デフォルトの名無しさん
08/05/14 02:52:29
asciiコードを16進数に変換するにはどうしたらいいでしょうか?
printf "%x","a"
こんなことやっても上手くいきません
61と表示させたいです
132:デフォルトの名無しさん
08/05/14 03:04:43
URLリンク(www2u.biglobe.ne.jp)
これみたら分かりました
133:デフォルトの名無しさん
08/05/14 03:21:56
grepでデータ中から目的の行を検索したいのですが
grep(/$foo/i, @ary);
・ignore caseは使いたい
・$fooは「+」などのデータが含まれており、そのままgrepすると正規表現と解釈されてエラーになる
・正規表現はつかわない
何かよい方法はないでしょうか?
134:デフォルトの名無しさん
08/05/14 03:32:47
>>133
quote (disable) pattern metacharactersの出番
135:デフォルトの名無しさん
08/05/14 03:35:23
ありゃッ、先頭が抜けた。
>>133
\Q quote (disable) pattern metacharactersの出番
136:デフォルトの名無しさん
08/05/14 04:14:43
>>134
grep(/\Q$foo\E/i, @ary);
でいけました。ありがとうございます
137:110
08/05/14 15:58:33
メインルーチンとの結合でうまくいきました。
相談に乗ってくれた方、ありがとうございました。
138:デフォルトの名無しさん
08/05/14 23:04:47
Windows環境で、ディレクトリ一覧を取得、正規化してリネームしたくて
いろいろやってるんだが、shift-jisの文字の扱いに苦労してる
ひょっとしてPerlでやるのあんま向いてなかったりする?
139:デフォルトの名無しさん
08/05/14 23:14:21
Unicodeであつかえばいいだろ。
140:デフォルトの名無しさん
08/05/15 19:33:10
あまりPERLの構文詳しくないので誰か教えてください
こんなのを作ってみたのですが
sub cont{print "contents\n";}
sub html{print "<html>\n"; $_[0](); print "</html>\n";}
sub body{print "<body>\n"; $_[0](); print "</body>\n";}
body(\&cont);
html(\&cont);
これを、出力が<html><body>cont</body></html>となるように
呼び出したいのですが可能でしょうか
↓動かないですが、こんな感じのことがやりたいです
1. html(\(body(\&cont));
2. sub f{html(\&&_[0]);} f(\&html);
3. sub g{$f=shift; html(\&f);} g(\&html);
141:デフォルトの名無しさん
08/05/15 19:43:23
>>140
こういうことか?
sub cont { print "contents\n"; }
sub html { print "<html>\n"; shift->(); print "</html>\n";}
sub body { print "<body>\n"; shift->(); print "</body>\n";}
html(sub { body(\&cont) } );
142:140
08/05/15 19:58:14
おお、想定通り動きました。ありがとう。
143:デフォルトの名無しさん
08/05/15 20:19:38
use strict;
use warnings;
sub binding{ my($F,@P)=@_;sub{$F->(@P)} }
sub cont {print "contents\n";}
sub html {print "<html>\n"; shift->(); print "</html>\n";}
sub body {print "<body>\n"; shift->(); print "</body>\n";}
sub cont2 {return "contents\n";}
sub html2 {return "<html>\n",shift->(),"</html>\n";}
sub body2 {return "<body>\n",shift->(),"</body>\n";}
html( binding( \&body => \&cont ) );
print html2( binding( \&body2 => \&cont2 ) );
144:デフォルトの名無しさん
08/05/15 20:21:07
windows上のperlのGDモジュールで、
日本語フォントをjpg画像で出すサンプルってありませんか。
下のサンプルをmsgothic.ttcに変えて実行したら、
どうやっても・という文字になってしまいます。
URLリンク(x68000.q-e-d.net)
145:140
08/05/15 20:41:48
>>143
このbindingってやつナイスですね
これ参考に、1タグ多要素に拡張してみます
146:デフォルトの名無しさん
08/05/15 21:51:34
>>144
PerlMagickでできるかも。
まー、内部はGDかもしれないから、同じ結果かも知れない。
147:デフォルトの名無しさん
08/05/15 22:05:34
>>144
よくわからんが、文字コードの問題とか?
148:デフォルトの名無しさん
08/05/15 22:32:06
>>144
utf8か、フォントファイルを絶対パスで指定かな。
Imagerも良いよ。
149:プヨー
08/05/16 18:03:07
Perl で Lisp のマクロのようなものを使うことはできないの?
遅延評価する仕組みがほしい。
Func1( ...exp1..., ...exp2....);
という呼び出しがある場合、状況に応じて exp1, exp2 の
いずれか一方だけを評価したい。
Func1( sub { ...exp1...}, sub {...exp2...} );
のように無名関数を渡す方法は思いついたが、
記法が簡単でないので、もっと簡単に記述できる方法がいい。
150:デフォルトの名無しさん
08/05/16 19:09:34
>>149
Lispは名前しか知らないけど、「状況に応じて」の部分を条件文にすればいいんじゃない?
関数を呼んだ時点では、引数の値が決定してないってこと?
そうだとしても、値が決定するまで待つとかすればいいような気がする。
Lispがわからない人でもわかる説明で。
151:プヨー
08/05/16 19:31:07
> Lispは名前しか知らないけど、「状況に応じて」の部分を条件文にすればいいんじゃない?
そうなんだけど、
if (,,,) { ... } else {...}
のような定型化した条件文が大量にあるから、きれいじゃないんだよね。
それよりも、単に
Func1( ...exp1..., ...exp2....);
のように書けば一行ですむから、保守性が高くてクールだよね。
> 関数を呼んだ時点では、引数の値が決定してないってこと?
そう。Lisp のマクロというのは、必要に応じて引数を eval するみたいなものだよ。
Lisp のマクロはコードを簡単化するために使われることが多い。
152:デフォルトの名無しさん
08/05/16 20:02:14
>>151
sub exp1{ .... }
sub exp2{ .... }
Func1(\&exp1, \&exp2)
でいいんでないの?
153:デフォルトの名無しさん
08/05/16 20:02:34
>>151
質問が漠然すぎるんだが、、、
my %hash = (
foo => sub { print "foo\n" ; },
bar => sub { print "bar\n" ; },
);
$hash{foo}->() ;
こう言うこととかしたいのか?
それともif文を三項演算子?
154:デフォルトの名無しさん
08/05/16 20:04:34
常に先行評価のPerlで急に遅延評価になったら保守性が著しく低下するだろ
sub { } で我慢しろ。どうしても黒魔術を発明したいならソースフィルタを使って何とかすればいい
155:デフォルトの名無しさん
08/05/16 20:30:18
exp1,exp2が長い場合、保守性がいいとは思えないし
>>149が考えたコードも改行位置ちょっと変えてあげれば複雑にはみえないし
関数を読んだ時点で引数の値が決まってないのは
コードがタコなだけな気がしてならないので
せめて、もう少し具体的に書いてもらえないかな
とりあえずFunc1の中でevalしたいならそうすればいいんじゃ?
Func1(
q(...exp1...),
q(...exp2...)
);
sub Func1 {
my($exp1,$exp2) = @_;
#なんかいろいろ
my $exp = $COND ? $exp1 : $exp2;
eval "$exp";
}
156:デフォルトの名無しさん
08/05/16 21:45:27
初歩的な質問で申し訳ないのですが
クッキーにデータを入れるときエスケープなどの処理をしてから入れたほうがいいのでしょうか?
よろしくお願いします。
157:デフォルトの名無しさん
08/05/16 23:13:35
>>156
URLエンコードと同じエスケープがいるよ。
日本語化されたRFCもあるから、読んでみれば?
もっと簡単にやるなら、CGIモジュールに全部任せる。
158:デフォルトの名無しさん
08/05/16 23:57:48
>>157
なるほど。クッキーはURLエンコードですか。勉強になりました。
159:デフォルトの名無しさん
08/05/17 01:38:05
最終的に決められた文字だけになるなら、任意のエスケープ方式でいい
160:デフォルトの名無しさん
08/05/17 13:25:57
要素数が同じlistとvalueがあるときに、同じ添え字の処理ってどうやって書きますか?
#こんなのがほしい・・
for $i $j(@list @value){print "$i=$j";}
タプルみたいなのがあれば使いたいんですが
やっぱり添え字をインデックスにしてループするしかないんですかね
161:デフォルトの名無しさん
08/05/17 13:35:43
どういうときに便利になる?
その例でもwhile shiftで事足りるし。
162:デフォルトの名無しさん
08/05/17 13:40:01
use List::MoreUtils qw(each_array);
163:デフォルトの名無しさん
08/05/17 13:54:11
zipWithを書けばおk
164:デフォルトの名無しさん
08/05/17 13:55:32
単に短く書きたかっただけなんですが、あまりPERL使いこなせてはないので・・
shiftだとこんな感じでしょうか。
while(@list){print shift @list;print "=";print shift @value;}
これはこれで、短くていいですね。
165:デフォルトの名無しさん
08/05/17 13:57:38
while($i=shift@list and $j=shift@value){print "$i=$j";}
166:デフォルトの名無しさん
08/05/17 14:04:10
>>162
オブジェクト指向部分はあまりわかってないので後ほど調べてみます。
>>163
sub zipwith{shift->(shift,shift);}こんな感じですかねw
ちゃんと動くかはこれから試してみますが・・
>>164
こっちのが全体的にいいですね、トン
167:デフォルトの名無しさん
08/05/17 14:38:21
練習がてら作ってみました
@a=qw(a b c);
sub zipwith{($f,$l,$r)=@_;while($i=shift @$l and $j=shift @$r){$f->($i,$j)}}
zipwith(sub{($a,$b)=@_;print "$a=$b\n";},\@a,[1,2,3]);
関数へ複数の配列を渡す際にはリファレンスにしないとだめってのは少し不便ですね
168:デフォルトの名無しさん
08/05/17 17:31:48
perlの勉強中で
カメラ 785円
お菓子 98円
…
という文字列がファイルであるのですが
if(円という文字を含んでいたら)
$temp = "円より前の数字";
という風に文字の抽出を行いたいのですが
正規表現の部分と、抽出の部分がわかりません
ファイルの読み込みから1行だけを取り込むのは出来たのですが
ご指導お願いいたします。
169:デフォルトの名無しさん
08/05/17 17:55:32
/円/ and $temp = $`;
170:デフォルトの名無しさん
08/05/17 18:12:27
すいません、上手く動かないみたいです
171:デフォルトの名無しさん
08/05/17 18:23:41
ちょっとかんべん
172:デフォルトの名無しさん
08/05/17 22:31:48
perlっていうかsendmailについてなんですが…
open(MAIL, "| /usr/sbin/sendmail -t env_addr") or die $!;
# 中略
close(MAIL) or die $!;
のように、パイプ渡しでopenするとき、closeに失敗するときがあるんですが、このとき
エラーメッセージを捕捉する方法どなたかご存じですか? $!には入ってこないのです。
173:デフォルトの名無しさん
08/05/17 22:34:32
>>172
エラーメッセージは何処に出るの? 標準出力ならIPC::Open2, 標準エラー出力ならIPC::Open3参照。
174:デフォルトの名無しさん
08/05/19 11:53:11
#!/usr/bin/perl
$inputfile="test.txt";
open (FILE1, ">>$inputfile") or die "$!";
for ($hoge=0;$hoge<10;$hoge++) {
print FILE1 "$hoge";
sleep(1);
}
close (FILE1);
このプログラムを同時に2つ実行すると、私の予想ではtest.txtの中身は
00112233445566778899
となると思うのですが、なぜかファイルの中身には
01234567890123456789
と出力されます。
perlは排他制御が勝手に行われたりするんでしょうか?
175:デフォルトの名無しさん
08/05/19 11:54:52
バッファリングされてるから
176:デフォルトの名無しさん
08/05/19 11:56:39
>>175
どういうことでしょうか?
もし正しくバッファリングされるのならflockなどの排他制御は不要な気が…。
すいませんがもう少し詳しくお願いします。
177:デフォルトの名無しさん
08/05/19 12:05:50
どのタイミングでflush()されるかわからないのに、それに依存しちゃダメでしょ
ちゃんと排他制御しなよ
178:デフォルトの名無しさん
08/05/19 12:27:50
なんとなーく分かりました。ありがとうございました
179:デフォルトの名無しさん
08/05/20 19:30:53
cryptの返り値はsaltと同じ半角英数字、半角スラッシュ、半角ピリオドの範囲で
salt2文字と残り11文字ってことでってますでしょうか。
180:デフォルトの名無しさん
08/05/20 19:31:58
あってますでしょうか、の誤字でした。あとあげます。
181:デフォルトの名無しさん
08/05/20 20:50:16
いいえ。ホストのcrypt(3)に依存です。
182:デフォルトの名無しさん
08/05/20 20:53:22
マニュアルを読むのは身分の低い下賎の民の仕事なので、
高貴な方々は、他人にマニュアルを読ませます。
183:デフォルトの名無しさん
08/05/20 21:02:57
だからいつまでたっても
184:デフォルトの名無しさん
08/05/20 23:59:36
これだからゆと(ry
185:デフォルトの名無しさん
08/05/21 01:05:07
言っても無駄だから、適当にヒントなり与えてスルーしようよ。
186:デフォルトの名無しさん
08/05/21 01:13:28
>>182 職業に貴賎なし。
だが、海外にも目を向けるとインプリする人はいっぱいいるから、
そういう志向はありだと思う。
187:デフォルトの名無しさん
08/05/21 18:46:46
ファイルテスト演算子を再定義することって可能でしょうか?
188:デフォルトの名無しさん
08/05/21 20:52:09
むり
189:デフォルトの名無しさん
08/05/22 01:15:29
「独習 perl」を一冊
やり通したのですが、次は何をすべきでしょうか?
perlの機能を覚えただけで実用的な使い方は学べていません。
次は何をしたらいいでしょうか?
190:デフォルトの名無しさん
08/05/22 01:28:32
何かを作る。
ファイルの一括処理プログラムとか、板違いではあるがCGIなんかでもいい。
191:デフォルトの名無しさん
08/05/22 03:09:43
自分が何をしたいのか、わかりません。
てか?
192:デフォルトの名無しさん
08/05/22 03:15:25
そもそも何で perl をやろうとしたのかって話だ
193:デフォルトの名無しさん
08/05/22 03:50:29
プログラムって何かを作るためにある道具であって
何を作るかは作り手が考えなきゃどうしようもなかろう。
194:デフォルトの名無しさん
08/05/22 04:11:01
>>189
適当なフリーのCGI等をダウンロードして
辞書的に使える本(Google先生でもOK)で調べながら
ソースを読んでみる。
ある程度理解できるようになったら、それを少しだけ改造してみる。
これを繰り返すだけでも相当勉強になると思うよ。
195:デフォルトの名無しさん
08/05/22 09:02:43
ネットに転がってるperlで書かれたCGIやCGI解説本のソースはほぼ100%クズなので
初心者はそんなものを見てはいけない。
196:デフォルトの名無しさん
08/05/22 09:14:39
言いますね…
197:デフォルトの名無しさん
08/05/22 10:03:26
まあ、メジャーな掲示板のcgiコードもひどいもんだ。
一番良い例が、しばらく前までの2ch。
今動いているのはプロが書いたはずだから、ちゃんとしているはずだけど、
公開されてんのかね。
198:デフォルトの名無しさん
08/05/22 10:13:12
フリーGGIはオススメできない
書き方が古いから。
199:デフォルトの名無しさん
08/05/22 10:41:17
>>191
自分がやって「楽しい」と思うものでなければ、長続きしない。
例えば、任意の文字列を入力すると、
▄ ▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄ ▄▀ ▄▄█▄▄ ▄▄ █▄▄▄▀ █
▄▀ ▄▀ ▄ ▀ █▄▄█▄▄ █
▄█▄▄ █ █ █▄▄█▄█ █
█ ▄▀ █ █ █ ▄▀▀▀█▄ █ █ ▄ █ ▄
▀▄▄▄▄▄▄▄▄ ▄▀ ▀▄▄▀ ▀▄▄▄▀ ▀ █ ▀▀▀▀ ▀ ▀█
に変換するスクリプトを作ってスレを荒らすというのはどうだ?
200:デフォルトの名無しさん
08/05/22 11:22:02
>>199
それくれw
201:デフォルトの名無しさん
08/05/22 12:34:25
>>197-198
同じ事をするにも何通りも書き方がある,
というのとは違うのかい?正直わからん。
202:デフォルトの名無しさん
08/05/22 12:37:30
>>197
2chのbbs.cgiは8年ぐらい前に流出した以外に表に出てないと思うのだが。
203:デフォルトの名無しさん
08/05/22 16:25:48
>>201
perlのCGIがブームだった頃に作られた遺産がたくさん残ってる。
それらは大抵perl4時代のコードのままメンテナンスされてない。
204:デフォルトの名無しさん
08/05/22 17:32:22
元々の>189からの話の流れからすると、特定のものを批判するより
これ読めってのを挙げた方がいいと思うが、定番といえそうなものがないな。
205:デフォルトの名無しさん
08/05/22 17:34:57
普通に推奨本のコードを真似れば良いよ。
206:デフォルトの名無しさん
08/05/22 18:19:24
ラマですね、わかります。
207: ◆TWARamEjuA
08/05/22 20:21:28 BE:1961429-2BP(7088)
おいちゃん=プロですね。わかるます。
208:デフォルトの名無しさん
08/05/22 20:32:50
やっぱある程度面白くないとね。
mailあたりをいじってみたらどうかな
209:デフォルトの名無しさん
08/05/22 20:44:22
>>189
2-gramの全文検索エンジンの試作オススメ。
リスト処理や文字列処理などまんべんなく入ってる。
210:デフォルトの名無しさん
08/05/22 20:59:36
モチベーション最強は、やっぱエロだろ。
211:デフォルトの名無しさん
08/05/22 21:12:29
・出版ブームが終了してまともな本が出てない
・Apache + mod_perlでも面倒なのにモジュールとか考えたくない
・webで探すとまともにメンテされてない糞ページがヒットしまくる
・Perl自体の記法が自由すぎるせいでそのページのコードが古いのかこっちの設定ミスなのでエラー出してるのか区別ができない
参入障壁高すぎ
212:デフォルトの名無しさん
08/05/22 21:37:14
>・出版ブームが終了してまともな本が出てない
>>2以外の本はビブリオマニアでなければ必要ないよ。
>・Apache + mod_perlでも面倒なのにモジュールとか考えたくない
文の前後が繋がってないよ。
>・webで探すとまともにメンテされてない糞ページがヒットしまくる
Perlの疑問はググる前にperldocだよ。
>・Perl自体の記法が自由すぎるせいでそのページのコードが古いのか
>こっちの設定ミスなのでエラー出してるのか区別ができない
最新のperl(1)でもPerl4時代のコードが問題なく動くよ。
混ぜておかしくなるのは「新旧」でなく「お作法」だよ。
213:デフォルトの名無しさん
08/05/22 23:42:33
Perlでクロスワードパズルつくってみたいんだ
まずは その準備として単語(表記はカタカナで)とその対応説明が
登録されているデータベース(Excelでもテキストでもなんでもいい)
が必要です。どなたか知ってたら教えてください。それではおやすみ。
214:デフォルトの名無しさん
08/05/22 23:46:34
>>213
っ[Wikipedia]
215:デフォルトの名無しさん
08/05/23 00:01:31
クロスワードパズルは数理パズルじゃなくて、おちゃらけクイズごっこだから得る物ないよ
216:デフォルトの名無しさん
08/05/23 01:46:17
chasenの辞書からも取り出せるんじゃないかな。
217:デフォルトの名無しさん
08/05/23 01:51:48
茶筅の辞書に言葉の意味なんて入ってないだろ
218:デフォルトの名無しさん
08/05/23 07:32:37
>>213
クロスワード作るのとPerlは無関係
まず紙に書いて作ってPerlで起こす時に分からないことあったらまた質問しな
219:デフォルトの名無しさん
08/05/23 23:40:22
\xe3\x80\x9cは変換できるのに、\xc2\xa2は変換できん。何故?
$PTNの内容をs///にべた書きすると変換できるようになる。何故?tr///が高速ならこんなことせんでもええのに。何故?
(ver. 5.8.5)
use encoding "utf8";use Encode;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
$PTN="(\xe3\x80\x9c|\xc2\xa2)";
%HASH=("\xe3\x80\x9c"=>"\xef\xbd\x9e","\xc2\xa2"=>"\xef\xbf\xa0");
while(<STDIN>)
{
s/$PTN/$HASH{$1}/geo;
print;
}
220:デフォルトの名無しさん
08/05/24 02:10:23
URLリンク(w8ac6nxs.hp.infoseek.co.jp)
perlで書かれたCGIゲームです。
パーラーのみなさん、ユーザーとして
どうぞ登録してください。
まだプレイヤー4人くらいしかいません。
ユーザーの50%をパーラーにしたいという
計画です。
221:デフォルトの名無しさん
08/05/24 03:24:15
>>219
$PTN="(\x{301C}|\x{00A2})";
222:デフォルトの名無しさん
08/05/24 03:26:18
>>219
スレリンク(tech板)
223:デフォルトの名無しさん
08/05/24 11:07:24
>>221
ダメでした。
\x{00a2}が\xc2\xa2じゃないものになってしまいます……。
224:デフォルトの名無しさん
08/05/24 11:51:07
>>前スレ928の方
utf8を扱う tr/// で再帰時に落ちる件、ActivePerl 5.10.0.1003 では正常になっていました。
詳細は未確認だけど、33747 のmg.cへの修正が効いている感じ。
225:デフォルトの名無しさん
08/05/24 13:24:03
>>215
英会話の勉強とか。。。perlのコマンド、モジュール名だけでできたクロスワードだったら
といてみたいかも。
226:デフォルトの名無しさん
08/05/24 13:25:32
>>225
「Head First Java 第2版―頭とからだで覚えるJavaの基本 (単行本) 」
ではJavaに関連した単語でクロスワードパズルがあった。
227:デフォルトの名無しさん
08/05/24 17:26:41
>>219
ソースコード中に「use utf8」の宣言が無いから、全ての文字列は、
UT8フラグの無い、シングルバイトの文字から構成されていることになる。
ネット上の情報からすると、Perl では、UTF8 フラグ
なし文字列を Latin-1 文字列とみなしている(らしい)。次に、
binmode STDOUT, ":utf8";
の宣言があるから、print 文等において文字列が出力される際には、
シングルバイトのLatin-1 文字列が、utf8に変換される。その結果、
このような現象が起きる.....ということでいいのかな?
間違っていたら、エロイ人、修正して下さい。
228:デフォルトの名無しさん
08/05/24 19:50:41
だから猿用のテンプレを何で貼らんのよ?
229:デフォルトの名無しさん
08/05/24 19:58:46
>>227
>>3
#!/usr/bin/perl -w
require 5.008001;
use encoding 'utf8';
print utf8::is_utf8('binary?') ? 'with utf8 flag' : 'binary';
__END__
>>228
utf8 プラグマも encoding プラグマも使わないに越した事ないし。
フラグの有無で悩むより、マルチバイト文字処理が本当に
必要な箇所でだけフラグ付け外しする方がよっぽど楽。
230:デフォルトの名無しさん
08/05/24 20:02:05
つーかおまえら。
shは使わない方がいい、Perl使うべきだ。
とかいって、perlで
$test = `cat /home/test/test.txt`
とか多様してるやつってなんなの?
231:デフォルトの名無しさん
08/05/24 20:02:50
Missing ;
232:デフォルトの名無しさん
08/05/24 20:22:26
使うななどとどこのどいつが言ってるんだ?
ものぐさ番長=パーラーだ。
233:デフォルトの名無しさん
08/05/24 20:34:51
猿用のテンプレってこれだっけ?
次スレからは入れような。
---------------------------------------------------------
# 【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)";
# 次に、あなたが実行したい処理の内容を入れて下さい。
print "SJISには、「十表貼申予暴」のようなダメ文字がある。\n";
sleep(1);
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。
234:デフォルトの名無しさん
08/05/25 02:05:50
>>230
if( `[ -f /home/test/test.txt ]` ) {
$test = `cat /home/test/test.txt`;
235:デフォルトの名無しさん
08/05/26 21:58:51
>>219です。
結局、\xc2\xa2の置換は諦め、別ツールで提供することになりました。
別のバージョンとか調べている時間がない……。
236:デフォルトの名無しさん
08/05/26 22:16:31
>>234
if( -f /home/test/test.txt ] )
{
$test = `cat /home/test/test.txt`;
}
237:デフォルトの名無しさん
08/05/26 22:17:11
>>234
if( -f /home/test/test.txt)
{
$test = `cat /home/test/test.txt`;
}
238:デフォルトの名無しさん
08/05/26 22:57:43
普通
my $test = `cat /home/test/test.txt` if(-f /home/test/test.txt);
だろ
239:デフォルトの名無しさん
08/05/27 01:22:49
>>238
>>230
240:デフォルトの名無しさん
08/05/27 22:41:24
C言語のプラグラミングできたお。
void main(int argc, char**argv)
{
system("cat /home/test/test.txt");
}
241:デフォルトの名無しさん
08/05/27 22:48:04
URLリンク(www.amazon.co.jp)
これが書かれた頃は perl など無かったが
まさに、system() 関数使いまくろう!的な内容。
242:デフォルトの名無しさん
08/05/28 00:33:29
cでやるとすごく損した気になるんだよなあ
243:デフォルトの名無しさん
08/05/28 18:50:42
perlでやっても損でしょ。
perlでできる処理はperlでできるだけやるべき。
catとか。
244:デフォルトの名無しさん
08/05/28 19:08:58
>>243
確かにそうなんだけど、catについてはそうかな〜。
perl だったら、open,while,colose (またはread)とかで三段処理踏まないといけないから、
cat なんかは $test = `cat file.txt` なんかはよく使う。
実際どっちが早いとかBenchとったことはないけど・・・。
245:デフォルトの名無しさん
08/05/28 19:09:46
失敬、close間違い
246:デフォルトの名無しさん
08/05/28 19:12:39
かなり遅いよ、perlで外部コマンド実行したら。
相当な差がある。
コード的には段階踏んでるが。
247:デフォルトの名無しさん
08/05/28 19:20:10
一つ関数を書くか、CPANから探してきて使うだけでしょ
248:デフォルトの名無しさん
08/05/28 19:36:06
qxはforkしてshell起動して実行して・・・って感じなので
perlだけで終わらせたほうが圧倒的に早い
File::Slurp使うか、入れるのめんどくさかったら
sub slurp {open my $fh , $_[0] || die("$_[0]:$!");local $/;<$fh>}
って書いとけばOK
249:244
08/05/28 20:06:16
いやいや、そりゃあ自分も本格的な(?)スクリプト書く時や、
複数のファイルにループ処理する時はサブルーチンで書いたりするよ。
そうでなくて、ちょっとした確認とかで数行のスクリプトとか、
コマンドラインからのワンライナーみたいな感じで書く時には便利かな ってゆうぐらい。
そんな時にまで、いちいち、useやrequireやsub{}なんて書きたくないじゃん。
250:デフォルトの名無しさん
08/05/28 20:21:38
>>244
数行だとか、処理速度とか処理効率を考えなくていいなら便利。
あくまでコマンドレベルの用途ね。
ただ不明なのが、
>サブルーチンで書いたりする
ってとこ。
関係が不明なんだけど。
251:デフォルトの名無しさん
08/05/28 20:50:01
むっか〜しは、sortは外部コマンドでやってたりしたもんだ。
環境やバージョンが変わったら、こまめにベンチマーク取って
最適の方法を探らないとね。
252:デフォルトの名無しさん
08/05/28 21:09:03
「cat を使う」
…ねえ。知ってると思うけど
$ cat > foo.pl
#!/usr/bin/env perl -n
print ;
}
{
print "foo\n" ;
# control + D をタイプ
$ perl foo.pl foo.pl foo.pl
$ perl -lne '}{ print $. ;' foo.pl
253:デフォルトの名無しさん
08/05/28 21:25:17
そいつは初耳だ
解説よろしく
254:デフォルトの名無しさん
08/05/28 21:46:36
>>253
optionに関しては perl -h するなりで
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
で実際の挙動を見るには
perl -MO=Deparse -ne 'print;'
この結果を見ると while ループで単純にかこってあるだけだから
ループの終りの「}」と無名ブロックの始まりの「{」を入れて
好きな様に処理させる。
応用すれば、「tsvの第二カラムの積算」なんてのは
perl -lane '$t += $F[1] ; }{ print $t ;' FILE
スクリプトファイルにしたときも同じ事。B::Deparse にて確認して。
perl -MO=Deparse foo.pl
あとはお好みに。これで手に負えない時とかstrict適用したい時は
普通に書きゃいいだけだし。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5382日前に更新/139 KB
担当:undef