Perlコーディング初心者質問スレ Part 56at PHP
Perlコーディング初心者質問スレ Part 56 - 暇つぶし2ch511:nobodyさん
07/11/09 15:33:58
UTF-8でperlを書きたいのですが、文字コードをperlにどのように知らせればよいのでしょうか?

512:nobodyさん
07/11/09 15:47:46
>>511
plagger のソース読むといいよ!

513:nobodyさん
07/11/09 17:28:52
>>512
それ無理に流行らそうとしなくていいよ

514:nobodyさん
07/11/09 17:49:37
tokuhirom自重

515:nobodyさん
07/11/09 18:08:33
Perl死んじゃうん?

516:nobodyさん
07/11/09 18:57:53
(・∀・)ニヤニヤ

517:JAPU ◆lVJAPUTeX.
07/11/09 18:59:46
>>511

use utf8;


518:nobodyさん
07/11/09 19:09:09 8S2oyKnm
>511
use dan;
で解決するよ。

519:nobodyさん
07/11/09 19:26:50
tokuhirom の直近の発言をコピペすることによりスレを荒らす tokuhacks.

520:nobodyさん
07/11/09 21:31:54
plaggerのソース読めって言ってるやつのほとんどはplaggerのソースが読めない

521:nobodyさん
07/11/09 22:28:46
コード解説読めってならともかくコード読ませたってしょうがないだろ。Perlなんだから

522:nobodyさん
07/11/09 23:35:40 8S2oyKnm
tokuhiromのソース読めって言ってるやつのほとんどはtokuhiromのソースが読めない


523:nobodyさん
07/11/09 23:39:07
プラガー(笑)

524:nobodyさん
07/11/10 10:49:28 Z9OcedPC
web上の圧縮ファイル(.lzh)をダウンロードして保存、
さらにその圧縮ファイルを解凍するスクリプトを作りたいです。

例えば、LWP::Simpleを使った場合
my $dat = get('URLリンク(hoge.com)');
の後はどう処理していけばいいでしょうか?


525:nobodyさん
07/11/10 11:02:39
> の後はどう処理していけばいいでしょうか?

lha 書庫を解凍する処理を行えばよい。

526:nobodyさん
07/11/10 11:03:28
>>524
はい。
URLリンク(www.google.co.jp)

527:nobodyさん
07/11/11 02:16:45
2chみたいに携帯から固有のIDを作りたいんですが
どうすればいいんでしょうか。

528:nobodyさん
07/11/11 07:14:50
>>527
i-mode:UTN
EZweb:HTTP_X_UP_SUBNO
Y!:UA

529:nobodyさん
07/11/11 14:32:10 4iiY3aOI
正規表現について質問です。
urlからファイル名だけを取り出したいです。
例えば、$urlという変数に下の3つのurlがあった場合は
hoge1.html, hoge2.html, hoge3.htmlを取り出したいです。

URLリンク(localhost)
URLリンク(localhost)
URLリンク(localhost)

下のように自分でやってみたのですが、localhostの前の/から取得してしまいます。
if( $url =~ /\/(.*\.html)$/ ){
print $1 . "\n";
}

どうすればやりたい事ができますか?
教えてください、お願いします。

530:nobodyさん
07/11/11 14:35:11
ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。

あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?


531:529
07/11/11 14:47:19
>>530
レス有難うございます。

>ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。
なるほど。でも頭では理解できてもそれをコーディングするとなると・・・
.*の部分を弄ればいいのかなぁ。

>あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?
はい、このパターンは今回ありえないっす。

532:529
07/11/11 14:58:10
条件文を下のコーディングに変更したらできました。
if( $url =~ /\/([^\/]*\.lzh)$/ ){

正規表現すげー
>>530さんアドバイスありがとうございました。

533:nobodyさん
07/11/12 08:03:25
.*?も覚えたらいいとおも

534:nobodyさん
07/11/12 16:33:29 XNEEDQVz
そのファイルがバイナリなのかテキスト(shift-jis,euc,utf8)なのかを判断するにはどのようにしたら良いのでしょうか?

最初、linuxの fileコマンドを使用していたのですが誤認識がよくあり使えません。
バイナリなのかテキストなのかだけ分かればいいのですがperlでそれを行うにはどのようにしたら良いのでしょうか?

535:nobodyさん
07/11/12 16:42:39
ファイルテスト演算子

536:nobodyさん
07/11/12 18:17:28 XNEEDQVz
>>535
有難う御座います。
試してみましたが、EUCだったり10文字程度のcp932などの場合に誤認識するようです。

537:nobodyさん
07/11/12 18:33:52
\0が含まれてればバイナリでいいんでないの
それ以外だと各文字コードの仕様を調べて
全データがそれに矛盾してないか判断するしかないと思

538:nobodyさん
07/11/12 18:39:12
正規表現使えばいいじゃない

539:nobody
07/11/13 03:52:36 fKqfq45H
URLリンク(www.jpopfan.co.jp)
上のサイトのようなゲームをperlで作りたいと思っています。
htmlのみでも十分なゲームだとは思いますが、あえてCGIゲームとして作りたいです。
(学校の授業の自由課題であるので・・・)

一応以下のようにhtmlは作ってみました。

<html>
 省略
<body>
<h1>オーケストラ楽器別診断</h1>
<p>次の質問にお答えください♪</p>
<form action="/nussknac/cgi-bin/kadai.cgi" method="post">
<dl><dt>お名前</dt>
<dd><input type="text" name="name" value=""></dd><br>
<dt>Q1. あなたはプライドが高いほうですか?</dt>
<dd><ul>
<li><input type="radio" name="answer1" value="Yes" checked>Yes</li>
<li><input type="radio" name="answer1" value="No">No</li>
</ul></dd></dl>
<p><input type="submit" name="send1" value="送信"><br></p>
</form></body></html>

540:nobody
07/11/13 03:57:04 fKqfq45H
539の続きです。
HTMLのフォームから情報をCGIに送り、最初の質問に対してYesならAの質問、NoならBの質問・・・というように
答えによって質問を分岐させるように作りたいです。
if文でひたすら分岐するというイメージはありますが、どうすれば、送信ボタンを押した時に次の質問ページにリンクさせる事ができるかが分かりません。
質問ページは一つ一つ作りたいです。
よろしくお願いします。

541:nobodyさん
07/11/13 04:18:50
そういうアルゴリズムも含めて課題になってるんじゃねーのか・・・まぁいいけどさ。
で、htmlはともかくどこまでperl書いたのよ。まさか1行も書かずに相談しにきてるわけじゃあるまい?

542:nobodyさん
07/11/13 06:54:14
何日か前に別のスレでも見たけど、ここで聞いてて課題間に合うの?

543:nobodyさん
07/11/13 08:58:39
あみだくじでいいのか、選択によってポイントがたまってその結果で振り分けられるのか。
色々ロジックはあると思うけど、そこら辺はどうするのかな

544:nobodyさん
07/11/13 09:17:32
>542
提出日まで1~2週間とかなら大丈夫じゃない?

その昔、C言語の授業があって、その授業終了直後に提出したら怒られたことがあったなあ(笑)
ごめん、確かに授業聞いてませんでした。

545:nobodyさん
07/11/13 09:19:51
あみだくじでいいなら、
<li><input type="radio" name="answer" value="Aの質問のURL" checked>Yes</li>
<li><input type="radio" name="answer" value="Bの質問のURL">No</li>
ってして、
print "Location: answerの値\n\n";
でリダイレクトさせていけばいいだけでは?

546:nobodyさん
07/11/13 10:36:02
HTMLでおk

547:nobodyさん
07/11/13 11:10:10
リンク元のURLに%??%??~が含まれてる場合に、その文字をデコードしてUTF-8として表示しようとしています。
元の文字コードがUTF-8のときは問題なく表示できるのですが、
文字コードの判別を含めてやる場合どうやったらいいのでしょうか?
Perlのバージョンは5ですが、プロバイダ(@nifty)のサーバーのため標準モジュールを使用できません。
いきなり変換が難しいならUTF-8か否かを判別できれば、
UTF-8の場合→直デコード
UTF-8でない場合→直デコード→jcode.plで変換
でいいのかもと考えているのですが、UTF-8か否かの判別法がわかりません。
よろしくお願いします。


548:nobodyさん
07/11/13 15:19:48 lcS1D/Cp
539です。
一応perlでは以下のように作りました。
#!/usr/local/bin/perl

use CGI;
$query = new CGI;

$q1 = $query->param('answer1');
if ($q1 eq Yes) {
open(F, ">>q2.html");
} else {
open(F, ">>q3.html");
}

でもこれだとエラーが出てしまいます。
どのように直せばいいでしょうか。
リンクのさせ方など教えて下さい。
課題提出は12月までです。
違うスレには書いていないので私ではないです。

549:nobodyさん
07/11/13 15:34:47
use constant Yes => 'Yes';


550:nobodyさん
07/11/13 15:56:31
課題は自分でやれwww

551:nobodyさん
07/11/13 16:29:42
>>54
こんな感じはどうよ。適当に書いたからちゃんと動くかどうか知らんけど。
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use FileHandle;
use File::Spec;

my $cgi = CGI->new;
my $fh = FileHandle->new;
my $html_dir = '/path/to/html/dir';
my $output = $cgi->header( -type => 'text/html' );
my $fn = q{};

if ( $cgi->param('answer1') eq 'Yes' ) {
    $fn = 'q2.html';
}
else {
    $fn = 'q3.html';
}

$fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<');
my $data = do { local $/; <$fh> };
$fh->close;
$output .= $data;

print $output;


552:nobodyさん
07/11/13 16:30:23
レス番ミスった。
>>54
>>548

553:nobodyさん
07/11/13 16:31:27
さらに訂正。
誤 $fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<');
正 $fh->open( File::Spec->catfile( $html_dir, $fn ) '<');

554:nobodyさん
07/11/17 14:33:33 GlJQ98hk
URLリンク(oshiete.new-akiba.com)
ここを見ながらコマンドプロンプトを操作しているのですが
ダウンロードされる段階まで行っても
Can't locate strict.pm in @INC (@INC contents: .) at C:\Program Files \warrick\warrick.pl line8.
BEGIN failed--compilairion aborted at C:\Program Files \warrick\warrick.pl line8.
と出ます。

意味もそもそも分からないのですが、解決方法教えてください

555:nobodyさん
07/11/17 15:24:40
>>554
エラーの原因は@INCが空になってるから。なんでそうなってるのかは知らん。
ActivePerlを入れ直してみたら?

あとここはコーディングスレだからスレ違いだと思わなくもない。

556:nobodyさん
07/11/17 20:14:46
>>555
最新版入れてみたけど同じでした
質問スレいってきます

557:nobodyさん
07/11/17 20:58:37
>>にアンカを3つだけつけたいんだけど、これだと同じとこにリンクをかけてしまいます。
どうすればいいんでしょうか。
for($i=0;$i<3;$i++)
{
$str=~s/>>[0-9]{0,10}[-]{0,1}[0-9]{0,10}/<a href="$_[1]p=$&">$&<\/a>/;
$str=~s/p=>>/p=/;
}

558:nobodyさん
07/11/17 22:00:49
$i = 0; $buf =~ s/(>>\d+)/$i++ < 3 ? "LINK:$+" : $+/egs;

559:556
07/11/17 22:23:56
>>558
ありがとうございます。
そんな書き方知りませんでした。

560:557
07/11/17 22:26:54
>>559
556じゃなくて557でした

561:nobodyさん
07/11/18 19:50:49
自作モジュールをロードするときに、BEGINブロックで@INCに追加してからBEGINの外でuseするのは外道


562:561
07/11/18 19:51:25

「ですか?」が抜けた。
すまぬ

563:nobodyさん
07/11/18 20:25:36
>>561-562
外道かどうか知らんが、普通は use lib でしょ。

564:nobodyさん
07/11/19 06:13:08 s0DcKkZM
これからプログラムをやりたいと思ってます。
いまからやるならperlは覚えたほうがいいですか?

565:nobodyさん
07/11/19 06:19:02
PHPでいいよ

566:561
07/11/19 08:54:57
>>563
ありがt

567:nobodyさん
07/11/20 11:38:30 PLctc9ni
多重起動の禁止はできたが、解放がうまくいかない。
どこが悪いか教えてください。

#登録&多重起動禁止
use Win32::API;
use Win32::Mutex;
my $mutex = Win32::API->new("kernel32","CreateMutex",["N", "N", "P"], "N");
die "二重起動" if(Win32::Mutex->open('TestProgram123'));
$mutex=Win32::Mutex->new(1, 'TestProgram123');


#解放
my $releacemutex = Win32::API->new("kernel32","ReleaseMutex",["N"], "N");
$releacemutex->call($mutex);


568:576
07/11/20 14:43:38 PLctc9ni
自己解決

Win32-API使わなくてもできるのねぇ

569:nobodyさん
07/11/21 03:27:48
むしろ何の為のラッパーだよ

570:nobodyさん
07/11/23 21:52:32 BH2PwYj+
質問失礼します。

AとBの文字があるとき、文字列の中のBAを全てABにしたいときはどのような置換をすればいいのでしょうか?

例えば、
$s = "AABABABBBA";
と文字列があったら、
$s = "AAAAABBBBB";
にしたいのです。

$s =~ s/BA/AB/g;とすると、置換後を判定してくれないので、困ってます……

571:nobodyさん
07/11/23 21:58:25
>>570
たとえば。
$ perl -e '$s = "AABABABBBA";while($s=~s/BA/AB/g){}print $s;'

572:nobodyさん
07/11/23 22:00:18
>>570
その場合、これ以上置換できなくなるまで「$s =~ s/BA/AB/g;」の処理を行わなければならない。すなわち、ループである。
s/BA/AB/g;は、置換を行った回数を返す。つまり、0を返すまで処理を継続したいのだから、while文が使える。
したがって、次のようになる。
while($s =~ s/BA/AB/g;){}

whileのあとの{}の中に何も入っていないが、これでお望みどおり動くようである。

573: ◆TWARamEjuA
07/11/23 22:31:04 BE:6970188-2BP(6825)
sortって云う手もあるよなぁ♪
print join "", sort split "", "AABBABABBBABAABBAABABABABA";

574:570
07/11/23 22:36:47
>>571-573
返信ありがとうございます。
無事whileを使う方法で出来ました。

575:nobodyさん
07/11/24 07:56:01
>>574
遅レス。
他の文字が存在しないと云う条件下なら、素直に文字数カウントするって手もある
perl -le 'my $s = "atataaattttatatat" ; print "a" x ( $s =~ s/a/a/g ) . "t" x ( $s =~ s/t/t/g ) ;'
ま、他の文字が存在してても外側ループ一個つけるだけだけどね。

蛇足だと思ったんだが、、、、

576:nobodyさん
07/11/25 15:53:28
ちょっと分からないので質問させてもらいます。
手作りで掲示板みたいなのを作ってるんですけど
Location:で二重投稿を禁止したくて書いたんですが投稿したあとにLocation:って文字が表示されて飛ばないんですけど
なんでしょうか?
普通なら飛ぶのに飛びません・・・。

誰か分かる方が居れば教えてください。

577:nobodyさん
07/11/25 16:07:12
>>576
content-typeの前に書いてみ

578:nobodyさん
07/11/25 16:35:27
>>577
出来ました。
ですが書き込みがされなくなりました・・・。

579:nobodyさん
07/11/25 17:55:01
そもそもがどんな仕組み何だかわかんねーと答えようがねーよw
こっちはエスパーじゃないんだからさw

580:nobodyさん
07/11/25 18:30:55
>>579
URLリンク(www.uploda.org)
これなんですが上手く動作しなくて・・・。

581:nobodyさん
07/11/25 18:47:07
一番最初に

print "Content-type: text/html\n\n"; # データ形式

を書いてるのが不味いような気がするのは気のせいかな。

582:nobodyさん
07/11/25 18:47:57
>>581
他のところに置いたりすると上手く動作しないんです・・・。

583:nobodyさん
07/11/25 18:50:17
あと、$locationって変数、どこで使ってるんだろ。

584:nobodyさん
07/11/25 18:55:24
勉強し直しておいで。

585:nobodyさん
07/11/25 18:55:39
あ、それは書き忘れましたがKENTWEBさんのところのをちょっと借りたやつです。
# リロード
if ($location) {
if ($ENV{'PERLXS'} eq "PerlIS") {
print "HTTP/1.0 302 Temporary Redirection\r\n";
print "Content-type: text/html\n";
}
print "Location: $location?\n\n";
exit;
}
これがサブルーチンのwriteの最後に置いてました。

586:nobodyさん
07/11/25 18:56:09
とりあえずヒントは、
・Location: はHTTPヘッダに出力する
・ヘッダとボディの区切りは空行で示す

587:nobodyさん
07/11/25 19:08:15
前も書いたけど、kentwebのってデリミタに<>使うの好きだねえ。データがでかくなってくると、
2バイトも勿体無いと思う。

588:nobodyさん
07/11/25 19:10:08
>586
難しそうですが頑張ってみます。

589:nobodyさん
07/11/25 21:12:48
2バイトさえ気になるような人はデミリタに何使うんだろ。

590:nobodyさん
07/11/25 21:13:37
デリミタねw

591:nobodyさん
07/11/25 21:51:10
タブ?

592:nobodyさん
07/11/25 21:57:24
俺はタブ。excelにも貼るだけで、データやりとりできるし。

593:nobodyさん
07/11/26 01:21:50
俺は適当に,にしてた

594:nobodyさん
07/11/26 09:34:29
>>593
CGIでHTMLを吐く前提なら、 , を入力されると面倒なことになるんだよな。
< > なら < > ってできてしまうからいいんだけど。

595:nobodyさん
07/11/26 09:35:03
↑失礼
< > なら &lt; &gt; ってできてしまうからいいんだけど。

596:nobodyさん
07/11/26 17:00:07
, は&#44;でいいんじゃね?俺もタブ使うけど

597:nobodyさん
07/11/26 19:49:54
ちょいと質問を。

今ソフトバンククリエイティブのCGI/perl ハンドブック第3版
のCGIサンプルで掲示板を作ったのですが掲示板にメッセージが書き込まれなかったらエラーを出そうと
思って四苦八苦しているんですがperl6はよく分からなく苦戦しています。
誰かこの本を持っていて、分かる方がいればご教授お願いします。

598:nobodyさん
07/11/26 20:23:48
>>597
その本持ってないから知らないけど、本当にperl6ですか?

#このスレはご教授ってOKなんだっけ?



599:nobodyさん
07/11/26 21:19:36
こんばんは。
LWPで、現在取得しているURLの情報を参照する方法ってあるでしょうか。

URLリンク(www.xxx.ne.jp)<)

