トップページ⇒php
1001コメント356KB

Perlコーディング初心者質問スレ Part 53

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0809nobodyさん2007/01/16(火) 10:58:59ID:Vliwd/jI
>>808
そういうことでなく。

あと、時間や分、秒ごちゃ混ぜで計算できるものあれば。
77H - 4M = 76H56M みたいなの。
秒に戻さず、直感的に計算できればいいです。日付の計算はDate:Simpleにあるんですよね・・・。
0810nobodyさん2007/01/16(火) 11:19:26ID:???
use DateTime::Duration;

$t1 = DateTime::Duration->new(hours=>77);
$t2 = DateTime::Duration->new(minutes=>4);

$t3 = $t1 - $t2;

printf "%dH%dM\n", $t3->in_units(qw(hours minutes));
0811nobodyさん2007/01/16(火) 11:25:29ID:???
なんでもあるんだな・・・
0812nobodyさん2007/01/16(火) 11:38:08ID:???
>>811
なるほど。
でも、あらかじめ分解しておかないとダメなんですね。

モジュール探すときって、英語が出来ない自分が恨めしい・・・orz
0813nobodyさん2007/01/16(火) 11:44:11ID:???
中では全部、秒で計算しているのかな?
0814nobodyさん2007/01/16(火) 11:51:34ID:???
DateTime-Format-Durationってのもありますね。
0815nobodyさん2007/01/16(火) 14:34:37ID:???
ファイルハンドルって局地的に使う事は出来ないのでしょうか。
全体で一意な文字列になるの?
0816nobodyさん2007/01/16(火) 14:51:23ID:???
「局地的」という言い方がなんだかわからないが、

a) 無名ファイルハンドルを使う
a-1) IO::Handle->newで作る
a-2) my $fh; open $fh, 〜 で作る

b) 型グロブをlocalで局所化する local *FH; open FH, 〜
0817nobodyさん2007/01/16(火) 15:05:14ID:???
open my $fh, ">$file";
楽でいい。
0818nobodyさん2007/01/16(火) 15:23:34ID:???
>>817
open my $fh, ">", $file or die $!で済ませられる程度の簡単なプログラムなら
いいんだけど、

unless (open my $fh, ">", $file) {
エラー処理
}
通常の処理

みたいに書こうとすると$fhのスコープがif文の中だけなのでだめなんだよな。

0819nobodyさん2007/01/16(火) 15:50:18ID:???
>>818
エラー処理がそんなに長くなければだが、こんなんでどうよ。
ただしインデントには気をつけないと読みづらくなること請け合い。
open my $fh, ">", $file
  or do {
    エラー処理
  };
通常の処理
0820nobodyさん2007/01/16(火) 16:06:17ID:???
>>816-819

�dクス。
ラクダ本見たらこんな感じの記述があったから、
変数に何らかの文字列を設定しなきゃいけないのかと思ってた。

foreach $file (@ARGV){
process( $file, 'fh00' );
}

※process内
open( $input, $filename );
0821nobodyさん2007/01/16(火) 16:48:11ID:???
open my $fh, ">", $file
or do {
エラー処理
};
通常の処理

open my $fh, ">", $file
or do {
エラー処理
};
通常の処理

連続で使うと二重宣言の警告出るがな
0822nobodyさん2007/01/16(火) 17:17:37ID:???
>>821
そもそもそれは役目が終わったはずの$fhのスコープを閉じてないところに問題があると思う。
(ただの変数ならともかく、中身がファイルポインタと言う最初と最後がはっきりしているものだから。)
状況にもよるが俺は、ファイルの処理部分をラベル付きブロックに押し込むと
ファイルへのアクセスのスコープが一目で明白になるからしばしばこうやってる。
WRITE_HOGE: {
  open my $fh, ">", $file;
  通常の処理
}
WRITE_FUGA: {
  open my $fh, ">", $file;
  通常の処理
}
0823nobodyさん2007/01/16(火) 18:05:33ID:???
これ↓何の役割をしているんですか?

