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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/10/07 23:23:08ID:kiEzDCJF
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0566nobodyさん04/11/05 21:38:56ID:w/zBhN/X
>>565
全角にスペースにしわすれました
すいません
0567nobodyさん04/11/05 22:58:07ID:???
printf にした方が読みやすいとは思うけれどもども。。。
printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|;
$script, # スクリプトのお名前
$FORM{'type'}, # typeの値
$lbl_iconlist; # アイコソリスト(文字列)
0568nobodyさん04/11/05 22:58:54ID:???
>>567
あらやだ。
> printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|;
printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|,
056936504/11/05 23:36:15ID:???
print qq[<a href="$script?action=$icondisp&type=$FORM{'type'}" target="_blank">$lbl_iconlist</a>]."\n";

でいいんじゃないの?
0570nobodyさん04/11/06 02:52:14ID:???
ダブルクォーテーションとかの扱いは人それぞれだからどうでもいいじゃん自分で気に入ったの使えば
0571nobodyさん04/11/06 04:17:26ID:???
>>507
俺も同感
だからこそperlは何通りも書けるんだしね
0572nobodyさん04/11/06 09:00:12ID:???
そこがPerlの良さ
0573nobodyさん04/11/06 10:24:21ID:???
そこがPerlの悪さ
0574nobodyさん04/11/06 14:55:07ID:???
そこがPerlのぬるぽ

ところで、NullPointerExceptionをPerl語にすると何?
0575nobodyさん04/11/06 16:06:17ID:???
ガッ
0576nobodyさん04/11/06 16:06:35ID:???
釣れますか?
0577nobodyさん04/11/06 17:29:59ID:???
ダウンロードカウンタのCGIを作ろうとしています。

ブラウザにファイルの内容を送ろうと思うのですが,どうすれば良いでしょうか?
以下だとファイルが壊れてしまいます.

open(FILE,"$FileName");
binmode(FILE);
print <FILE>; ←while(<FILE>){print $_ }でもだめ.
close(FILE);

送りたいファイルは40KB程度ですが,数MB程度のファイルも対応できるとうれしいです.
お知恵をお貸しくださいm(_ _)m
057857704/11/06 17:41:38ID:???
書き忘れましたが,ファイルはバイナリファイル(LZH,ZIP等)です.
よろしくお願いします.
0579nobodyさん04/11/06 17:53:55ID:???
>>577
環境によっては binmode(STDOUT); がいるんじゃないかな。
あと、バイナリファイルなら行読み込みにせず、readでバイト数指定して読み込み
while (read(FILE, $buffer, 1024*10)) ... バッファサイズは適当に
printで出力する場合はバッファoffするのも忘れずに $|=1 (念の為
0580nobodyさん04/11/06 17:58:03ID:???
>>577
binmode(STDOUT) してないだけじゃないの?
つーか、壊れるという曖昧な表現じゃなくて
バイナリエディタで比較してみたら こういう違いがでてきた、ってな感じで話してくれないと。
まぁ、それ見りゃ自分でもおかしいとこに気づくんだろうけどね
058158004/11/06 17:59:28ID:???
んぁ。言葉選んでる間に答えられちゃってるよオレ
カコワリィ
058257704/11/06 18:12:10ID:???
>>579-580
レスありがとうございました。
原因は二つで,binmode(STDOUT)されてないこと,行読みした結果,改行コードが欠落したことでした.

>>579
「$|」というのはPerlの環境変数のようなものなのでしょうか?
print $|;だと値を返すようですが・・・
手元の資料&Google先生を調べても分からなかったのですorz

>>580
ご指摘,ありがとうございます.
「どういう風に壊れたのか」を説明する必要がありました.
失礼しました.
0583nobodyさん04/11/06 19:13:15ID:???
>>580
Don't mind, 既知問題っぽかったから推測で書いちゃったけど
実は全然違う原因だったって事はよくあるからね.

>>582
$|は検索しにくいのが難点だな。Perl バッファリングで調べると詳細でてくるよ。
058457704/11/06 19:17:26ID:???
>>583
とほほさんのBBSに質問がのってますね.
勉強したいと思いますm(_ _)m
0585nobodyさん04/11/06 20:47:26ID:55uCUnw3
    ○ ,                   ○>
   / ̄'☆                   )>>1 
  / >                    /

☆をダブルクリックするとかめはめ波が出るぞ

注)設定とか環境のせいで正常にかめはめ波しないときがあります
0586nobodyさん04/11/06 20:55:15ID:???
    ○ ,                   ○>
   / ̄'☆                   )>>585
  / >                    /