こんな感じのURLになってるのですが、この ? 以降の情報を取得したいのです。
$responoser->base
では、 ? より前のURLしか返してくれません。
教えてください。

600:nobodyさん
07/11/26 23:26:29
>>598
その使い方も間違ってない以上、突っ込む方が野暮or空気が読めないでおk

601:nobodyさん
07/11/27 03:23:29
質問します

他のサーバー上のテキストファイルを読み込ませたいのですがopen関数ではできないんでしょうか?

602:nobodyさん
07/11/27 03:33:26
できない

603:nobodyさん
07/11/27 03:49:49
>>601
あんたすげーな

604:nobodyさん
07/11/27 06:16:45
童貞で40歳まで行ったら妖精になれるよりすごい発想

605:nobodyさん
07/11/27 07:36:33
ただ、PHPでは同じような方法でできるこの不思議。

606:nobodyさん
07/11/27 08:12:36
だれか599についての回答を・・・

607:nobodyさん
07/11/27 09:01:18
>>599=606
リダイレクトされるためには適切なHTTPヘッダが返っているはずだからそれ調べる。

608:nobodyさん
07/11/27 11:02:47
>>599 >>606
うちの環境では、3回リダイレクトを経て、?&引数がもっさりついたurlに飛ばしても、
print $response->base();
で、引数(’?’以降%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8Aとか)がついた
URLを表示できたけど・・・。

ActivePerl 5.8.8-build822(XPsp2)
LWP/5.808

609:nobodyさん
07/11/28 05:14:00
ブログの自動投稿プログラムを作りたいと思ってるんですが、大まかな仕組みも分からず困っています。
どなたかご教授願えませんか?
ちなみに、用途はバーチャルな人間の日記を作りたいと思っています。

日記を出力するアルゴリズムは別に用意しますので、
それをブログの投稿画面に自動でログインして書き込むようにしたいのです。

ローカルからでも構わないのですが、
できれば安いレンタルサーバーから行えれば良いなと思ってます。

検索で『自動投稿』としたらたくさん見つかったのですが、どれもアフィリエイター用のもので、
結構値段も高いですし、記事を予め用意しないとダメなので私がしたいようには出来そうにありません。

610:609
07/11/28 05:16:24 onMmaiK+
よろしくお願い申し上げます。m(__)m

611:nobodyさん
07/11/28 05:24:30
ひょっとしたら、atom っていうのを勉強したら道が開けるんですか?

612:nobodyさん
07/11/28 05:26:27
日記を出力するアルゴリズム ←これがきになる

613:nobodyさん
07/11/28 09:39:10
日記を出力するアルゴリズム ←ってのはもしかして勝手に日記を書いてくれるプログラムだろうか

614:nobodyさん
07/11/28 09:48:03
>>609
△▲ WebProg 初心者の質問 Part16 ▼▽
スレリンク(php板)

615:nobodyさん
07/11/28 13:29:43
日記を出力するアルゴリズムを書ける人ならそれぐらい自分でできそうだけど。
荒らしスクリプトにするつもりじゃないなら、その日記を出力するアルゴリズムの
元ネタの場所を公開すれば信用が得られるかも。

616:nobodyさん
07/11/29 03:01:28
そういうのは荒らしやスパムに使われる可能性が高いから、自分でやりな。

617:609
07/11/29 18:18:55 fn44RAXr
>>612-615
日記のアルゴリズムが完成したわけではありません
ただそっちは、大したものじゃないにしても何とかなりそうなんです。
一方、自動投稿の方は何から手を付けていいのかすら分からない状態でしたので質問させてもらいました

>>616
やっぱりそうですか

わかりました。何とか頑張ってみます

因みにスパム行為をするつもりは毛頭ありませんが、確かに見ようによってはそう映る可能性も否定できないですね。

あくまでも普通の人間っぽい挙動にしたいと思っているので、投稿の数も一日で多くて3通程度、少ないときは三日ぐらい更新しないような動きを考えてました。

とにかく自分で何とかしないとダメみたいですね

ご迷惑おかけ致しました

618:nobodyさん
07/11/29 18:50:54
URLリンク(search.cpan.org)

619:nobodyさん
07/11/29 18:56:46
>>617
う~む、どう考えてもやっぱりその
日記を出力するアルゴリズム
ってのが、自動投稿するスクリプトより遥かに高レベルのような気がするが・・・・。

まあいいや、ヒントだけ。
WWW::Mechanize オススメ。
内容や使い方は、自分で調べてちょ。

620:609
07/11/30 00:45:15
>>618,619
ありがとうございました。
参考にさせていただきます。

今いろいろ資料を調べたり、さっき図書館で借りてきた
Webクライアントプログラミングって言う本(めちゃふるいですがw)
を読んだりしてます。

HTTP通信などは一度もやったことがないので、
LWPあたりから勉強したほうがよさそうな、
そんな気がしてる今日この頃。

AtomとかXML-RPCとかの資料にまではたどり着けたのですが、
そこに平然と書かれている GETだのPOSTだのという表現についていけない状況です。
あれを全部 perl のコードに解釈するための知識がないのです。

というわけで、だいぶ時間掛かりそうですが、
こつこつやっていこうかなと。

もう少し進歩して、またわからないことがあったら、
ここか>>614さんが教えてくれたスレにでも出没いたします。

では、ごきげんよう皆様。

621:609
07/11/30 03:34:24
(´・ω・`) ノシ やっとこさ、livedoor から餌を頂戴できました

なんだか、嬉しくて涙が出てきた 。・+゜(つД`)゜+・。

みんなありがと

622:609
07/11/30 03:51:57
>>619 Mechanize というのを完全に誤解してたようです
XML-RPCとかAtomPubなどとはまったく違うんですね。

なんというか、禁断の・・・いや、貴重な情報ありがとうございました。