WRITE_HOGE:
0824nobodyさん2007/01/16(火) 18:11:29ID:???
>ファイルの処理部分をラベル付きブロックに押し込むと
0825nobodyさん2007/01/16(火) 18:11:50ID:???
>>823
>>822のコードでは何もして無い。こんな効果が
WRITE_HOGE: {
  open my $fh, ">", $file
    or do {
      last WRITE_HOGE; # とかやると
    };
  通常の処理
} # エラー時にここまでジャンプする
あるけれど、822ではブロック自体に名前をつけて解りやすくするという意味でつけた。
0826nobodyさん2007/01/16(火) 18:21:52ID:???
わざわざ

> ファイルの処理部分をラベル付きブロックに押し込むと

と書いてあるのに何故ググりもせずに聞くのだ?
0827nobodyさん2007/01/16(火) 18:34:16ID:???
初心者スレだからいいんでねぃか
0828nobodyさん2007/01/16(火) 18:37:29ID:???
ググるのも難しいしなw
perl ラベル でググるといい
0829nobodyさん2007/01/16(火) 19:50:01ID:???
結局、上達するにはまず検索術を身につけろって事になるんだよな・・・
0830nobodyさん2007/01/16(火) 20:29:44ID:???
>>825
なるほどブロックの最初に戻るんじゃなくて、最後に飛ぶのか。
サンクス。
0831 ◆TWARamEjuA 2007/01/16(火) 20:38:16ID:????BRZ(6701)
(´-`).。oO(そもそもの構造がへんなのかも。do なんて使うこと無いよなぁ。。。)
0832 ◆TWARamEjuA 2007/01/16(火) 20:39:31ID:????BRZ(6701)
>>831
s#do#doとかラベル#
0833nobodyさん2007/01/17(水) 01:42:58ID:???
このケースだと do やラベルを使わずサブルーチン呼ぶ方が
より自然な気がすっけどね。
my $code = sub { die : } # エラーしょり
{ # 空ブロック宣言
open my $fh, "hoge" or $code->() ;
close $fh ;
}
0834nobodyさん2007/01/17(水) 03:08:12ID:???
二つの文字列で共通箇所だけ抜き出すスクリプトあったら教えてください。

たとえば、aiueoとkaiukekoならaiの部分、abcdeとadeabなら「de」と「ab」です。
でも、連続した文字でない場合は抜き出さなくていいです。二文字以上。
上の例だとa,i,u,e,oの文字、a,b,c,d,eの文字が使われているからといって抜き出さない、といった感じです。
08358342007/01/17(水) 03:09:07ID:???
間違いました。
>たとえば、aiueoとkaiukekoならaiの部分、
重なってる部分は「aiu」です。
0836nobodyさん2007/01/17(水) 07:17:18ID:???
>>835
一箇所しか重ならないの?
たとえば hogefugahoge v.s. fugahogefuga みたく複数の場合とか考慮せんでえーの?
08378342007/01/17(水) 07:21:58ID:???
>>836
hogeが二回とか同じものが複数は別扱いでいいです。
まとめたいときは配列にでもして重複削除処理を加えると思うので。
08388372007/01/17(水) 07:26:27ID:???
いってること自分でもよくわからないので言い直します。

hogefugahoge v.s. fugahogefugaなら
fugahogeというデータが抜き出せたらいいです。
fuge、hogeでもいいです。fugahoge,fuge,hogeでも。
そのあたりは作り手にお任せします。
一番理想的なのは、コノ例なら最初のfugahogeだけですね。後は同じことですから。
08398372007/01/17(水) 07:30:03ID:???
訂正

[hogefuga]hoge v.s. fuga[hogefuga]なら
[]の部分が重なっているのでhogefugaです。
他、fugeと書いている部分はfugaです。
08408372007/01/17(水) 07:40:16ID:???
すみません。まだちゃんと理解してなかった・・・

hogefugahoge v.s. fugahogefugaの例の場合、
hoge[fugahoge] v.s. [fugahoge]fugaもあるんですね・・・。
重なってる箇所がある場合は長いほう優先にしてください。
同じ長さの場合はどちらか一方で構いません。
説明足りなかったですが、これらの条件と合わせて
二つの文字列で何文字共通箇所があるか?データも欲しいです。
08418062007/01/17(水) 07:48:33ID:???
>>809
わかりました、どうもありがとう。
0842nobodyさん2007/01/17(水) 09:39:21ID:???
>>837
最長だけでよければCPANに

String::LCSS - Find The Longest Common Substring of Two Strings.

というのがある。
0843nobodyさん2007/01/17(水) 10:18:37ID:???
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0844nobodyさん2007/01/17(水) 10:53:47ID:???
4: だから教えろカスども
0845nobodyさん2007/01/17(水) 10:59:11ID:???
5: カスだから無理
0846nobodyさん2007/01/17(水) 12:13:51ID:???
my $one = 'hogefugahoge' ;
my $two = 'fugahogefuga' ;
my %ones
  = map { $_, 1
  } map {
    unpack +( join '', map "\@${_}A*", 0.. ( length $_ ) - 1 ), $_ ;
  } unpack +( join '', map "A${_}X${_}", 1.. length $one ), $one ;
これで全組合せが出るのであとはお好きなように。。。
例えば以下みたく。絞り込むのは自分でやっとくれ。

my @ans ;
for my $str ( sort { length $b <=> length $a } keys %ones ){
  my @two_ind ;
  my @one_ind ;
push @two_ind, pos $two while $two =~ /($str)/g ;
  push @one_ind, pos $one while $one =~ /($str)/g ;
  push @ans, { str => $str, one => \@one_ind, two =>\@two_ind } if @two_ind ;
}

0847nobodyさん2007/01/17(水) 12:17:45ID:???
空気嫁
0848nobodyさん2007/01/17(水) 12:28:57ID:???
ネタレス三つで空気よめって何よ?w

>>842
これのソースは一応参考にはなるな
0849nobodyさん2007/01/17(水) 12:41:34ID:???
ほんと空気読めないんだな
0850836=8462007/01/17(水) 12:49:39ID:???
すまん。質問スレで質問に答えるのは厳禁なんだな。
0851nobodyさん2007/01/17(水) 12:52:13ID:???
ああ、テンプレ通りじゃねえってことか orz...
吊ってくるわ
0852nobodyさん2007/01/18(木) 00:58:49ID:???
答えられない低脳君が答えてる奴に文句言うって素敵な空間ですね
0853nobodyさん2007/01/18(木) 01:00:06ID:???
>>851
いや、お前は悪くないよ。
0854nobodyさん2007/01/18(木) 01:08:56ID:???
答えられる奴が答えたらいいので、答えて文句いってるのは一番のカス。
どこにでもいるのでスルーするのがよろしい。ゴキブリホイホイより
0855nobodyさん2007/01/18(木) 01:33:40ID:???
>>854
そんなこと言うなよ。
お前がゴキブリホイホイなら俺はホウ酸ダンゴだ。
0856nobodyさん2007/01/18(木) 10:26:29ID:???
ここは定期的に荒しが沸くのでスルーお勧め
でもテンプレすら読まないのは問題あるな
どっちにしてもスルーでおk
0857みろん2007/01/18(木) 14:03:23ID:2GOHrU8+
どなたか教えてください。
今、perlで掲示板を作っています。そこでリロードによる二重投稿を
防ぎたいのですが、私はlocationをつかってみようと思ってます。
しかし、うまくいきません。どこに記述すれば、送信後自分のページを
再読み込みしてくれるのでしょうか。
0858nobodyさん2007/01/18(木) 14:27:04ID:???
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0859nobodyさん2007/01/18(木) 16:39:22ID:???
現在、CGIにてファイルをダウンロードさせています。

ファイルをOpenし、ContentType等を設定して、
バイナリを出力させダウンロードさせる仕組みです。

しかし、ファイルが存在しなかったり、Openに失敗した場合の処理が、
ファイル名にエラー情報を書いてファイルサイズ0のものをダウンロード
させるくらいしか出来ていません。

ファイルのダウンロードに失敗しましたというダイアログを出すためには、
404 not foundを返せばいいのでしょうか?
0860nobodyさん2007/01/18(木) 16:45:25ID:???
CGIなら「失敗しました」ってブラウザに表示すりゃいいんじゃね?
0861nobodyさん2007/01/18(木) 17:12:53ID:???
404がえし、やってみたら出来ました。
0862nobodyさん2007/01/18(木) 21:28:56ID:???
>>857
location というのがヘッダーの Location フィールドのことなら、書き込んだ後に表示するページで
Location: ジャンプ先URL
をレスポンスヘッダーに追加して、適切なステータスコード(302、303など)を返します。
URLの最後に ? を付けると、ほとんどのブラウザで二重投稿を防止できるみたいです。
詳しいやり方は、使ってるライブラリによって異なるので、自分で調べてみてください。

location が JavaScript の window.location の事でも、基本的に同じですが、板違いです。
0863nobodyさん2007/01/20(土) 14:34:54ID:67i3ErOc
配列の中に重複しないようにURLをいれる処理なんですけど
重複してしまいます。

@http_url = $text =~ /($set{'http_url_regex'})/g;
foreach my $url (@http_url) {
if (!grep(/^$url$/i, @link)) {
print "link : $url\n";
push(@link, $url);
}
}
なぜなのでしょうか?
0864nobodyさん2007/01/20(土) 16:57:02ID:x00E/Fj7
<form enctype="multipart/form-data" action="....cgi">
<input type="text" name="title" size="40"><br>
<input type="file" name="File" size="32"><br>
<input type="submit" name="send" value="送信"><br>
</form>

上のプログラムのように、テキストタイプのデータと画像などのデータを送信するプログラムを作りたいんですが
最初のフォームのテキストデータがちゃんと受け渡せません
multipart/form-dataで送信した際には、cgi側でどのような操作を行えばURLエンコードで送信した場合と同じようにテキストデータを扱えるんでしょうか?
0865nobodyさん2007/01/20(土) 17:15:45ID:???
2chの掲示板のソースコードはどこかで手に入りますか?
0866nobodyさん2007/01/20(土) 19:47:35ID:???
>>863
ハッシュを使うと楽にできるよ。
0867 ◆TWARamEjuA 2007/01/20(土) 19:50:03ID:????BRZ(6701)
>>863
何故っと云われてもわかんないけれどもおそらく恐ろしく効率が悪いみたいです♪

@http_url = $text =~ /($set{'http_url_regex'})/g; # $textからURIらしきものを取り出す。
# @link に追記。(ブロックにしておきますね)
{
 my %link_hash = map +($_, 1), @link; # URIをキーにしたハシュを作る。
 for my $collect_uri (@http_url){
  defined $link_hash{$collect_uri} and next; # キーが存在すれば次。
  push @link, $collect_uri; # キー(URI)が無かったので追記♪
 }
}

これでどうかしら?
@linkにスタックされた順番を考えずに済むのなら他の方法もあるけれども♪
あと、@linkの要素総てに改行が含まれているなら刈り取っておかなきゃです。
0868nobodyさん2007/01/20(土) 20:46:48ID:???
>>865
板違い
0869nobodyさん2007/01/21(日) 04:45:54ID:???
>>864
Googleで"multipart/form-data perl"で検索してみるといいぞ。
検索結果をトップから10件分読めば大体分かる。
0870nobodyさん2007/01/21(日) 09:24:25ID:prBhWU2Q
>>869
検索して、何となくはわかったんですが、深く理解はできませんでした
けどstdio.plというライブラリを見つけました
stdio.plと一緒にダウンロードしたサンプルプログラムのgetMultipartFormDataを使えば何とかなりそうです
返信ありがとうございましたm(_ _)m
0871nobodyさん2007/01/21(日) 12:46:00ID:???
>>870
可能なら CGI.pm を…。
0872nobodyさん2007/01/21(日) 12:54:47ID:???
会員制のサイトで
ID パス 入力で
個人ごとのデータを管理するオープンソースってありますか?
0873nobodyさん2007/01/21(日) 14:19:50ID:???
オープンソースって言いたいだけちゃうんかと。

まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
0874nobodyさん2007/01/21(日) 14:21:10ID:???
オープンソースって言いたいだけちゃうんかと。

まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
0875nobodyさん2007/01/21(日) 14:29:45ID:???
オープンソースって言いたいだけちゃうんかと。

まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
0876nobodyさん2007/01/21(日) 14:35:48ID:???
エスパー居すぎワロス
0877nobodyさん2007/01/21(日) 16:27:20ID:???
>873 伊東さんです。
>874 魔美さんです。
>875 ユンゲラーです。
0878nobodyさん2007/01/21(日) 17:55:44ID:???
世界のエスパーが集うスレと聞いて飛んで来ました
0879nobodyさん2007/01/21(日) 18:22:18ID:???
来てます!
0880nobodyさん2007/01/21(日) 19:41:27ID:???
とうとうナポレオンズの時代が来たようです
0881nobodyさん2007/01/23(火) 10:33:18ID:gVOiAeSh
--------------------------------------------------------
sub mail_okuru{
my($aitemail) = $_[0];

$_[2] = &adebo($_[2]);

$mail = "To: $aitemail\n";
$mail .="From: \日\本\語\名\前 <$mail_add>\n";
$mail .="Subject: $_[1]\n";
$mail .="Content-Transfer-Encoding: 7bit\n";
$mail .="Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n";
$mail .=$_[2];


&jcode::convert(*mail,'jis');

open(MAIL,"|$sendmail -i -t -f $aitemail");
print MAIL $mail;
close(MAIL);
}
------------------------------------------------------------
自動返信メールのアドレスの【日本語名前】のところがどうして文字化けしてしまいます
文字化けしないようにしたのですがどうすればよろしいでしょうか?
お願いします
0882nobodyさん2007/01/23(火) 10:40:39ID:???
文字化けの原因は何だと思う?
0883nobodyさん2007/01/23(火) 10:52:08ID:???
これは普通に検索すれば解決するだしょ
base64でぐぐれよ
0884nobodyさん2007/01/23(火) 12:00:56ID:???
そーゆー問題か?
0885nobodyさん2007/01/23(火) 17:43:26ID:???
From行が・・・
これは気づくまで放置か?
0886nobodyさん2007/01/23(火) 20:24:43ID:???
釣りとみた
0887nobodyさん2007/01/23(火) 22:16:41ID:???
てことは俺は釣れたわけかorz
0888nobodyさん2007/01/23(火) 22:57:35ID:???
mimew.pl入れたら上手く行ったよ
0889nobodyさん2007/01/24(水) 01:37:38ID:???
教えて下さい
flockをローカルテスト鯖で使いたいのですが
Windowsで対応しているのはどのバージョンからでしょうか。
0890nobodyさん2007/01/24(水) 02:39:08ID:???
NT系なら使えるはず。
0891nobodyさん2007/01/24(水) 04:30:09ID:???
xpは動くでしょうか?
0892nobodyさん2007/01/24(水) 05:42:11ID:???
>>891
>>890
0893nobodyさん2007/01/24(水) 06:44:06ID:???
え、flock って Unix 専用じゃなかったの?
NT系で使えるってのは初耳だ
0894nobodyさん2007/01/24(水) 07:03:26ID:???
ソースを見るとwin32/win32.cにwin32_flockというのがあって、非NTのときはcroak、
それ以外ならモードにあわせてLockFileEx/UnlockFileExを呼んでるな
0895nobodyさん2007/01/24(水) 10:50:28ID:???
print "content-type: text/html\n";
print "Set-Cookie: test=test; domain=test.co.jp; expires=$expiredate;\n";
print "\n";

Set-Cookieでdomainを他のサーバーで指定するとcookieが発行されないのですが、
これは何が原因か教えて頂けますか。

domainの値を自サーバーもしくは、domain自体を記述しなければちゃんと発行されます。
0896nobodyさん2007/01/24(水) 11:09:52ID:???
他のドメインのクッキーを勝手に食わされるとセキュリティ上問題あるので
クライアントはそういうのは拒否することになっている。詳しくは
RFC2965(HTTP State Management Mechanism)の3.3.2(Rejecting Cookies)参照

たぶんこれにひっかかったんじゃないか。
0897nobodyさん2007/01/24(水) 12:18:29ID:???
仕様ですな。
08988952007/01/24(水) 13:08:20ID:???
仕様なんですか。ありがとうございます。
そうしたらdomainを入力する項目ってほとんど必要性がないような…(´・ω・)
0899nobodyさん2007/01/24(水) 13:16:44ID:???
example.comで発行するとhoge.example.comやfoo.example.comにも影響する
そこで有効範囲を指定してhoge.example.comのみに発行させることができる
0900nobodyさん2007/01/24(水) 13:19:21ID:???
>>898
example.comでクッキー発行すればauction.example.comでもshopping.example.comでも同じクッキーが使える
auction.example.com(ドメイン省略時の例として)で発行すればそこでしか使えない
0901nobodyさん2007/01/24(水) 14:33:19ID:???
外部のサイトの
http://〜/***.cgi?no=***
というようなページ(のソース)を読み込むことって出来ますか?
09028952007/01/24(水) 14:35:35ID:???
なるほど、ありがとうございました(´・ω・)
09038952007/01/24(水) 14:39:06ID:???
外部のソースですが、
use LWP::UserAgent;
use HTTP::Request::Common qw(GET);
my $ua = LWP::UserAgent->new;

my $url = "http://〜/***.cgi?no=***";
my $request = GET($url);
my $res = $ua->request($request);

if ($res->is_success){
$content = $res->content;
}

といったような形で読めますよ(´・ω・)
0904nobodyさん2007/01/24(水) 15:37:30ID:???
>>903
ありがとうございました。勉強してみます。
0905nobodyさん2007/01/24(水) 15:53:30ID:???
サーバ上でdata.txt(SJIS)をUTF-8に変更の上、
data1.txtとして別名で保存したいのですが
どのようにすればいいでしょうか?

ちなみにperlは設置ができる程度です。
親切な方よろしくご指導ください。
Perl バージョン 5.008004 です。
0906nobodyさん2007/01/24(水) 16:03:41ID:???
読み込み→変換→別ファイルに保存
0907nobodyさん2007/01/24(水) 16:25:47ID:2EUwcZjV
ログなどにデータを保持する場合、配列の区切り文字としてはどんなものを使うのが一般的なんでしょうか?
できるだけ短くてユニークなものが理想的だと思いますが
「普通はこれ使うだろ」といったような暗黙の標準区切り文字みたいなものはありますか?
それとも、コードの中で一時的にユニークな区切り文字に置き換えて処理し、
データに書き込むときは汎用性の高い区切り文字(カンマ等)で統一する、
といった方法の方が一般的なんでしょうか?
「自分はこうしている」という意見でも良いのでよろしくお願いします。
0908nobodyさん2007/01/24(水) 16:28:30ID:???
>906
読み込みと保存はなんとなくこんな感じでしょうか。
変換がよくわかりません
open IN, "data.txt";
$data = <IN>;
close IN;
open OUT, ">data1.txt";
print OUT $data;
close OUT;
0909nobodyさん2007/01/24(水) 16:32:21ID:???
LWP::UserAgentで外部サイトを取得する場合、
指定したURLが転送される場合303 See Otherが出て取得できない。

どうすれば転送後のサイトを取得できますか?
レス数が900を超えています。1000を超えると表示できなくなるよ。