0587nobodyさん04/11/06 20:56:12ID:ZyicEXrd
Win2K + Active Perl 5.8 を使用しています。以下のスクリプト
を実行すると、「p.tif」 のファイル名が文字化けしてしまいます。
「use encoding "shift_jis";」の行を外すと、正常に「あ.tif」に変換
されるのですが、この行を残したままrename するにはどうすれば
よろしいでしょうか?

use encoding "shift_jis";
chdir 'c:\\test';
rename "p.tif", "あ.tif";
0588nobodyさん04/11/06 21:13:32ID:jPPLQ8mN
    ○ ,                   ○>
   / ̄'☆                   )>>587 
  / >                    /

☆をダブルクリックするとかめはめ波が出るぞ!

注)設定とか環境のせいで正常にかめはめ波しないときがあります
0589nobodyさん04/11/06 21:20:51ID:???
perl 5の正規表現で、content-typeヘッダに日本語があるかないかを判別するのに
iso-2022-jp|shift-jis|euc-jp|multipart\/mixed
という記述をします。これを応用して、『英語か日本語にマッチ』するかどうかを記述するには
どうすればよいでしょうか?

059058704/11/06 22:56:11ID:???
>>587 は自己解決できましたが、もっとスマートな方法があれば
よろしくお願いします。

use encoding "shift_jis";
use Encode;

chdir 'c:\\test';
$str = encode("shiftjis","あ.tif");
rename "p.tif", $str;
0591nobodyさん04/11/06 23:23:01ID:???
>>587
no encoding;
で一旦切ってしまって、処理後にもう一度
use encoding "shift_jis";
しておく…のはあまりスマートじゃないですね。。

>>589
「キャラクタセットが英語または日本語である場合マッチ」ということなら、
http://www.iana.org/assignments/character-sets
↑と睨めっこして、必要なのを足していくとか。
(キャラクタセットの指定が無かったり、Unicodeを使われたら、終わりな気もするけど。)
0592nobodyさん04/11/07 19:03:48ID:???
HTMLの<!---->みたいに複数行をまとめてコメントアウト
する方法をど忘れしてしまったので教えてください。
「#」じゃなく。
059359204/11/07 19:14:26ID:???
自己完結。

=comment # ここからコメント
=cut # ここまでコメント
0594nobodyさん04/11/07 19:14:34ID:???
回答方法もど忘れしてしまいました。
0595nobodyさん04/11/07 20:51:25ID:OKDqn1bD
お恥ずかしい話ですがsplitガどうしても上手くいきません。