623:nobodyさん
07/11/30 12:46:37
フォームメールに入力された内容を半角→全角に変換するプログラムがわかりません。

$str = '$mystr';
$kigou ='@!"#$%&\'()=-^\\|{}:;+*?_/<>';

require 'jcode.pl';

if ($FORM{'namae'} ne ''){
$mystr = $FORM{'namae'};
&hankaku;
}

sub hankaku{
&Jcode'convert(*str,'euc');
if($str =~ /^[0-9]{7,11}$/){
&jcode'tr(*str,'0-9A-Za-z','0-9A-Za-z');
}elsif ($str =~ /\x8E/) {
&jcode'h2z_euc(*str);
}else ($str =~ /$kigou/){
&jcode'tr(*str,'@!”#$%&’()=-^¥|{}:;+*?_/<>','@!"#$%&\'()=-^\\|{}:;+*?_/<>');
}
&Jcode'convert(*str,'sjis');
$str = $value;
exit 0;
}

1度eucに変換してからと考えたんですが。

624:nobodyさん
07/11/30 13:06:38
>>623
Unicode::Japanese

625:nobodyさん
07/11/30 13:27:37 7wito75u
2007/11/30-2007/12/01,00-24,[動作させる値]

のようなdatファイルを下記でブランチさせると、指定範囲外だと判定されてしまうようなのです。
改善するにはどこを直せば良いでしょうか・・・最後の日付部分の比較だけで判定されてる・・?
localtime(time)取得やDAT読み込みは大丈夫っぽいです。