@dat = split(/*/, <DAT>);

これで合ってると思うのですが、どうしてもエラーになってしまいます。
*DATは存在します。ちゃんと*で区切られています。
0596nobodyさん04/11/07 20:53:39ID:???
* → \*
0597nobodyさん04/11/07 20:54:42ID:V/bBugXz
全角半角混合の文字列からある順番の文字を取得したいのですがうまくいきません。
誰かお願いします。

文字列 $xx=あいうえおaiueo
から2番目の'い'を取り出だすとき
substr($xx,1,1);ではだめで
全角は2バイト分なので
substr($xx,3,2);でないとだめなようです。

0598nobodyさん04/11/07 20:55:58ID:???
>>597
何がしたいのかサッパリわからん
059959704/11/07 21:00:05ID:V/bBugXz
たとえば
ランダムに生成された全角半角混合の文字列
$xx=げあじgraふぇeあefaじえeaあい;
から9番目のeを取り出す方法を教えて
0600nobodyさん04/11/07 21:56:10ID:???
>>599
use Encode を使え
ただし 5.8 以上の perl でないとだめだが
0601nobodyさん04/11/07 22:01:19ID:???
文字列を1文字ごとに分割して配列に入れりゃいいんじゃないか?
0602nobodyさん04/11/07 22:03:13ID:???
んじゃ文字を配列にバラすコードを。文字コードは勝手にSJISと判断。
my @moji;
foreach ($xx =~ /[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]/g) {push (@moji,$_)}
print $moji[8];
0603nobodyさん04/11/07 22:40:30ID:???
>>602
そこまでやったら、直接取り出せばいいんじゃない?
my $p = 9;
my ($moji) = ($xx =~ /([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]){$p}/);
print $moji;

お勧めは、version5.8以上なら>>600さんの通りEncodeで、
それ未満なら、
http://search.cpan.org/~sadahiro/String-Multibyte-1.05/Multibyte.pm
0604nobodyさん04/11/08 00:46:30ID:???
どこまでしたいか謎だったからなぁ。やりたいのはこうかもしんないし。
my @moji = ($xx =~ /[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]/g);
print @moji[2..8];

なんにせよ環境も要件もよくわからんと返しようがないのぉ。
060559704/11/08 02:03:34ID:???
パールは5.8 以上みたいです。
トリップ生成用途だったのですが、これでうまくいきそうです。
みなさんどうもありがとうございます。
060659504/11/08 09:25:10ID:???
>>596
動きました!ありがとうございます。
060759504/11/08 11:09:36ID:IV2+5aK4
@data = split(/\n/, <DAT>);
で代入したら、$data[0]にしか代入されていません。
どなたかよろしくお願いします。
0608nobodyさん04/11/08 12:07:11ID:???
>>607
その場合の <DAT> は一行しか読み込まないので、当然そうなるだろう。

というか何がしたいのだいったい。
ひょっとして君のやりたいことは @data = <DAT> だったりしないか。
0609nobodyさん04/11/08 13:34:38ID:???
つーか、<DAT>って何よw?
061059504/11/08 15:22:15ID:hLOeveWj
>>608-609
あっ、すみません。<DAT>はファイルハンドルです。

>>608
なぜこの場合だと一行しか読み込まないのですか?
では、どうすればすべての行を読み込んでくれますか?

説明不足ですみません。返答お願いします。
0611nobodyさん04/11/08 15:27:35ID:???
>>610
608をちゃんと読めアホ
061259504/11/08 16:59:14ID:x02iMqC5
>>611
すみません。やっていることがおかしかったですね。
ありがとうございました。
0613nobodyさん04/11/08 17:06:22ID:???
ちょっとすれ違いなのですが
http://www98.sakura.ne.jp/~jun/perl/
どなたかここの移転先を知りませんか?
Perlに関するTipsや排他制御について、リファレンスについて説明してあったサイトなのですが
何時の間にかなくなったようで、、、、
0614nobodyさん04/11/08 17:17:29ID:???
ちょっとどころじゃなく全くのスレ違いなんですが、
閉鎖したんじゃないですかね?

どうしても見たいなら

ttp://web.archive.org/

でも使って下さい。
0615nobodyさん04/11/08 21:29:51ID:???
@var=<IN>;
とすると改行\nが消えないですが、それを消して配列に代入する方法はありませんか。
0616nobodyさん04/11/08 21:45:10ID:???
たまにこういう釣りみたいな質問が来るな
0617nobodyさん04/11/08 21:57:37ID:???
>>615
{ local $/ = undef; @var = split(/\n/, <IN>); }

あたりかな。ただしファイルの末尾の空行が消えるのが嫌なら、
splitの第3引数に負の値を与えるとともに、splitしたあとで
@varの最後の要素を捨てる必要があるだろう。

普通に読んだ後でchomp @varした方が書くのは楽だね。
0618nobodyさん04/11/08 22:31:46ID:???
chomp(@var=<IN>);
0619nobodyさん04/11/09 00:16:14ID:???
配列をヒアドキュメントでprintするとスペースも一緒にprintされてしまうわけですが、
これを回避するにはいちいちヒアドキュメントを閉じるしかないですか?
0620nobodyさん04/11/09 00:47:01ID:???
no
0621nobodyさん04/11/09 01:27:59ID:???
>>619
$"を空文字列にしておく

あるいは、

@{[join('',@a)]}として埋め込む
062261904/11/09 02:18:31ID:???
>>621
腸ありがとう
0623nobodyさん04/11/09 06:54:36ID:???
>616
このスレで質問するとよく言われます。。

>617>618
ありがとうございます。
0624nobodyさん04/11/09 07:22:29ID:???
>623
言われないように努力したりしないの?
釣りだと思われるような質問しちゃってるんだよ?
0625nobodyさん04/11/09 07:43:45ID:???
Perlから,自分が動いているOSを知ることは出来ますでしょうか。
例えばWindowsで下を実行すると

print $^O
> MSWin32

とか出ますが,WinXPとかWin98とかくらいまで詳しく知るには,どういう方法がありますか。
(できればUnix系でも詳しく知りたいです)
0626nobodyさん04/11/09 09:36:25ID:enWymUQX
別のウェブサーバー上にあるファイルの情報をstatとかで更新されているか、
されていないかとかしたいのですが、どうやってやったらいいのでしょう?
$url = "http://www.example.com/file.jpg";
@data = stat $url;
とかやっても取れないので(うすうすわかっていましたが)。。。
ウェブ上のデータとstatの内容を取得する方法を教えてください。
0627nobodyさん 04/11/09 09:59:56ID:???
>>626
lwpでもなんでもいいけど
httpのヘッダで
Date か Last-Modified みるしかなかんべ。
取れなかったら諦めるしかない。
0628nobodyさん04/11/09 10:07:38ID:enWymUQX
>>627
ありがとう。
そういうものなんですか。
0629nobodyさん04/11/09 18:49:56ID:???
>>625
$hoge =`uname -m`; とか。
詳しいことはUNIXのコマンドリファレンスでも探せば良し。

>>626
他のサーバーのデータは、
socketでソケット作って、connectで繋いで初めて得られる。
色々複雑だから、素直に解説本読みなはれ。
0630nobodyさん04/11/09 19:46:44ID:???
>>625
http://aspn.activestate.com/ASPN/docs/ActivePerl/lib/Win32.html

use Win32;
print join(', ', Win32::GetOSVersion()), "\n";
print join(', ', Win32::GetOSName()), "\n";
0631nobodyさん04/11/09 22:34:49ID:???
>>629-630
ありがとうございます。こんな風にしていろいろな環境でOS名を取得できました。
# 自分の目的のためには下の例で事が済んだのですが。

#-------
my $OS;
if ( $OS = `uname -s` ) {
    #do nothing
} elsif ( !$OS and eval{require Win32} ) {
    $OS = ( Win32::GetOSName() )[0];
} else {
    die "MacPerl?";
}
print $OS;
> Linux, FreeBSD, Win2000, Win98...

#-------
my $OS = $^O;
if ( $OS eq 'MSWin32' ) {
    require Win32;
    $OS = ( Win32::GetOSName() )[0];
}
print $OS;
> linux, freebsd, Win2000, Win98...
0632nobodyさん04/11/09 23:22:24ID:mn5HDpbS
CGIにhtml組み込んで、
アクセスしてみたら、真っ白のページが表示されます。
んで、ホームページのソース表示してみたら、
確かにそこにはhtmlソースがちゃんとあるんだけど、
表示されていない。

原因はどんなことが考えられますでしょうか?
0633nobodyさん04/11/09 23:29:58ID:???
>>632
どうせまともな HTML 吐いてないとかじゃないの?
0634nobodyさん04/11/09 23:31:31ID:???
タグの閉じ忘れ


つうか原因探ってほしいならソースをどっかにあげましょう
063563204/11/09 23:34:40ID:mn5HDpbS
print <<__HTML__;
Content-Type: text/html; charset=EUC-JP

<html lang="ja"><head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP">
<title>test</title>

このコードに問題ありますか?
063663204/11/09 23:36:40ID:???
タグの閉じ忘れっぽいですね、
他ブラウザで試したら表示されました。
企業から配布されてるスクリプトなのにテキトーだなぁ

サンクスでした。
0637nobodyさん04/11/10 00:18:59ID:sQyPPo3N
スレ違いだったら大変申し訳ございません。

cronでcgiを動かすにはどのように設定ファイルを書けば宜しいのでしょうか。

/public_html/a.cgi
にありますcgiを例えば1時間毎にa.cgi?a=1&b=2とパラメータを渡してcronで
実行したいのですが。

よろしくお願い致します。
0638nobodyさん04/11/10 00:22:22ID:???
スレ違いだな。スレタイを100回音読してから、また質問しに来ような
0639nobodyさん04/11/10 00:37:27ID:sQyPPo3N
>>638
大変申し訳ありません。
該当スレを御存知でしたらお願いしたいのですが。
0640nobodyさん04/11/10 00:39:15ID:???
>>639
犬板のくだ質
0641nobodyさん04/11/10 05:09:30ID:???
>>637
perl /public_html/a.cgi
パラメータは渡せるが動的にするのはcronじゃ無理じゃないかな〜(知らないだけかも)
ちなみにコマンドラインのときはGETメソッドじゃなく引数になるから受け方違うよ

a=1とb=2が決まってるなら
ファイルの最初に宣言した方が早い

どうしてもCGIとして動かしたいならばWWW経由で/public_html/a.cgiを呼び出すプログラムが必要

それよりコマンドラインでperlを使ったことなさそうだけど
作るときちゃんと文法チェックしてるのかな?
0642nobodyさん04/11/10 08:39:47ID:QcwLl9v+
誘導済みのスレ違いの質問にレス付ける馬鹿。
晒し上げ。
0643nobodyさん04/11/10 11:45:26ID:I1NueUmN
@data = (system("df"));
とかして、ディスクの使用状況をテキストに書き出したいんだけど、
これじゃあ戻り値を取得できないですよね。
どうやったら取得できますか?
0644nobodyさん04/11/10 11:55:42ID:I1NueUmN
643です。
自己解決しますた。m(_ _)m
0645nobodyさん04/11/10 16:07:28ID:???
PERLで作成したファイルをPERLからダウンロードさせる場合に
どのようにしたらいいのでしょうか?

ファイル作成後に「ダウンロード」とボタンを表示してクリックしたら
ファイルをダウンロードするみたいな感じです。
0646nobodyさん04/11/10 17:04:37ID:I1NueUmN
>>645
print "<a href=\"file\">DL</a>\n";
0647nobodyさん04/11/10 18:18:53ID:???
リダイレクト前にcookieを作って、リダイレクトページで生成したcookieの値を取得したいのですが、
結構な頻度で値が取得できません。
ですが、少し時間をおいて取得すると値が取得できるので、
cookie作成のスピードよりもリダイレクト後のページで値を取得してるっぽいです。

従いまして、cookie作成時に少し時間を開けてからリダイレクトしたいのですが、
sleepを入れても意味がありませんでした。

この様な場合の対処方法をご存知の方がいらっしゃいましたら、どうかご教授ください。

よろしくお願いいたします。
0648nobodyさん04/11/10 20:55:28ID:sQyPPo3N
ファイルから1行読み取り、その読み取った行を削除してファイルを上書きするにはどうしたらよいのでしょうか。

aaa,bbb,ccc,ddd
111,222,33,4444

このようなファイルがありaaa,bbb,ccc,dddを読み込んだ後にaaa,bbb,ccc,dddを削除して
ファイルを上書きするような処理です。

よろしくお願いします。
0649nobodyさん04/11/10 21:03:44ID:???
>>645
「ダウンロード」とボタンをクリックしたらファイルを作成して
print "Location: http://www.example.com/file.zip\n\n"
0650nobodyさん04/11/10 21:52:59ID:QZhMSK0D
>>645
ダウンロードボタンをクリックしてCGIでperlを動かした先で

$length = (-s $file);
print "Content-type: application/octet-stream\n";
print "Content-disposition: attachment; filename=hoge.dat\n";
print "Content-Length: $length\n\n";
open(fp, "<$file");
binmode(fp);
print <fp>;
close(fp);

するとOKだと思う
0651nobodyさん04/11/10 21:55:59ID:QZhMSK0D
>>648

削除したい行以外を別の一時ファイルに書き込んで、元のファイル名にリネームする
で良いんじゃない?

他にいい方法があれば知りたい
0652nobodyさん04/11/10 21:57:30ID:???
何でわざわざ別ファイルに書かせなきゃならんのかがわからん
0653nobodyさん04/11/10 22:21:12ID:???
>>647
クッキーを食べない時と食べる時がある状況が良く分からないけど…。
<meta http-equiv="refresh" ..>
を使ってクライアント側で飛ばして見るとか。

# 状況は改善されない予感。
0654nobodyさん04/11/10 22:24:11ID:QZhMSK0D
読み書きモードでオープンすればいいんだっけ?
0655nobodyさん04/11/10 22:30:47ID:???
読み書きモードでその場更新でもいいけど、更新中にプログラムが
あぼーんすると変な状態で残ったりする。別ファイルに書き込み、
書き終わったらrenameなら書き換え前か書き換え後のどっちかには
なるので、オレはこのほうが好き。

0656nobodyさん04/11/10 23:55:31ID:???
>>647
確認できるソース求む
0657nobodyさん04/11/11 00:08:27ID:???
647ではないんだけどプログラム変えてないのに
IEでcookieが急に読めなくなった。(前はできてました。)
プログラムAでcookie送信してプログラムBに遷移して
そのcookieを取ろうとしても取れなかった。
他のcookieは取得することができました。
ネスケでは大丈夫だったんだけどなぁ。

ちなみにCGI.pm使って
$hoge=param('hoge');
とやって$hogeが空になっており、
cookieのフォルダを見るとちゃんとそのcookieがありました。
0658nobodyさん04/11/11 00:21:14ID:???
>>657
確認できるソース求む
0659nobodyさん04/11/11 00:52:30ID:???
まずはIEのクッキー設定を疑うよろし。
066065704/11/11 01:49:17ID:???
657ミスりました。
paramのとこcookieです。

>>659
クッキーの設定も疑って全て許可にしてもだめだったのです。
でも、今家のPCで同じスクリプト走らせたらできました・・・。
で、サーバの方も試したらできました。
仕事場のPCからやった時はできなかったんですよほほほ。
ご迷惑おかけしました。
0661nobodyさん04/11/11 11:33:09ID:???
文字列$aが数字以外を含んでいたら、
エラー出したいんですが、
どうすればいいんでしたでしょうか?
~[0-9]を使えばいいことはわかるんですが・・・

if($a=^[0-9]){
echo"error";}

何か間違ってますか?(^^;
0662nobodyさん04/11/11 11:35:42ID:???
age
0663nobodyさん04/11/11 11:51:58ID:???
>>661
うむ、それもかなり激しく

if($a=~/[^0-9]/){
0664nobodyさん04/11/11 11:54:04ID:???
>>663
間違えまくってますね笑汗
ありがとうございます、助かりました。
0665nobodyさん04/11/11 13:59:06ID:???
/\D/ 小泉こうだろう?
■ このスレッドは過去ログ倉庫に格納されています