foreach $sdat(@set){
next, if $sdat eq "\n";
@sdat = split(/,/,$sdat);
@ddat = split(/\-/,$sdat[0]);
@d1dat = split(/\//,$ddat[0]);
@d2dat = split(/\//,$ddat[1]);
@tdat = split(/\-/,$sdat[1]);
if(
($ddat[1] eq '' || ($ddat[1] ne '' && $d2dat[0] eq '*' || $d2dat[0] >= $year))
&&($ddat[1] eq '' || ($ddat[1] ne '' && $d2dat[1] eq '*' || $d2dat[1] >= $mon))
&&($ddat[1] eq '' || ($ddat[1] ne '' && $d2dat[2] eq '*' || $d2dat[2] >= $mday))
&&($d1dat[0] eq '*' || ($ddat[1] ne '' && $d1dat[0] <= $year) || ($ddat[1] eq '' && $d1dat[0] == $year))
&&($d1dat[1] eq '*' || ($ddat[1] ne '' && $d1dat[1] <= $mon) || ($ddat[1] eq '' && $d1dat[1] == $mon))
&&($d1dat[2] eq '*' || ($ddat[1] ne '' && $d1dat[2] <= $mday) || ($ddat[1] eq '' && $d1dat[2] == $mday))
&&($sdat[1] eq '*' || ($tdat[0] <= $hour && $hour <= $tdat[1]))
){
chomp $sdat;
$url = $sdat[2];
last;
}
}

626:nobodyさん
07/11/30 13:32:25
ひどすぎわろた

627:nobodyさん
07/11/30 15:56:59 7wito75u
失礼。自己解決しました。

628:nobodyさん
07/12/10 07:32:09 aPvXjzqK
Perl5.x+CGIです。

現在、複数のプロセスから、同じデータにアクセス(読み書き)したいと考えています。
異なるプロセス間で共有される静的な変数、というようなイメージです。

外部ファイルやデータベースなどを経由する方法以外で、
このような処理を実現するにはどのようにすればよいか、ご存知の方がいましたらお願いします。

やはりmod_perlが適当でしょうか。


629:nobodyさん
07/12/10 11:08:15
静的な変数?

ていうかそれプロセスが落ちたらデータは消えていいってこと?
素直にファイルなりDBなり使えばいいとおもうんだけど、それができない理由は?

630:nobodyさん
07/12/10 11:47:45
質問の意味がわからないけど
mmapやmemcacheみたいなの?

631:nobodyさん
07/12/10 13:16:59
読み書きするのに静的ってナンダロ

スレッド使うMPM+mod_perlで:shared使うとか
shared memory使うとかそういう話かな?

質問の仕方が初心者臭いし素直にDB使っとけって気がする。

632:628
07/12/10 20:47:52
>629-631
ありがとうございます。遅くなってすみません。
ご想像通り初心者です。初めて触ったのは何年も前ですが、仕事とか全然関係ないので。


Perl ←―→ 外部ファイル、DB
    ↑
ここのコストが凄く重いので、可能な限りアクセスを減らしたいと考えています。
Perl側で保持しておけば多少は減るかなあと。
要は、「キャッシュ」のようなものだと思っていただければ。


>629
>プロセスが落ちたら
はい、構いません。もう一度、データ本体から取得するだけなので。

>631
>読み書きするのに静的
「静的変数」と「定数」は全くの別物という認識だったのですが、
もしかするとPerlの世界だと違うのかもしれません。少し調べてきます。

>630-631
>mmap、memcache、shared
軽く調べてみただけですが、そういうことです。勘違いしてるかもしれませんが。
この辺のキーワードを参考に、深く見てみようと思います。

633:nobodyさん
07/12/12 13:49:47 uWSb2hJm
すみません質問です。
複数画像ファイルが入っている特定フォルダから更新日が一番最新のファイルを
探して表示させたいのですが出来ますでしょうか?
尚、ファイル形式は不定です。
教えてください。
宜しくお願いします。


634:nobodyさん
07/12/12 13:58:00
(stat 'filename')[9]

635:nobodyさん
07/12/12 16:11:40
質問です。
aaa.htmというファイルを読み込んで、その中に書かれている変数を変数展開したいと思ったのですがそう簡単にはいきませんでした。
print qq|$_|;
とすれば変数展開されるかなと思いましたがそれもだめ。
置換を使えば簡単なのですが、置換以外の方法がありましたら教えてください。

--------aaa.htmの内容--------
<html>
<body>
$a
</body>
</html>

--------ソース--------
$a = 'aaa';

open(IN, "< aaa.htm");
@html = <IN>;
close(IN);

print "Content-type: text/html; charset=Shift_JIS\n\n";
foreach (@html)
{
print $_;
}

636:nobodyさん
07/12/12 16:27:53
HTML::Templateでも使っとけ

637:635
07/12/12 16:52:55
evalをつかったらなんとかなりそうです。

>636さんレスありがとう


638:nobodyさん
07/12/12 17:26:25 BkwLyerT
Encode.pm 5.85でEUC→UTF-8変換時に、
「髙」などの漢字が化けてしまうのですが、
これを化けないように工夫するにはどうすればいいのでしょうか?

639:nobodyさん
07/12/12 18:06:55
>>638
Encode::EUCJPMSを入れて、cp51932を使う。


640:nobodyさん
07/12/13 08:48:25
>>635
s/\$(\w+)/${$1}/g;

641:628=632
07/12/13 20:33:46
自己レスな上に遅レスです。
色々と検討してみた結果、速度や安全性に疑問も多いですが、とりあえずshm○○を使ってみようかなと思います。
ありがとうございました。


642:nobodyさん
07/12/14 03:20:01 jWEjvsMQ
質問です。
Usteramで録画したflvをダウンロードしたくて、
URLリンク(unknownplace.org)を参考に以下のソースを実行しました。
#!/usr/bin/env perl

use strict;
use warnings;
use AMF::Perl;
use LWP::UserAgent;
my $cid = shift || '5Fq8cQp9eHsEEknbQ22OOZniqS2xUiuz';
my $amf = AMF::Perl::Util::Object->new;
$amf->addBody('client.watch_video', '/1', { cid => $cid });
my $outputstream = AMF::Perl::IO::OutputStream->new;
my $serializer = AMF::Perl::IO::Serializer->new($outputstream, 'utf-8');
$serializer->serialize($amf);
my $amfdata = $outputstream->flush;
$amfdata =~ s/\xff\xff\xff\xff/\0\0\0\x31\x0a\0\0\0\x01/;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new( POST => 'URLリンク(gw.ustream.tv)' );
$req->content( $output );
$req->content_type('application/x-amf');
$req->content_length( length $amfdata );
my $res = $ua->request($req);
my $deserializer = AMF::Perl::IO::Deserializer->new(AMF::Perl::IO::InputStream->new($res->content), 'utf-8');
use YAML;
print Dump $deserializer->getObject->getBodyAt(0)->{value};


643:642
07/12/14 03:21:23 jWEjvsMQ
実行結果は以下の通りです。

Content-Length set when there is no content, fixed at /Library/Perl/5.8.6/LWP/Protocol/http.pm line 196.
Can't use an undefined value as a HASH reference at test.pl line 37.
どうすればいいでしょうか。

よろしくお願いします。

644:nobodyさん
07/12/14 08:48:00
37行目って何処よ

645:nobodyさん
07/12/15 20:24:19
$text = <STDIN>;

として、処理中に何らかのテキストを入力させたいです。
英数字は問題ないのですが、日本語を入力したときが変です。

aあ

と入力して、バックスペースを押すとちゃんと消去されません。2回おせば「あ」の表示は消えるのですが、
受け取った文字のaも消えてしまっています。
解決策を教えてください

646:nobodyさん
07/12/15 22:15:15
IPアドレスから携帯のキャリア判定してる人ってみんなここから
新しいIPアドレスが追加されたか定期的にチェックしてるんですか?
URLリンク(ja.wikipedia.org)

647:nobodyさん
07/12/15 22:41:06
ついでにききたいのですが、
@text = <STDIN>;

ってやったときに、入力を終わりにするにはどうすればいいのですか?

648:nobodyさん
07/12/16 02:59:28
>646
そこから調べてるかどうかはともかく、公式サイトを見るのは確かだな。
まあ、IPアドレスが追加されること自体はあんまり無いし……。

649:nobodyさん
07/12/16 11:33:56
>>646
リモートホストに変換して判断してる。

650:nobodyさん
07/12/16 16:00:14
>>649
ホストに変換するのは失敗することあるらしいぞ。
直接IPから判断した方が確実。

気にするほどじゃないとは思うけど、どうなんだろ

651:nobodyさん
07/12/16 18:41:45
perlで2ちゃんねるの専用ブラウザみたいなのって作れるんでしょうか。


652:nobodyさん
07/12/16 19:23:33
ネットワークをサポートしていて、文章の出力が出来るなら大抵の言語で可能だと思うよ。

653:642
07/12/17 11:34:49 FgX+pG+l
>>644
37行目は一番最後のprintの部分です。

654:nobodyさん
07/12/18 10:34:57
たとえば、sample.plに、

require('lib/lib.pl');
&dosomething();

と書いておいて、lib/lib.plに、

sub dosomething{
  open(FH, '>> baka.log');
  print FH time."\n";
  close(FH);
}

とすると、lib/の中にファイルができるのではなく、ひとつ上にできてしまいます。
これをlib/の中に保存したいのですが、ライブラリからの相対パスで保存する方法はないでしょうか。
または絶対パスを使うしかないのでしょうか。
ヒントだけでもお願いします。

655:nobodyさん
07/12/18 11:18:35
>>654
じゃあ、ヒントだけ…
つ %INC

656:654
07/12/18 16:52:48
>>655
ありがとう!
こーゆー用途に使うのな。

657:nobodyさん
07/12/19 01:05:36
ハッシュ配列の各要素をリファレンスとして関数の引数に渡したいのですが
よくわからなくて試行錯誤の末下のような方法にたどり着きました

$AA{'name'} = '1234';
$BB[0]{'name'} = 'abc';
$BB[1]{'name'} = 'ああああ';
$BB[2]{'name'} = '!?';

kansuu( \%AA );
$tmp = \@BB;
kansuu( ${\$tmp->[0]} );
kansuu( ${\$tmp->[1]} );
kansuu( ${\$tmp->[2]} );

sub kansuu
{
  my $h = $_[0];
  print "$h->{'name'}<br>";
}

BBの要素を kansuu() に入れるために
もっとスマートな方法(っていうか正しい書式)がありましたら教えていただけないでしょうか?

658:nobodyさん
07/12/19 01:14:31
my %AA = ( name => 1234 );
my @BB = (
{name => 'abc'}, #$BB[0]に無名ハッシュ(リファレンス)をいれる
{name => 'ああああ'}, #$BB[1]に〃
{name => '!?'} #$BB[2]に〃
);
kansuu( \%AA ); #\をつけることで%AAのリファレンスがわたる
kansuu( $bb[0] ); #$bb[0]の無名ハッシュリファレンスを渡す
kansuu( $bb[1] );
kansuu( $bb[2] );

sub kansuu {
printf('%s<br>',shift->{name});#ハッシュリファレンスは->をつけて要素を取り出す
}


659:nobodyさん
07/12/19 02:00:39
$,@,%,\と(),{},[]と->の組み合わせで大抵何とかなる。
正直スカラーのリファレンスの説明は自身がないけどおよそあってると思う
my $scalar = 'abc'; #スカラー
my $scalar_ref = \$scalar; #スカラーのリファレンス
my $anon_scalar_ref = \do {my $anon;}; #微妙に無名じゃないけど
my @array = (1,2,3); #配列
my $array_ref = \@array; #配列のリファレンス
my $anon_array_ref = [1,2,3]; #無名配列のリファレンス
my %hash = (a=>1,b=>2,c=>3); #ハッシュ
my $hash_ref = \%hash; #ハッシュのリファレンス
my $anon_hash_ref = {a=>1,b=>2,c=>3}; #無名ハッシュのリファレンス
my $slacar_object = bless $scalar_ref => __PACKAGE__; # スカラー使ったオブジェクト
my $array_object = bless $array_ref => __PACKAGE__; # 配列使ったオブジェクト
my $hash_object = bless $hash_ref => __PACKAGE__; # ハッシュ使ったオブジェクト
#素直に取り出せる
printf "scalar=%s\n",$scalar;
printf "array=%s\n",$array[0];
printf "scalar=%s\n",$hash{a};
#アドレスっぽいのがとれる
printf "scalar_ref=%s\n",$scalar_ref;
printf "array_ref=%s\n",$array_ref;
printf "scalar_ref=%s\n",$hash_ref;
#リファレンス先の値書き換えたり取り出したり
$$scalar_ref = '書き換えちゃった';printf "scalar=%s\n",$$scalar_ref;
$array_ref->[1] = '書き換えちゃった';printf "array=%s\n",$array_ref->[1];
$hash_ref->{b} = '書き換えちゃった';printf "scalar=%s\n",$hash_ref->{b};
#デリファレンスする(copyが作られる)
my $scalar2 = ${$scalar_ref};
my @array2 = @{$array_ref};
my %hash2 = %{$hash_ref};


660:nobodyさん
07/12/19 07:53:49
CGI.pmでmetaを出力したいのですがうまくいきません。
↓これを出力したいのですが・・・
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

URLリンク(www.geocities.co.jp)

このページの解説によると、

use CGI;
my $q = CGI->new;

print $q->start_html(
              -head=>meta({'http-equiv' => 'Content-Type'
              -content=>"text/html; charset=$CharSet"}
),

このようなコードになるはずなのですが、やってみると
Undefined subroutine &main::meta called
というエラーがでます。meta()がメインのサブルーチンだと解釈されてるみたいです。



661:660 続き
07/12/19 07:54:19
print $q->start_html(
              -head=>$q->meta({'http-equiv' => 'Content-Type'
              -content=>"text/html; charset=$CharSet"}
),

とやると一応うまくいくのですが、なぜか
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />


このようにもう一つ余計なメタが出てしまいます。どうすればいいのでしょうか?
CGI.pmは3..31です。


662:nobodyさん
07/12/19 10:23:45
>>660-661
URLリンク(perldoc.jp)

my $q = CGI->new;
$q->charset('UTF-8');

663:660
07/12/19 23:37:11
>>662

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

664:657
07/12/20 08:31:41
>>658-659
ありがとうございます!
超わかりやすくて助かりました
今のプログラムの色んなところがもっと簡潔に書けそうです

665:nobodyさん
07/12/20 10:28:40
> 超わかりやすくて助かりました
> 今のプログラムの色んなところがもっと簡潔に書けそうです

本当はわかってないくせに。

666:nobodyさん
07/12/20 13:33:18
>>658-659ですべてが理解できれば天才

667:nobodyさん
07/12/20 13:39:25
最低限は書かれてて分かりやすいとは思ったぞ


668:nobodyさん
07/12/20 16:21:00
読む気もしねぇよ

669:nobodyさん
07/12/21 21:13:42
でもああやって思いつく限りの書き方試して要素やハッシュ値見てればなんとなくでもわかってくるはず。
めんどいけど。

670:nobodyさん
07/12/22 18:50:11
あんな変な列挙を眺めるんじゃなくて、続初めてのPerl読むべきだろ。

671:nobodyさん
08/01/02 06:47:19
perl5.10 に移行した人います?

672:nobodyさん
08/01/02 20:07:21

依存コードは書いてないけど

673:nobodyさん
08/01/03 00:16:04
ノシ
cygwinで5.10入れてみた
use 5.10;で書いてみてる

674:nobodyさん
08/01/05 22:21:41
変数の中身を展開せずに確認したい場合ってどうすればいいんでしょうか?

$test = "今日は\n いい天気です $wether";

こんな変数があるとして、$test自体は展開してほしいんですが、
中身の\nや$wetherは展開せずに出力したいのです。

675:nobodyさん
08/01/05 22:58:36
'

ちなみに、weather?

676:nobodyさん
08/01/06 03:58:05
>>674
$testに代入した時点で展開しちゃってるでそ
そもそも確認したい意図は何?

リファレンスにしてアドレスを確認する手もあるけど

677:674
08/01/06 14:08:20
うーん、無理みたいですね。諦めます。一応問題は解決しましたので

>>675
そうです;
>>676
なるほど・・・
意図は正規表現でゴチャゴチャいじったあとの文字列が
どうしてもめちゃくちゃくになってしまうので、変数の位置関係を調べたかったのです。

678:nobodyさん
08/01/06 16:36:10
>>674はなぜ>>675の一行目を無視するんだ?
それが答えじゃないか。
>>676はそれもわかってないみたいだが。

679:nobodyさん
08/01/06 23:12:25 wcb81UNa
$kekka = int(200 * 0.29);
print "$kekka";

このような計算をしたら、結果が57になりました。
intって小数点が発生した時に切り落とすはずですよね?
えと、なぜこんなことになるのか意味が分からないのですが、
誰かご教授お願いします

680:nobodyさん
08/01/07 01:59:09
>>679
URLリンク(www.tt.rim.or.jp)

681:nobodyさん
08/01/07 11:17:24
それ、今じゃ間違いじゃないってのが一般的。
語源の知識としてはありだけど、誤用が定着するなんていくらでもあることだから。

いつもいつも空気読めない人が指摘するよな。

682:nobodyさん
08/01/07 11:27:36
>>679
$kekka = int(((my $n=200 * 0.29)=~/(.*)/)[0]);
print "$kekka";

こう書けばOK

683:nobodyさん
08/01/07 11:29:04
>>681
誤用でない方が一般的だとする根拠は?

684:nobodyさん
08/01/07 11:38:36
回答にはなってないけれど、こちらの環境でもいくつか試してみた
ので、その結果を書いておく。
何でこんな風な結果になるのだろうか。私も分からなかった。

$kekka = 200 * 0.29;
print "$kekka";
出力:58

$kekka = 200 * 0.29;
$kekka = int($kekka);
print "$kekka";
出力:57

$kekka = int(200 * 0.29);
print "$kekka";
出力:57

$kekka = int(2 * 29);
print "$kekka";
出力:58

685:nobodyさん
08/01/07 12:30:31
浮動少数の扱いの問題。
use bignum; これで解決。

686:nobodyさん
08/01/07 21:15:48 XSyaqzwg
>>685
おぉ いきました!
詳しい原因はよくわからないですが、ありがとうございました。

687:nobodyさん
08/01/07 21:22:49
ためしにPerlじゃなくてLispで
(* 200 0.29)
ってしてみたら57.99999999999999だってさ。機械の計算って難しいことがあるな


688:nobodyさん
08/01/07 22:41:02
誤差については、がっこで習うものだと思ってたけど、そうでもない?


689:nobodyさん
08/01/07 22:44:33
俺は習ったけど、もしかしたら教えてないところも少なくないかもしれん

690:nobodyさん
08/01/07 23:59:36
情報工学を扱う授業でもなきゃ教わらないんじゃね?
少なくとも俺は浮動小数点の丸め誤差については習ったことない。

あと高校の世界史も。

691:nobodyさん
08/01/08 00:07:25
>>683
>>681じゃないがなんかの辞書に載ってた気がする
ソースはない


692:nobodyさん
08/01/08 00:31:05 k+nta2fc
丸め誤差の知識はありますけど、
コンピュータの中で200*0.29ってどうやって計算してるか分からない
そもそも結果が57.9999・・・・になると言われても、どういう計算をしているのか
さっぱりw

693:nobodyさん
08/01/08 00:34:28
しかも
(* 20 0.29)
これは5.8って表示されるから困るw

694:nobodyさん
08/01/08 00:38:53
自前のショッピングカートの消費税を int($sum * 0.05) みたいに計算してるんだけど、大丈夫だろうか…

695:nobodyさん
08/01/08 07:14:24
>>694
>>685にすれば大丈夫かと

696:nobodyさん
08/01/08 08:15:35
俺は一番最初の質問者ではないが、浮動小数点の丸め誤差については、
wikipediaにも載ってたね。
問題の解決には、 use bignum; つかえばいいわけで、それでいい
のは分かるけれど、それとは別の話で、小数を100倍して整数で演算をして、
あとで100で割ったりする方法だったらちゃんとでるから
use bignum; しなくてもいいんだよね?

697:nobodyさん
08/01/08 22:01:08
>>696
0.29が有効数字2桁だとあらかじめ分かっているなら100倍すればいいけどなあ。
既知でないときにはuse bignum;じゃないか?

698:nobodyさん
08/01/09 00:10:32
>>697
レスサンクス。
いや、意味の無い部分の考えかなと思ったんだけど、
そっちの方がメモリが少なくて済み、処理が早くなったりするのかなとか
思ったのよね。ま、すごく小さな世界をいっているんだろうけれど。

699:nobodyさん
08/01/09 01:01:57
うーん、俺も難しいことはわからんけど、
俺は細かい実行時間を気にしてミスをするより、コードの可読性を優先したいな。と思った。
大量のデータを扱う人から見ればふざけた態度かもしれないけどね。

700:nobodyさん
08/01/09 02:01:45
LL的には人間にとっての最適化(コードの可読性)のほうが重要だからそれでいいと思うな

701:nobodyさん
08/01/09 03:08:01 480klIK2
リーダビリティ重要。(高橋メソッド風に)

702:nobodyさん
08/01/10 23:51:33
IPを10進数に変換したものと、
サブネットマスク形式のリストをマッチングさせたいんですが、
どんなループさせればいいですかね?

#判定ルーチン内
foreach (@list) {
 my ($min,$max) = subnetMinMax($_);
 return ($ip >= $min and $ip <= $max) ? 1 : 0;
}
としてるんですが、grep等を使ったほうが良いんでしょうか?
ループ内でサブルーチン呼ぶのがちょっと気になります。

703:nobodyさん
08/01/11 00:04:09
訂正orz

x: return ($ip >= $min and $ip <= $max) ? 1 : 0;
o: return 1 if($ip >= $min and $ip <= $max);

704:nobodyさん
08/01/11 11:44:26
@listの中にマッチするものが複数存在する可能性があって
何にマッチしたか全て取りたいならgrepだけど
有るか無いかだけでいいならループ回して見つけ次第結果返していいんじゃない?


705:nobodyさん
08/01/11 16:30:20
return $ip >= $min and $ip <= $max;


706:nobodyさん
08/01/11 20:31:41
>>704
なるほど。このままにしますありがとうございました。

>>705
そっか、そうですよね。
聞いてみて良かったです。

707:nobodyさん
08/01/12 13:10:11
「うんこ」を含む行の最後に「出る」と追加することってできますか?
「うんこ」の前後は英数字・日本語交じりで文字数は不定です。
$_ =~ s/(うんこ)/$1でる/;
だと、うんこ~出るの間の文字が文末にきてしまいます。
文末指定は$みたいなので
$_ =~ s/(うんこ)/$1でる$/;
としてperlを実行させると、エラーなのか、プログラムが終わりません。

708:nobodyさん
08/01/12 13:13:01
if ( $うんこ =~ /うんこ/ ) {
 $うんこ .= ’でる’


709:nobodyさん
08/01/12 13:38:43
「うんこを含む行」「改行」 ⇒ 「うんこを含む行」「でる」「改行」

if (index($_, 'うんこ') >= 0){ $_=~ s/$/でる/; }

710:707
08/01/12 13:54:47
>>708
全角を半角にしてやってみたりしましたが、エラーでした。

>>709
できました。ありがとうございます。
ただ、>=0の意味が分かりません。
改行は\nじゃないんですか?

711:nobodyさん
08/01/12 18:35:26
なにこのうんこスレ

712:nobodyさん
08/01/12 19:18:44
>>710
index

713:707
08/01/12 22:50:20
>>712
すみません、わかりました。ありがとうございました。

714:nobodyさん
08/01/13 13:16:41 rzzkvCmj
怠惰が美徳だの
エロエロ言語だの
言うけどさ
俺が習ってきた主な4つの言語のなかじゃ
間違いなく一番習得が苦しかった

つまり、学習コストは高い
Perlより習得が難しい言語ってあるの?

私見では達人レベルを目指すならC++が全言語のなかで一番習得困難
そこそこのプロレベルを目指すならPerlが一番困難(C++はそこそこのプロならまだ簡単)

715:nobodyさん
08/01/13 13:17:19 rzzkvCmj
スレ間違えた( ゚д゚ )

716:nobodyさん
08/01/13 21:52:12
配布用のスクリプトを書く予定なんですが、
変数名のつけ方で悩んでいます。
たとえば、
my $title;
my $script_content_title;
my $ScriptContentTitle;
sub param{}
sub parse_URL_encoded_string{}
sub ParseURLEncodedString{}
等、色々書き方ありますが
短い方が良いのか、わかりやすい名前が良いのか、
又、大文字、小文字を混ぜて使うべきか、覚えやすい名前にするべきか、
意見ください。
賛否両論あると思いますが、極力万人受けするものを選びたいです。

長文すみません

717:nobodyさん
08/01/13 21:53:50
配布スクリプトの中身の変数名なんて誰も見ねぇよ

718:nobodyさん
08/01/13 21:56:06
>>717
学習、改造用として配布したいんです。

719:nobodyさん
08/01/13 22:43:42
perldoc perlstyle

720:nobodyさん
08/01/13 23:03:26
変数や関数の名前の付け方は、どんなプログラムを書こうとしている
かというところもあるからな。
例えば、関数名で html_ をつけるとそうでないものとの区別がついて
分かりやすくなるけれど、全部の関数に html_ がついてたら
逆に無意味に長いだけとなる。
ここでアドバイスが欲しかったら、その書こうとしているプログラムや
ソースをもう少し具体的にだすとかしないと話は進まないと思う。

721:716
08/01/13 23:22:17
>>719
ありがとうございます。全部読みました。

基本的にはアンダースコアを使うべきだそうです。
スコープによって使い分けるのが良いみたいですね。
$Global_Data #グローバル
$tmp    #局所
$LOCK_KIND #定数

>>720
プログラムの種類によって書き方が変わる、変えられるのがperlの利点かもしれませんね。
>全部の関数にhtml_
そういうのはパッケージにまとめればOKですかね。

おかげ様で書き方が頭に浮かんできました。ありがとうございました。

722:nobodyさん
08/01/14 02:09:11
Perlプログラマは"不精"なので面倒なタイピングはしません。
でもPerlプログラマは"傲慢"なので他人のコーディングスタイルを気にしません。
こんなイメージ。

723:nobodyさん
08/01/14 02:26:48
怠惰と傲慢と短気だっけなラリーの三原則。

ネーミング重要。(高橋メソッド風に)

でも職人芸的なところあるよねネーミングセンスって。
なかなかそこは難しい。

724:nobodyさん
08/01/14 04:10:53
果たして自閉症の描くイメージとは

725:nobodyさん
08/01/14 04:15:16
>>716
もう解決したみたいだけど、Perlベストプラクティスもおすすめ
ダミアン先生の盲信はいけないけど、かなりためになるYo

726:nobodyさん
08/01/14 17:41:01
ダミアン先生はPerl界屈指のハッカーだが、著作物での記述にクセが全くないわけではないからね。

一般論としては、上を目指すならいろんなハッカーのコードや文章にたくさん触れることが必要。
これがなかなか大変だし難しい。
そのためにはネット上のコミュニティーやリアルのイベントにこまめに参加したり
ブログを定期的にチェックし続けないといけないから。
そういうことをしてない自称Perl使いが結構俺の周りにはいて、
そういう奴らは我流のあまりエレガントじゃないスタイルから抜け出せないでいる。

727:nobodyさん
08/01/14 18:57:12 4AKnbZN2
ファイルに入っている文字を出力するつもりなのですが、
メタ字が混ざっていることもあり、ちゃんと出力できません。
あらかじめファイルの中のメタ字に\を振って置くとしても、かなりの手間になりそうですし、
何か効率の良いメタ字対策はないでしょうか?

728:727
08/01/14 19:02:23 4AKnbZN2
すみません。微妙に文書が狂っていました。
ファイルに入っている文字からの出力の際の
文字化けする文字の対策をお願いします。

729:716
08/01/14 20:00:43
>>725-726
オライリーファンの俺には最高の本かもです。
>>727-728
余計な事してるからじゃないですかね?
quotemetaなんてのはどうですか?
文字コードなんかも書くと返事もらえるかも。






730:nobodyさん
08/01/14 20:08:53
>>727
情報不足です。
「ファイルに入っている文字」…どんな文字? 文字コードは何?
「出力するつもり」…どこに出力するの?
「メタ字」…具体的にどの文字ですか?
「ちゃんと出力できません」…具体的にどのように出力できないのですか?

ありがちなのは、ファイルの中と、コンソールの文字コードの設定が異なっていて、文字化けしたように見えるとか。
メタ文字をいったん解釈してしまっているとか。
ヌル文字とかタブとか垂直タブとかグループセパレータとかasciiの制御コードはそもそも「文字」ではないですし。
「文字」をどう「出力」したいのかにもよります。

コードを示してはどうですか。

731:727
08/01/14 20:18:57 4AKnbZN2
$i = 0;
while($list = <IN>){
 (undef,$name[$i],undef) = split(/:/, $list);
 $i++;
}
@name = sort(@name);
while($line = <@name>){
 print "<option value='$line'>$line</option>";
}
えーっと、コードはこのような感じです。
ファイルのDBにアクセスして、その中の一部を取り出しソートしてhtmlで出力するという形です。


732:nobodyさん
08/01/14 20:21:10
メタ文字がhtmlの解釈の問題を引き起こしてるんじゃないよね?

733:nobodyさん
08/01/14 20:23:30
metaタグで宣言している文字コードと異なるとか…
html中で使われてる文字コードと出力してる変数の文字コードの不一致とか…

734:727
08/01/14 20:30:22
>>733
タグで宣言しているコードは関係ないのではと思います。
出力するとき、一部の文字がうまく表示出来ていませんから。


735:727
08/01/14 20:32:56
現状としてはファイルの中の「ソ」とかに\を付けていけば表示はうまくいくのですが、
ファイルをその後書き換えたりするとそれも出来なくなるのではないかと思っております。

736:nobodyさん
08/01/14 20:40:00
これか?URLリンク(www.kentweb.jp)

737:nobodyさん
08/01/14 20:46:05
>>735
use utf8;
binmode STDIN, ':encoding(shiftjis)';
binmode STDOUT, ':encoding(shiftjis)';
# windowsなら shiftjis -> cp932

↑やってみて
ソース中に日本語文字列書くならutf8で保存してね。


738:nobodyさん
08/01/14 20:54:55
あw
binmode IN, ':encoding(shiftjis)';
かな?

739:nobodyさん
08/01/14 20:57:33
>>731
DBにアクセスしているのにファイルハンドルから@nameに格納しているとはいかに?
@nameへの格納の仕方が心許ないです。せめて以下のようにするとか。
my @name = map { (split(/:/))[1] } <IN>;
splitの対象が全角のコロンですが、perlソースと取り扱うデータの文字コードが合っていないと
間違いの元ですよ。

で、optionタグで書き出すべき文字列のリストが@nameに入っていて、それをどうしてグロブ
演算子を使っているのかわかりません。私はこんなこと一度もしたことありませんが…。
ここで、@nameの各要素がいったん解釈されてしまっていて、カタカナのソなどSJISの2バイト目の
\x5cが取り除かれてしまっています。単に
for (sort @name) {
  print qq{<option value="$_">$_</option>\n};
}
でいいと思うのですが。

740:nobodyさん
08/01/16 00:34:21
CGI::Applicationで index.cgi?rm=<デタラメなキー> のように
run_modesで定義されなかったrun_modeを指定するとエラーが発生させられてしまうのですが
未定義の場合デフォルトのrunmodeを起動させる方法は無いでしょうか?

741:nobodyさん
08/01/16 02:08:57
$self->run_modes(
    AUTOLOAD => \&catch_my_exception,
);

742:nobodyさん
08/01/16 02:17:14
>>741
ありがとうございます!試してみます。

743:nobodyさん
08/01/16 04:59:20 FWbaTTLj
5.005です。
以下のような、引数が省略可能なサブルーチンがあるとします。

 sub Func(;$\@\%) { (省略) }

このとき、引数が渡されたのか、それとも省略されたのかを
Func内で判断する方法を教えてください。

なお、そのままifに入れると偽となるような値(例えばスカラーの値が0)の場合も、
引数が渡されていると判断します。

744:nobodyさん
08/01/16 05:29:59
>>743
引数の数から判定
sub Func(;$\@\%) { print scalar @_ }
Func(); # 0
Func(undef); # 1
Func(1, @hoge); # 2

745:nobodyさん
08/01/16 05:44:10
>744
ありがとうございます。
なるほど、サブルーチンを使う時は常に@_を意識しないとダメだってことですね。

746:nobodyさん
08/01/16 11:29:46
@_ ってカタツムリみたいだよね。

@_ii

747:nobodyさん
08/01/16 14:19:16 Z4nycbhz
かたつむり大作戦

748:nobodyさん
08/01/16 20:06:54 L/Qn1HzA
質問です!

入門書を見ながら「URLにパラメータを加える」というのをやりました。

~~/test.cgi?list=man

とURLにパラメーターをくっつけ、cgiで

&ReadParse( *form );
$sex = $form{ 'list' };

と受け取ったつもりだったのですが、結果をprintしてみると

manman

と2回表示されてしまいます。これは何が悪いのでしょうか?

749:nobodyさん
08/01/16 20:30:55
いるんだよ、自分で勝手に照会用のコードを切り詰める奴

750:748
08/01/16 20:51:36
失礼しました。手当たりしだい試してたら解決しました。
なんだか色々と間違ってたようです。

751:nobodyさん
08/01/16 22:40:40 QOevDgBW
CGIモジュール等を使わない、
一般的なuriデコードのバグってどんな事ですか?

同じkeyに複数のvalがある場合の対処はしてます。

752:nobodyさん
08/01/17 00:41:41
>>751
区切り文字が & でなく ; のときとか、マルチタイプで送られてきたときとか、XSS対策とかかな?

753:nobodyさん
08/01/17 12:39:49
ちょっと考えてみてほしい
ドラゴンボールというのは、集めれば願いがかなうアイテムだ
それに対して、
ウンコは、いくらドッサリ集めてもウンコにしかならない
このように両者は一見似ているようで本質的に異なる


754:nobodyさん
08/01/17 12:41:44
>>751
巨大なクエリーとか、lengthがでたらめとかかな?
# httpdの仕様にもよるな

755:nobodyさん
08/01/17 17:15:28
uriデコード?とは関係ないけど
CGI.pm使うとmod_perl環境(Apache::RegistryやModPerl::Registry)で
-ParseHeadersやPerlSendHeader offしてあってもheaderを正しく扱えるので
CGIでもmod_perlでも動きます。ってプログラムが作りやすくなる。


756:nobodyさん
08/01/17 17:17:24
>>751
バグってどういうこと?

引数には、ある程度想定されるものしか入らないはずなんだから、
$form{'hoge'} とか、引数として使う値に想定される正しい値が入っているかのチェックを行えばいいんじゃないの?

757:751
08/01/17 18:58:22
>>752
区切り文字はCGI.pmでも&か:ですよね。

>>754
cgi側では解決できないような感じしますね。

>>755
それは良いコト聞いた。

>>756
オライリーの本読んでたら一般的にバグがあるとの事です。
CGI..pm使えとの一点張りです。
なので、どこにバグがあるのかなと ← いまここ

みなさんレスありがとうございます。

758:nobodyさん
08/01/17 23:23:09
とりあえず>>751がド初心者だということは分かった。

759:nobodyさん
08/01/18 00:48:01
>>758
スレタイ読めカス

760:nobodyさん
08/01/18 12:04:46 Z4Jr4bli
ファイルをサーバにアップロードしたいCGIがほしいのですが
どこかいいサンプルないでしょうか?

アップロードしたいファイルはエクセルファイルです

761:nobodyさん
08/01/18 12:15:45
ぐぐれかす

762:nobodyさん
08/01/18 12:39:13
アップロードされたファイルのを受信するCGIなのか、
それともファイルをアップロードするCGIなのか知らんけど
URLリンク(search.cpan.org)
URLリンク(search.cpan.org)

763:nobodyさん
08/01/18 12:51:11
>>760
ちゃんとした日本語で

764:nobodyさん
08/01/18 14:27:48
アップロードしたがってるCGIが欲しいんだろ

765:nobodyさん
08/01/18 15:13:46
意思を持つCGIコワス

766:nobodyさん
08/01/18 16:38:38
>>760 こんな感じですか?
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use CGI qw/:standard/;
use constant MAX_WAIT => 10;
my $q = new CGI;
$q->charset('utf8');
my $wait = rand(MAX_WAIT);
my @mind = qw(uploadしたい uploadしたくない uploadしてもいい);
my $mind = $mind[ int( rand(scalar @mind) ) ];
print start_html(
-head => meta({-http_equiv=>'refresh', -content=>"10; URL=$ENV{SCRIPT_NAME}"}),
-title => 'CGIの気持ち'
),$mind,end_html;


767:nobodyさん
08/01/19 01:06:12
>>766
$waitは、どこで使ってるの?
-head => meta({-http_equiv=>'refresh', -content=>"$wait; URL=$ENV{SCRIPT_NAME}"}),
とかやりたかったのか?

768:nobodyさん
08/01/19 14:38:24 gMv3rNuv
すみません、少し数学の話になるかもしれませんが、
100%の確率のうち30%が当たりという設定をして
くじを引かせる場合、

my $rate = 30;
my $atari = int((rand(100))) + 1;
if($atari <= $rate){
 print "あたり\n";
}

これで30%ということに理屈ではいえるのでしょうか。
それとも上か下かなので2分の1になるのでしょうか。

ご教示いただけますと幸いです。

769:nobodyさん
08/01/19 15:04:56
算数のレベルだぞ

770:nobodyさん
08/01/19 15:25:31
すみません

771:nobodyさん
08/01/19 16:00:15
>>768
そういうときは、そのコードを何万回か繰り返してあたりとはずれのカウントを取って、
実際に30%くらいになるかを調べればいいんですよ。

772:nobodyさん
08/01/19 17:54:09
>>768
極東連合乙

773:nobodyさん
08/01/19 18:03:47
>>768
10000回だけ繰り返してみた。

あたり=3031
はずれ=6969

774:nobodyさん
08/01/19 21:24:36
>>771
ありがとうございます。

>>773
実行有難うございます。
私の方でもやってみましたが、平均値が30%になりました。
安心しました。

775:nobodyさん
08/01/19 23:16:40
#!/usr/bin/env perl
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(strftime);
my $q = new CGI;
print $q->header(), $q->start_html();
#print $q->dump; # for debug
my $outputdir = "log"; # ファイルを置く先 (ディレクトリ)
my $fh = $q->param('uploaded_file');
my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子
if ($fh ne "") {
my $timestamp = strftime "%y%m%d%H%M%S", localtime;
my $outputfn = "$outputdir/$timestamp$ex";
open(F, "> $outputfn") or die;
flock(F, 2);
if (defined $fh) {
while (<$fh>) {
print F $_;
}
}
close F;
print qq{saved as <a href="$outputfn">$outputfn</a>};
}
print $q->start_multipart_form(-name => 'myform'),
$q->filefield(-name => 'uploaded_file'),
$q->submit("OK"),
$q->endform,
$q->end_html(), "\n";

776:760
08/01/19 23:18:40
ファイルをアップロードするCGIを探してます。
日本語おかしかったですね、すいません。
サンプルを探したんですが
>>775のままだったら
ファイルをアップしたときにファイル名が
アップロードした日付になってしまいます。
ファイル名を変更することなくアップロードするにはどうすればいいでしょうか?

777:nobodyさん
08/01/20 00:14:39 1RDcSYMg
my $outputfn = "$outputdir/$timestamp$ex";
のところを、そうじゃなくすれば良い。

778:nobodyさん
08/01/20 00:15:00
>>776
マルチタイプを分割して、そのヘッダ部分に名前あるよ。

779:nobodyさん
08/01/20 02:12:08
ついでにフォルダ名も表示してやれば、閑古鳥鳴くこと間違い無し。

780:nobodyさん
08/01/20 03:03:09
サーバにファイル名を任意に保存出来るって危険じゃね?
同名ファイルの処理が必要になるし、文字化けとかあるし。
文字化けとかしたら、ダウソとか出来なくなる場合もあるし、
削除とかはsshログインして * とか使って消さないといけなく
なる場合もある。(解決は出来るから問題なしともいえるのだが)
日本語はファイルと一緒にコメントとして管理すべきだと思うけど、
どうかな?

781:nobodyさん
08/01/20 10:25:46
>>780
間違いなく正しい。

782:nobodyさん
08/01/20 19:19:48 xw354eHR
上の人とは別人だけどファイルのアップロードに関して質問

open(OUT, ">$filename");
binmode(OUT);
while (read($fh, $buf, 1024)) { print OUT $buf; }
close(OUT);
close($fh);

上記なソースをよく見かけるんだけど、
三行目で一気に処理するんじゃなくて、
1024バイトずつ取り出して処理する理由って何?

783:nobodyさん
08/01/20 19:21:07
1000MBのバッファ蓄えろというのか

784:775
08/01/20 19:37:21
>>777
具体的にどうかえればいいのでしょうか?
教えてくださいとはいいません。
やってください

>>780
ご意見ありがとうございます。

785:nobodyさん
08/01/20 20:21:40
完全に自分専用とかなら別なんだろうけどな。

786:nobodyさん
08/01/20 22:56:33
>782-783 に関連した便乗質問で悪いけど、
レン鯖とかも考えた時の常識的なメモリ使用量ってどのくらい?
シュワルツ変換とか使っていいものかいつも悩む。

787:nobodyさん
08/01/20 23:26:35
>>786
「レンタルサーバ メモリ使用量」でぐぐってみたらどうかな?
ま、突き詰めるとそのサービスの仕様次第となるだろう。
シュワルツ変換も「やってはいけない処理」ではなく、重たい処理
でしかないからな。それだけの質問では何もいえない。
具体的なソースを出して、この負荷は問題ないか?とかなら分かるが。

788:nobodyさん
08/01/21 21:15:32 29cYlZ80
input type=file で送るファイルを指定しますが、
この場合のファイル名そのものを取得するようにするには
どのようにしたらよいですか?

789:nobodyさん
08/01/21 21:26:25
>>788
HTTP_CONTENT_TYPEを見て、boundaryで区切って分割して、そのヘッダを読む。

790:nobodyさん
08/01/21 22:20:09 29cYlZ80
>>789
有り難うございます
よく分かりませんが、ヒントを元にくぐってみます

791:nobodyさん
08/01/21 22:33:12 MggCWroJ
toolkitについての質問です。

toolkitのテンプレートを利用ユーザに編集させてたいと思っているのですが、
[% myheader = 'my/index.cgi' %]
[% INCLUDE myheader %]
などされるとソースが見えてしまいます。
なんとか規制できないでしょうか?
phpのsmartyであれば以下のように、テンプレートからのインクルードを規制することができます。
同等の機能はあるのでしょうか?
$this->security = true;
$this->security_settings["INCCLUDE_ANY"] = false;
$this->security_dir = "/path/to/templates";
$this->trustes_dir = "/path/to/php";

または、テンプレート内で使える関数を指定できるとかありますでしょうか?

日本語マニュアル見てみましたが、それらしいものがありませんでした。
URLリンク(www.hakoniwa.net)


792:nobodyさん
08/01/21 23:09:44
>>787
亀レスですみません。ぐぐってみました。
>782-783 のような流れをたまに見るので業界の暗黙知が
あるのかと思いましたが特に無いようですね。
会社毎に見ていくと具体的な数字を出している所は少なかったですが、
少ないところで2MBと10Mb(=1.25MB?)でした。

793:nobodyさん
08/01/21 23:29:51
ムーアの法則があるので、数値は出しにくいところがある。
あるサーバで5秒くらいかかっていたのが、最新のでは1秒くらいで終わるので、
ぜんぜん問題にならなくなったとか。

でも、1分を1秒にするのはムーアの法則でも5年以上はかかるわけで、
そのくらいの規模はどう頑張っても無理だろという話だ。

794:nobodyさん
08/01/22 09:20:05
>>791
INCLUDE自体を抑制するやり方はわからんが、

If a BLOCK definition is not currently visible then the template
name should be a file relative to one of the INCLUDE_PATH directo-
ries, or an absolute or relative file name if the ABSOLUTE/RELATIVE
options are appropriately enabled.

これを利用すれば普通は十分じゃねーの?

795:nobodyさん
08/01/22 10:10:27
テンプレート編集自体はtoolkit使うわけじゃないだろ?
そこでチェックすりゃいいんじゃね?

796:791
08/01/23 00:37:55 fM6ljyqY
>>794
>もし、ブロック定義が見つからない場合は、テンプレート名はINCLUDE_PATHのディレクトリにあるファイルか、ABSOLUTE/RELATIVEオプションが付いていれば絶対/相対パスにあるファイルを対象とします。
とのことですが、相対・絶対でスクリプト指定できてしまうということですよね?
考えても理解できませんでした、具体的にどのように利用すれば大丈夫なんでしょうか?

>>795
たしかにテンプレート編集時にinclude等、使わせたくない文言を削除する方法もあるのですが、
入れようとしているシステムが銀行ほどではないんですけど、絶対にユーザにソースが漏れてはいけないシステムなんです。
(今後のシステム拡張等も含んで)チェックミスが出てきやすい作りで作るのはあまり好ましくないと考えています。
html-templateでも、includeなど規制する機能はなさそうですし・・・。

使いたい機能はifとloopだけなんですけど、
perlでセキュリティ完備したテンプレートエンジンほかにあるのでしょうか?

797:nobodyさん
08/01/23 09:55:40
>>796
HTML::Template には no_includes ってオプションがあるけど?

798:nobodyさん
08/01/23 10:07:27
INCLUDE_PATH以下に見られちゃいけないファイル置かないという選択肢はないの?

799:nobodyさん
08/01/23 10:27:22
>>796
そんな大事なシステムをお前程度のスキルの人間が任されていることに
激しく不安を感じるのだが...


800:nobodyさん
08/01/23 11:28:58
INCLUDE_PATHに関数渡すと・・・

801:nobodyさん
08/01/23 11:58:33
>>796
URLリンク(anond.hatelabo.jp)

802:nobodyさん
08/01/23 14:51:21
データベースにutf8でデータを入れて、携帯の絵文字対応のsjisで取り出そうとしようと思っています。

$s = Unicode::Japanese->new;
$s->set($aaa);
$str = $s->sjis-imode;

という風に、perlで記述したところ、0という値しか返ってきません。ちなみに$aaaをそのままprintすると、文字化けします。
何がいけないのかよくわかりません。どなたかお答えいただけるとうれしいです。

803:nobodyさん
08/01/23 14:59:42
sjis-imodeが悪いと思うよ。sjis_imodeだろ。

$str = ($s->sjis) - 'imode';

と書いたのと同じだな。いちおうエラーにはならないが、
use strictとuse warningsを使ってればいろいろ怒られる
のではまらないですむパターンの間違いなので、なぜ
使わなかったのかよく反省しとけ。



804:nobodyさん
08/01/23 15:07:11
さっそくのご返答ありがとうございます。
試してみましたところ、こんどは??????という文字列が返ってきました。
いま現在、iモードシュミレータを使って表示させているのですが、これは携帯を使ってテストしないのが悪いのでしょうか?


805:nobodyさん
08/01/23 15:27:16
>>804

iモードシミュレータとなるとそれはもはやPerlの話題ではないな。
適切なところへいって質問するほうがお互いのため。

その前に$strを16進ダンプ表示してみて期待したバイト列になってるか
どうかぐらいは確認しといた方がいいとは思うが。


806:791
08/01/23 21:46:29 fM6ljyqY
>>797-802
いろいろな案有難うございます。
一つづつ試してみます。
どうもありがとうございました。

807:nobodyさん
08/01/23 23:17:40 FgvU3OwA
だれか
>>775をいじってくれる
心のやさしくて暇なやつはおらんのか
サーバに日本語のファイルをUPしたいんだ

808:nobodyさん
08/01/23 23:18:24
するなといわれてそれを納得しておいてなんだそれはw

809:プログラミング歴2ヶ月
08/01/23 23:19:54 bNex267N
ローカルホストで動かしたときに、mkdirでディレクトリを生成できていたのに
いざwebにアップロードしてみると、ディレクトリの生成をやってくれません。
この場合、原因として何が考えられるのでしょうか。
ちなみにperlのパスはあっています。

mkdirなどでググって見ても、よくわかりませんでした。。。
ヒントだけでもいいんで、どなたかよろしくお願いします。(_ _)

810:nobodyさん
08/01/23 23:27:24
>>809
まずはパーミッションの確認からだろうな。

811:nobodyさん
08/01/23 23:52:28
>>809
他には2階層以上のディレクトリはmkdirで作れないとかかな?

812:プログラミング歴2ヶ月
08/01/24 00:03:36 +24Wb9Pu
>>810,811 さん
ご親切にご教授いただきありがとうございます。
先ほど、パーミッションを変更したところ解決いたしまして、とても感謝しております。
しかしそれと同時に新たな問題が浮上してきまして、困っています。。。

mkdirを行った後に、とあるdatファイルに文章を出力しているのですが、
出力した後の改行コードが■になってしまいます。。。
こっちもローカルホストではうまくいっていたのに、なぜなんでしょう??

813:nobodyさん
08/01/24 00:05:46
改行コードの違いかな?
URLリンク(www.tohoho-web.com)

814:nobodyさん
08/01/24 00:28:39
>>812
ヒント
・UNIXではLF、WindowsではCRLF。
・\nはLR、\r\nがCRLF。
・FTPのアスキーモードで転送すると自動相互変換してくれる。

815:プログラミング歴2ヶ月
08/01/24 00:53:36 +24Wb9Pu
>>813,814さん

解決しました。ありがとうございました!
マジに感謝してます。

816:nobodyさん
08/01/24 10:27:32
>>815
例えばxyzzyみたいに、改行コードを確認したり、変更できる
テキストエディタを入れておいたほうがいいよ。

817:nobodyさん
08/01/24 10:41:34
サクラエディタおすすめ。

818:nobodyさん
08/01/26 19:03:18
保守

819:nobodyさん
08/01/28 12:09:42 fVIm37qB
Perl初心者です。
簡単なPerl/CGIのプログラム(掲示板など)が書ける程度のレベルです。

mod_perlの超初心者向けの解説本、ウェブサイトがあれば教えてください。
できれば日本語でお願いします。


あと、今は退社された方が書いたらしい、現在稼動中のプログラムのソースを入手したんですが、
ソースの最後に

 exit;

って思いっきり書いてたりするんですが、これって大丈夫なのでしょうか?



820:nobodyさん
08/01/28 12:53:50
URLリンク(multix.jp)

821:nobodyさん
08/01/28 15:21:58 eRROoQGz
ありがとうございます。

これに関して、オーバーライドを利用したコードを書いているとき、
ある関数(この場合はexit)が、どのパッケージに属しているかを調べる方法があればお願いします。

822:nobodyさん
08/01/28 16:14:02 Fd8GryNX
ときどき見かけるcodepageというのはどういうものなんでしょうか。
たとえば、TeraTermPro with SSHの設定でcodepageというのがあります。
ほかにもありますがこれを例にとります。
ヘルプやgoogle検索で調べても引っかからないのでここでおたずねします。

locale=japanese codepage=932
だとどうもShift-jisの設定をなんらかの形でやるみたいです(付属ヘルプ)。
locale=japanese codepage=65001
だとutf-8みたいです。
それで、私のマシンはWindowsなので、codepage=932で統一しておけばいいんでしょうか。
ケースバイケースなのでしょうか。
相手マシンがFreeBSDで通信することがあるのですが、その場合は、
設定の漢字受信/送信ともutf-8でokですか??
unixだとeucとも聞きますが、最近はutf-8化したほうがいいようなことも聞きます。
ので、よくわかりません。

もちろん、ソースを何で書くかはケースバイケースなのは知っています。
分からないのは、TeraTermの設定で
漢字受信/送信 と codepage という2つのよく分からない項目がある点です。

TeraTermは有名なので当然スレがあるかと思ったらありませんでした。
それにperlプログラミングでよく登場するので、ここで質問させていただきました

823:nobodyさん
08/01/28 16:22:56
exitはダメだけどexit(0)なら大丈夫、
実はそう言われてるけど逆で、exit(0)はダメだけどexitなら問題ない、
最近のヤツはどっちでもいい(具体的なバージョンはか書かれてない)、

色々と情報が混ざってて、調べれば調べるほど混乱してきた orz

824:nobodyさん
08/01/28 17:37:21
動いてんならいいじゃない

825:nobodyさん
08/01/28 18:19:41
そうします。

826:nobodyさん
08/01/28 18:33:58
UTF8の文字列で、全角ひらがなが入ってきた場合、全角カタカナに変換しようとしているのですが
思うように行きません。

$name =~ tr/ぁ-ん/ァ-ン/

一度、sjisやらecuやらに変換して、文字コードで置換させないと駄目でしょうか

827:nobodyさん
08/01/28 18:39:31
UTF8ならむしろ文字コード変換しないほうが置換しやすくないか?

828:nobodyさん
08/01/28 18:55:50
>>826
そんなことはない。

use utf8してないとかdecodeしてなくて$nameがバイトのままとか
そういうあたりじゃねーの?

use utf8;
binmode STDOUT, ":encoding(utf8)";

foreach (ord('ぁ') .. ord('ん')) {
my $h = my $k = chr($_);
$k =~ tr/ぁ-ん/ァ-ン/;

printf "%x %s %s\n", $_, $h, $k;
}


829:nobodyさん
08/01/28 19:04:20
>>822
> TeraTermは有名なので当然スレがあるかと思ったらありませんでした。

テラターム
スレリンク(linux板)

830:nobodyさん
08/01/28 19:21:58
>>829
誘導thx!! いやースレタイ検索で引っかからなかったもんで。



831:nobodyさん
08/01/28 21:13:04
確かにこりゃ罠だな……

832:nobodyさん
08/01/30 17:37:10 irpAKk1D
ActiveperlでローカルPC上に作成したWEBサイトにIE等でアクセスし、
その処理結果をファイルにしてデスクトップ上に出力したいのですが、
デスクトップまでのパスをどう取得すればいいか分かりません。
ログインユーザ毎にデスクトップのパスが変わってしまうので、
そのあたりを上手く解決できる方法があれば知りたいです。

833:nobodyさん
08/01/30 18:10:39
perlとは関係ないがユーザ毎に環境変数ってのが存在する

834:nobodyさん
08/01/30 18:43:24
use strict;use warnings;
use Win32::OLE;
my $sh = Win32::OLE->new('WScript.Shell');
print $sh->SpecialFolders("Desktop");


use strict;use warnings;
use Win32 qw/CSIDL_DESKTOP/;
print Win32::GetFolderPath( &CSIDL_DESKTOP );


835:nobodyさん
08/01/30 21:04:32 FClDhuIR
require Hoge;
は通るんですが、
no strict 'refs'; require "Hoge";
が通りません。Can't locateとなります。
文字列からrequireするにはどう書いたらよいでしょうか。

836:nobodyさん
08/01/30 21:12:10
Hogeってのを用意すればいい

837:nobodyさん
08/01/30 21:17:18
どうもです。
Hogeはあるつもりなんですが、前者と後者は同じものを指してないですか?

838:nobodyさん
08/01/30 21:29:04
拡張子を省略していたせいだった気がしました。ありがとうございました。

839:832
08/01/30 21:59:46
>>833
システム環境変数とユーザー環境変数ってやつですよね。
ここにあらかじめデスクトップへのパスを設定するという事でしょうか?

>>834
ソースありがとうございます。
実際に実行してみたんですが、CGIとして実行すると
SYSTEM ユーザ名義で実行され、ログインユーザでのパスが取れませんでした。
DOS窓から実行するとバッチリなんですが…。

少し調べた所、WMIで実現できそうな気がしてきたので
そちらを当たってみようと思います。ありがとうございました。

840:nobodyさん
08/01/30 22:29:21
3年ぶりくらいにPerlを使ってみたのですが、
以前は日本語の検索の時、EUCを使わなくてはいけないとかあったと
思いますが、普通にshift-jisで書いて、パターンマッチも問題なし
だったのですが、今のバージョンのPerlは文字コードとか気にしなくて
良くなりました?それともたまたま文字化けしなかっただけ?

841:nobodyさん
08/01/30 22:53:08
>>840
これを実行してみたらどうなる?
print "表現";
print '表現';

842:nobodyさん
08/01/30 23:05:02
>841
だめっすね。
まだjcode.plとか使ってるんですかね。
実は全てunicodeで問題なくなったりしてますか?

日本語のパターンマッチで注意することとかまとめた
いいページ知ってたら教えてください。

843:nobodyさん
08/01/30 23:12:08
>>842
一部の文字列を使う時だけ注意をして、POSTで受け取った文字列を
jcode.pl 使うという程度でも、Shift-JISでいけることはいける。
URLリンク(www.shtml.jp)

844:nobodyさん
08/01/30 23:19:37
>843
thxです。しばらく離れていましたが、少し思い出しました。
結局Perlはその間進化していなかったのね。

845:nobodyさん
08/01/30 23:19:46
クライアント、サーバ共にWindowsで、SQLServerとVB使っている
システムでも記号とか入力しようとすると駄目な場合もあるからな。
シビアに全部に対応とか考えなくても良いのではと思ったり。

846:nobodyさん
08/01/30 23:22:28
>>844
Perl は 5 が出てから結構経っているはずだよ。
3 年前に触ったのも 5 じゃないかな?
そこまで大きな変化が無いからこそ、という
メリットももあるんだけどね。

次に 6 には、構文とか大きな変化があるらしいから
そっちに期待だなw

847:nobodyさん
08/01/30 23:45:06
たとえば This is a pen.という入力があって、
「This」にマッチしたら、
htmlの色のタグを付けて<font color>This</font>と置換する場合、
これをやると次に「This is」に色を付けたい場合マッチしなくなる
のですが、上手いやり方あります? 先に「This is」の置換を
する位しか思いつかない。

848:nobodyさん
08/01/31 01:44:59
検索に使うデータは別に持っておくというのはどうだろうか。

Thisにマッチしたとき、
いきなり This → <tag>This</tag> と変換するのではなく、例えば「1番目の単語にマッチした」という情報だけ保存しておく。
で、最後にまとめて置換する。

Perlの持つ強力な文字列操作が活かされないという欠点はあるが。


849:nobodyさん
08/01/31 07:23:10
$in_str = "This is a pen.";
$out_str = '<font color="red">' . $in_str . "</font>";
ここで $str に検索対象の文章を入れる。
$str =~ s/$in_str/$out_str/g;

850:nobodyさん
08/01/31 09:05:07
>849
それ同一箇所を何度も置換する場合でも大丈夫?

851:nobodyさん
08/01/31 09:23:09
>>850
具体的にどういう場合?

852:nobodyさん
08/01/31 09:59:40
>849
<tag>This</tag> is a pen.
が$strに入ったら、次にThis isは一致しないでしょ?

853:nobodyさん
08/01/31 10:21:21
優先度つけて順番にやるしかない
その優先度はあなた次第だもの。

854:nobodyさん
08/01/31 12:45:35
s/This is|This/REPLACEMENT/gみたいなことしたいんだろうか?
一括してやるなら長い方を先にすればいい

855:nobodyさん
08/01/31 13:03:27
This is a pen.
  ↓
<tag>This is</tag> a pen.

このあとに、「tag」というフレーズで検索する可能性は否定できない。
いや、細かくマッチ条件つければ別だろうけど。

856:nobodyさん
08/01/31 21:12:55 ZyBf2Z6K
配列と文字を引数とする場合の書き方がよく分かりません。できるのでしょうか?
以下のようにやってもだめでした。
&subtest(@arr,$str,@arr2);
function () {
my (@arr,$str,@arr2) = @_;

}

857:nobodyさん
08/01/31 22:22:57
>>856
(@arr,$str,@arr2)は新しい配列として扱われるので、サブルーチン側では区切りが分からん。
arrとarr2は参照を渡すとか、要素数が分かってるならサブルーチン側で@_をspliceするとかがいいかも

858:nobodyさん
08/02/01 00:10:05
>845

長い方を先にした場合、
ThisとThis isとis a penがあって、
結論は<font>This is a pen</font>に色を付けたいのだ。

848の方法かなぁ。
ただ、入力テキストが100M位、マッチする検索リストが1万個とかなので、
動かせるか・・・。

Perlよりwordマクロとかの方がいいのかなぁ。
wordなら何度重なって色付けても問題ないし・・・。

859:nobodyさん
08/02/01 00:32:08
>>856
ヒント:リファレンス

860:1/2
08/02/01 03:03:29
>>858
途中まで書いてまじめにやると面倒だという事は分かった。
あとは頑張ってくれ。

#!/usr/bin/perl -w
use strict;
my $str = 'This... This is, This is a pen.';
my @target = ('This', 'This is', 'is a pen');
my $tag_o = '<font color="#ffff00">';
my $tag_c = '</font>';
my $tag_r = qr|</?font[^>]*>|;
my $tag_e = qr/(?:(?!$tag_r).)*/s;
for (@target) {
my $re = join qr/(?:$tag_r)*/o, split /(\s+)/;
$str =~ s/($re)/add_tag($1)/eg;
}
print $str;

861:2/2
08/02/01 03:04:31
sub add_tag {
my $substr = $_[0];
if ($substr !~ /$tag_r/o) {
$substr = "$tag_o$substr$tag_c";
} elsif ($substr !~ /\Q$tag_o\E/o) {
$substr =~ s/(\Q$tag_c\E)/$1$tag_o/go;
$substr .= $tag_c;
} elsif ($substr !~ /\Q$tag_c\E/o) {
$substr =~ s/(?=\Q$tag_o\E)/$tag_c/go;
substr($substr, 0, 0) = $tag_o;
} elsif ($substr =~ /^($tag_e)\Q$tag_c\E($tag_e)\Q$tag_o\E($tag_e)\z/o) {
$substr = "$1$2$3";
} elsif ($substr =~ /^($tag_e)\Q$tag_o\E($tag_e)\Q$tag_c\E($tag_e)\z/o) {
$substr = "$tag_o$1$2$3$tag_c";
} else {
die $substr; # ココを頑張ってくれ。
}
$substr =~ s/\Q$tag_c$tag_o\E//go;
$substr;
}

862:nobodyさん
08/02/01 04:53:15 hS8kNEG7
if(A1 < B1 && A2 < B2 && A3 < B3 && A3 < B3 && A4 < B4)
{
$page_dsp .= <<"EOM";
<tr>
<td colspan="2" >
<form action="????.cgi" method="post" onSubmit="return send_check()">
<select name=ku class=slc>
<option value="no">
EOM

#この中の条件式(ifの条件付オプション)は省略
{$page_dsp .= "<option value=\"1\">\n"; }

$page_dsp .= <<"EOM";
</select>
<input type=hidden name=back value="no">
<input type=hidden name=id value="$kid">
<input type=hidden name=pass value="$kpass">
<input type=hidden name=mode value="ku">
<input type=submit class=btn value="オン">
</td></form></tr>
EOM
}
else{$page_dsp .= "<tr><td colspan=2 align=center>終わり</td></tr>\n";
}

以上のように、最初の5つの条件
(各々全部の、左の数値が右の数値と同じかそれ以上の時にセレクトを非表示)
で動かしたいのですけど、5つの条件中3つの条件しか満たしてないのに非表示に
なります。
条件が5つ揃ってから非表示にするにはどうすればいいですか?
ご教授お願いします。

863:nobodyさん
08/02/01 05:30:16
落ち着け

864:nobodyさん
08/02/01 07:45:40
>>862
それはない。他にミスがあるはず。

865:nobodyさん
08/02/01 16:52:45 hS8kNEG7
命令が作動しなかったのは今回は説明で省略した命令(ifの条件付オプション)と
最初の5つの命令との相性が悪かったからかもしれませんね。

省略した部分内には、最初の5つの命令を一個ずつ(計5個)指定して、条件が満たされるごとに
オプション項目が一つずつ消えていき、全部満たしたら最初の5つの命令でセレクト
ごと非表示にするつもりでいたんです。

866:nobodyさん
08/02/01 16:54:10
相性とな?

867:nobodyさん
08/02/01 16:55:34
バルクメモリさしたら動かなかった
相性が悪かったということだな

868:nobodyさん
08/02/01 19:03:10
>>862
まずは、配列の勉強頑張れ。

869:nobodyさん
08/02/02 05:09:34
修士出たら就職を考えている現在3回生の情報の学生でperlが一番すきですが、
今年に入ってからいろいろと求人情報を集めてみたところperlの仕事少ないですね
噂には聞いてましたが、僕は何が何でもperlを仕事にしたいのです
まあそれはおいといて、perlを仕事としてみたときどんな感じですかね?
皆さま先輩方の多くはperlを仕事としていらっしゃると思ったので、
是非とも業務内容、他言語と比べたときの待遇、仕事のやりがいなどなど、
ポジティブな意見(勧め)もネガティブな意見(愚痴)も生の声としてお聞かせ願えればと存じます。

870: ◆TWARamEjuA
08/02/02 07:42:12
perlを仕事にするところはほとんど無いと断言できるです。
仕事の中でperlを使うことはたくさんの現場であるです。

おいらは今、製造業の中でperlを利用しています。
昨今の機器はLANでデータを採取できたりします。
それを高ぁーいWindows専用のアプリでデータ加工することなく、unix(含むlinux)なサーバにてcronでデータ採取・計算・加工してDB(DB_Fileで充分)に登録。(もちろんperlで)
そいつを拾ってエクセルに貼り付けるだけ(もしくはSpreadsheet::Writeで書き込むも良し)でもデータの共有が出来たりします。
記録計のようなグラフを作るにしてもGDだけで充分。

部品の計測をするのでも、今時のマイクロメータは数値をUSBで送ってくれる物があったりします。(USBテンキーみたいな出力をしたりする)
それをExcelにちまちま放り込むよりか、単純テキスト(csvでも良いけれども)で保存して、perlを使っていろんな形や計算をさせることも出来たりします。

以前勤めていたWEB屋(主にデザインやHTML書き)でも、Excelのデータを1件1HTMLファイルに変換する作業がありました。
(その求人に応募したのだ(照))
3000件近いデータを変換すると云うことで、2-3か月近い工程を組まれていたことがありました。
どうやら手動で書き換え作業をと目論んでいたようです。
けれどもデータ構造と特性を見極めるのに2日、それを変換するperlスクリプトを2日、変換作業たったの10秒って事がありました。
その当時、その部署の長は目を丸くしていましたです。
まだまだperl=CGIっていう感覚で居られたからです。
その後、ちまちまと元データ(Excel)の修正が入ってきても数秒で修正完了。
デザイン変更があってもテンプレートを書き換えるだけでおしまい。
あまった2-3か月の期間、他の仕事を色々とこなしていました。

ようは仕事に使う道具の1つとしてperlというのを持っていればどんな業種にでも使えるんじゃないかな。

そんなこともあって製造業の現場であるにもかかわらず、おいらのところにだけは使い慣れたMacOSX(iMacG5)なんてのを無理を聴いて貰って備え付けましたですです♪

871:nobodyさん
08/02/02 11:18:13
perlを仕事で使うなら修士はオーバースペック。
高卒で十分な土方に好き好んで修士雇う経営者がいるのか?

872:nobodyさん
08/02/02 11:21:37
修士雇う経営者がいないなら高卒って言えばいいだけのこと
そんなこともわからないのか?

873:nobodyさん
08/02/02 12:03:51
perl土方は頭悪いな。
高卒で足りる仕事には高卒の賃金しか払わないという事だよ。

874:nobodyさん
08/02/02 13:18:25
>>872
それ、学歴詐称にあたるんじゃないの?
ちょっと前、問題になったでしょ。

875:nobodyさん
08/02/02 13:33:00
perl土方は新聞を読まない。

876:nobodyさん
08/02/02 13:46:46
WEB系いきゃいいんじゃないの?
個人的にはなにがなんでもPerlとかいってるPerl使いは嫌だけど

877:nobodyさん
08/02/02 14:25:02
Perlがちょっとくらいできても仕事ねえぜ、と修士出の自宅警備員が言ってみる。

>>874
それ公務員ね。試験区分に対象の学歴があってそれに沿うことが望ましいとされてるから。

というかこれマ板のネタだろ。

878:perl好き情報3回生(本物) ◆qqt5.0NxB6
08/02/02 14:40:08
ちょっと失礼します。
僕はWebprog板に>>869と同一内容の書き込みをした者です。
>>869は偽者であって僕がマルチポストをしたのではないことを明言しておきます。
トリップをつけたので本物しか相手をしないようお願いいたします。
迷惑をおかけして申し訳ありません。
お騒がせしました。

879:nobodyさん
08/02/02 15:45:41
質問です。XML::RSSを使って、外部から取得したRSSを加工してHTML(euc-jp)に出力しているのですが、
一部の記号(それも機種依存文字含む)が文字化けします。

- → \x{ff0d}
㎜ → \x{339c}

機種依存文字に関しては、根本的に対応することに意味があるのか疑問ですが、せめてwindowsな環境で
文字化けしないようにしたいのです。どうしたらいいでしょうか?

あんまし分かっていませんが、重要そうな部分だけ。
use XML::RSS;
use LWP::Simple;
use encoding 'euc-jp', STDOUT => 'euc-jp';
use open IN => ":encoding(euc-jp)";
use open OUT => ":encoding(euc-jp)";
binmode OUT => ":encoding(euc-jp)";

my $rss = new XML::RSS;
$rss->parsefile($site_file);
my $item_list = $rss->{'items'};
$item = ${$item_list}[0];
my $desc = $item->{'description'};

#一応対策っぽいことをやって一部の記号には対応できた
$desc =~ tr/\x{005C}\x{00A5}\x{2014}\x{203E}\x{2225}\x{FF0D}\x{FF5E}\x{FFE0}\x{FFE1}\x{FFE2}/
\x{FF3C}\x{FFE5}\x{2015}\x{FFE3}\x{2016}\x{2212}\x{301C}\x{00A2}\x{00A3}\x{00AC}/;

880:879
08/02/02 15:48:16
ちなみに、
~ → \x{FF5E} に化ける問題は、一番下に書いた置換で解決したのですが、\x{FF0D}は何故かそのまま
文字化けしたままです…

881:879
08/02/02 15:55:11
すいません、>>880は単純ミスでした、取り消します。

882:879
08/02/02 15:57:31
忘れていました。エラーメッセージが出ます。
hogehoge.cgi: "\x{ff0d}" does not map to euc-jp at hogehoge.cgi line 183.

883:nobodyさん
08/02/03 01:13:34
求人ってほとんどPHPだよなぁ。プラスDreamWeaverの使用をセットで。
perl使ってるところはライブドアとかはてなとか高レベルに使いこなしてるところばっかり。
初~中級のところは全部PHPになってしまった。



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