【Perl】初心者コーナー Part13
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/05/30 13:06ID:R2kt1mTx1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0314nobodyさん
02/06/18 16:38ID:OAKwZ56o#!/usr/bin/perl -w のオプションは機能しませんよね?(実際機能してないようなので。)
0315314
02/06/18 16:44ID:???0316nobodyさん
02/06/18 18:21ID:???use strict;
my ($a, $b);
local $c;
$a = 2;
$b = 3;
$c = $a + $b;
print "Content-type: text/html; charset=EUC-JP\n\n";
print $c;
こうすると
Global symbol "$c" requires explicit package name at (eval 1) line 6.
Global symbol "$c" requires explicit package name at (eval 1) line 10.
Global symbol "$c" requires explicit package name at (eval 1) line 13.
こういうエラーが出るのですが、すべてレキシカル変数にすると動きます。
なぜローカル変数だとuse strictでエラーが出るのでしょうか?
実際のスクリプトは複雑でどうしても$cをローカル変数で使いたいのです。
どうすればグローバル変数を使わずに正常に動かすことができるでしょうか?
0317nobodyさん
02/06/18 21:52ID:???なぜエラーになるかは、perldoc strict を読むべし。
「variable suicide問題を避けるため」らしい。よくわからんけど。
どうしてもlocal変数を使わなくてはいけない場合は、
use vars ('$c', '@array', '%hash'); # perl5.0
または
our ($c, @array, %hash); # perl5.6
みたいに、最初に変数名を宣言(というかシンボルテーブルに登録)しておく。
以上、経験則のみで答えますた。詳しくは識者の登場を待て。
0318nobodyさん
02/06/18 22:39ID:???ありがとうございます。
>use vars ('$c', '@array', '%hash'); # perl5.0
>または
>our ($c, @array, %hash); # perl5.6
これでいけました。恥ずかしながら今まで知らなかったので(汗)、これを機に勉強してみます。
0319nobodyさん
02/06/19 01:44ID:nhdfxt0tmake testをすると、『Test/More.pmが見つかりません』というようなことを言
われます。More.pmは何かのファイルに同梱されてるのでしょうか?
一応以下のURLを探してみたのですが、見つかりません…。
http://www.cpan.org/modules/by-module/
どなたかMore.pmがある場所を教えて下さい。
0320nobodyさん
02/06/19 02:03ID:???0321nobodyさん
02/06/19 02:32ID:???解決しました。
Test-Moreはもう古く、入れるならTest-Simpleでやってくれと
言われて、Test-Simple-0.44.tar.gzを入れました。
うまくいきました。
ありがとうございました。
0322nobodyさん
02/06/19 19:05ID:oqQh34R0画像を表示させたいのですが上手くいきません
print "Content-type: image/gif\n\n";
open(IMG,"test.gif");
binmode(IMG);
binmode(STDOUT);
print <IMG>;
close(IMG);
KENTカウンタからそれらしい部分を
抜き出してみましたが動きません
画像はとほほカウンタのを使ってテストしてるので
変なヘッダーが入ってるということはないと思います。
http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.htmlの
600も試してみましたが動きません…。
誰か助けてください…。(;´д`)
#画像表示すらできない自分が情けない(´Д⊂
0323s
02/06/19 19:28ID:???みたところおかしな部分はないようです。他の部分ってことない?
0324nobodyさん
02/06/19 19:29ID:???> print <IMG>
↑この部分を↓こう変えてみそ
while ( $cb = read( IMG, $data, 2048 ) ) {
print $data;
}
0325LWPを使ってみたいのですが
02/06/19 21:29ID:FGMnMj5WLWPをダウンロードしてきたけど、なんかひとつのpmファイルになってないようで
そのまま使えそうにありません。
使用してるのはwakwakのCGIなので使用条件が載っているページを見てみたのですが
perl5.6で標準ライブラリ?は利用できるようです。
で、標準ライブラリにあるか
試しにuse LWP::Simple;でCGIを動かしてみたのですが、内部エラーになりました。
LWPは、この環境では使うことはできないのでしょうか?
・インストールする方法(できないと思うが)
・インストールせずにデレクトリに配置して動かす方法
・他のCGI可無料HPですでにLWPがインストールされてるのでそこを使うといい
等々、なにか良い方法はないのでしょうか?
使うのは多分LWP::SimpleでHTMLドキュメントを引っ張ってくるだけです。
0326322
02/06/19 21:51ID:???ありがとうございます。
原因はわかりませんが、両方の方法を試してみて
ダメだったので元に戻したら表示されました (´∀`;)意味わかんねス
0327nobodyさん
02/06/19 22:33ID:???LWPはperlコードだけで構成されてるから、自分で入れることも可能だと思う。
ただしLWPが入ってないサーバつーのは、そもそもソケットの使用を禁止してる場合も多い。
そんときはLWPを入れても無意味。
0328LWPを使ってみたいのですが
02/06/20 00:34ID:XCYMLnG6use Socket; 自体は動作しますが、Socketで通信を許しているのは localhostへのsmtp/tcpのみとなります。
だそうです。
これって望み薄ですか?
ちなみにやり方間違ってるっていうチョンボはしてませんよね?(僕)
ただuse LWP::Simple;としているだけなのですが・・・
0329LWPを使ってみたいのですが
02/06/20 01:43ID:+cy8aoAH自作CGIのでバック設定というのができるみたいで
それを使ってやってみました。
最初は、HTTP/Statusのパスがうまく行っていなかったようなので
@INC追加したら、そこはクリアできました。
ただ
unless(defined($content = get $url)){
のところで
Can't call method "get" on an undefined value
が出てしまいました。これは無理と言うことでしょうか?
0330nobodyさん
02/06/20 07:49ID:???>Socketで通信を許しているのは localhostへのsmtp/tcp
駄目ジャン。
smtp/tcpってメール送信用のポートだし。localhostのみだし。
0331LWPを使ってみたいのですが
02/06/20 15:27ID:zhAJDQeRどっか、CGI可無料HPでできそうなところないですかね。
0332nobodyさん
02/06/20 19:54ID:???0333nobodyさん
02/06/21 03:04ID:???0334nobodyさん
02/06/21 03:40ID:ovOj5UMI0335nobodyさん
02/06/21 06:01ID:???できないYO!!
0336nobodyさん
02/06/21 06:03ID:???0339nobodyさん
02/06/21 11:37ID:Qqq2SOCGArray→アレイ とか
$→スカラー とかいうふうに。
require ってどう発音していいかわからないんですよ(汗)。
0340nobodyさん
02/06/21 11:41ID:???0341nobodyさん
02/06/21 12:10ID:???0342nobodyさん
02/06/21 12:19ID:???発音記号の読み方を勉強しましょう。
0343nobodyさん
02/06/21 13:39ID:???普通、発音記号の読み方って授業でやるもんですか?
うちんとこやらなかったんですよ。
商業科だったんで。
parentsとかも、その<p>で始まるやつ!親っていう意味だ! と、いう覚え方してるもんなあ……簡単なのは読めるんですが。
0344nobodyさん
02/06/21 13:43ID:???chdirとか。
Change Directoryの略でええんかい? とか。
まあ、いろいろと疑問があったんで、そういうの解説してるようなサイトとかないかなーって前から思ってたんですよ。
0345nobodyさん
02/06/21 13:48ID:???商業化の中学校なんてあるのか。
>344
その単語で検索をかけるとかしてみた?
ttp://www.google.com/search?as_q=chdir+change+directory&num=100&hl=ja&ie=UTF-8&oe=UTF8&btnG=Google+%E6%A4%9C%E7%B4%A2&as_epq=&as_oq=&as_eq=&lr=lang_ja&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=
1520件もひっかかるんだけど。
0346nobodyさん
02/06/21 13:50ID:???小学校からやり直してきまつ。
0349nobodyさん
02/06/21 16:45ID:???発音記号は英和辞典に載ってる。
読め。
>348
一番上にひっかかるサイトにかなり載ってる。
読め。
じゃなければ検索用語に他のコマンドも入れてみろ。
頭使え。
0350nobodyさん
02/06/21 17:26ID:???脳内では「しーえっちでぃあ」って言ってる・・・(w
0351nobodyさん
02/06/21 20:55ID:???口に出すときは"チェンジディレクトリ"だけど。
0352nobodyさん
02/06/21 20:59ID:YFodOum0英語圏ではちだーですね
0353nobodyさん
02/06/21 21:20ID:???0354nobodyさん
02/06/21 21:52ID:???Makefile.plっていうのは自分で書かなきゃきけないんですか?
自動で生成するツールはないでしょうか?
0357nobodyさん
02/06/22 00:31ID:???挿れようとしたらインストールが完走しない…鬱
俺はできたぜ
0361nobodyさん
02/06/22 01:15ID:???0362nobodyさん
02/06/22 01:58ID:???激しく感謝!!
よく見たらHDD残量が150MBしかなかったので、足りない悪寒でした。
(−_−)ウツダシノウ
嗚呼、10MBもあるドキュメン入れたくねぇ…
0363nobodyさん
02/06/22 09:50ID:???ActivePerlって下の環境残したまま上書きインストール出来るっけ?
最新版にしたくてもそれがほそろしくて試せない…
0364nobodyさん
02/06/22 10:40ID:KPuvG/sZuse LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
my $ua = new LWP::UserAgent;
my $request = new HTTP::Request('GET', $ARGV[0]);
my $response = $ua->request($request);
if ($response->is_success) {
print $response->content;
} else {
print $response->error_as_HTML;
}
で、
hcat.pl http://www.hyuki.com/dp/dp.jpg > dp.jpg
とすして、dp.jpgを見ると、ちゃんとした画像になりません。
どうしてでしょうか。教えてください。
環境は、ActivePerl v5.6.1 built for MSWin32-x86-multi-thread、
windows2000 professional です。
0365xx
02/06/22 10:49ID:???開けないけど容量はあるってことだろうから、ファイルハンドルを binmode
すれば?
できるけどオススメしない。
0368べっくあむ
02/06/22 12:16ID:9y/Dp6Qo書籍やインターネットでやり方を調べていく中で、次のような
注意事項が記載しているものを見つけました。
1:$dbh = DBI->connect(****);
2:$sth = $dbh->prepare(*****);
3:$sth->execute();
4:$sth->finish();
5:$sth = $dbh->prepare(*****);
6:$sth->execute();
7:$sth->finish();
8:$dbh->disconnect();
の様に一回のDBコネクション中で2回のコマンド発行を
するときは、一回目(上記2〜4)と二回目(上記5〜7)で
ハンドル変数名を変えなければならない(例えば5〜7は
$sthではなく、$sth2にする)というものです。
自分の環境下の簡単なプログラム中では問題なく
動いているのですが、本当に注意すべき内容なのでしょうか?
0369nobodyさん
02/06/22 14:04ID:fNvTUaUi..⌒ヽ ' ⌒ヽ /.|:::::::::::|
乂乂|| |乂乂|| | |:::::::::::|
乂乂|| |乂乂|| | |:::::::::::|
乂乂|| |乂乂|| ___|_|:::::::::::|____
乂乂|| |乂乂|| /|::::::::::::::::::::::::::::::::::::::::::::::::::::::::|
 ̄ ̄  ̄ ̄ i |::::::::::::::::::::::::::::::::::::::::::::::::::::::::|
_____ .|/ ̄ ̄ ̄../|:::::::::::| ̄ ̄ ̄/
||L L | L L ||  ̄ ̄ ̄ ̄| |:::::::::::| ̄ ̄ ̄
||L L | L L || | |:::::::::::|
||L L | L L ||_________ .| |:::::::::::|
===========l| L L l================= i |:::::::::::|
二二二二二二ヽ iヽ二二二二二二二二i |:::::::::::|
:::::::::::::::::::::::::::::::::::i ヽ| _____.i |:::::::::::|
 ̄ ̄ ̄ ̄ ̄ ̄ ̄\ ((( )))_______| |:::::::::::|
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|......( ´Д`)._____| |:::::::::::|__
::::::::::::::::::::::::::::::::::::::::: | / (S)::::::i\ ....| |:::::::::::| \
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| .\ ....\|:::::::::::| \
____/|____ .| .\  ̄ ̄
/
| Perlスクリプトから、2ちゃんに書き込める方法を教えてください。
\_______________
0370永久会員パスが書き込みするだけで当たる
02/06/22 14:12ID:E0ppwG7Lhttp://s1p.net/tyyopp
わりきり出会い
UG-S的出会い
PCのみ受付中
男性、女性書き込み
キャンペ-ン中
おかげさまで5000HT
ラッキナンバー
(111,333,555,777,999)
男性、女性書き込み するだけ
当選者には永久会員パスワード
と1万円プレゼント!!
0371nobodyさん
02/06/22 14:57ID:???別に変えなければ動かないということはないけど違う用途の
(ハンドル|オブジェクト|数|文字列|・・・)を同じ変数に代入して
変数を使いまわすのは間違いをおかしやすかったりとあまり良い
スタイルとは言えないかも。
(同様に$sth1、$sth2という名前もお勧めできない)
0372nobodyさん
02/06/22 19:01ID:PwKD5Bpr$dir = ディレクトリ 、 $file = 数字
open(DATAOUT, "+< $dir . $file . '.dat'") || die &Error;
えっとこういう処理があるんですが、読み書きモードでファイルを開けないんです。
というかファイル名を認識してくれないみたいです。
open(DATAOUT, $dir . $thismonth . '.data') || die &Error;
↑このように読み込みモードだとちゃんと認識してくれるんですが、読み書きモードでちゃんと
認識するようにするにはどうすればよいでしょうか?
いろいろ "" を '' にしたり、. を \. にしてみたりしたんですがうまくいきません・・。
お願いします。
0373nobodyさん
02/06/22 19:36ID:???もうちょっとダブルクォーテーションについて考えてみた方がいいぞ。
open(DATAOUT, "+<$dir$file\.dat") || die &Error;
0374372
02/06/22 19:42ID:???おぉ〜〜〜できましたっ!! ありがとうございます!
>もうちょっとダブルクォーテーションについて考えてみた方がいいぞ。
はい考えてみます (´Д`;;)
ありがとう。
0375アルバムモナ
02/06/22 19:57ID:sE7wyej0Exif形式に対応してなくて困っています。
下記のものを改造してExif形式にも対応させたいのですがどのようにしたらいいでしょうか
教えてください。
http://www.aleph.co.jp/~fujiwara/perl/get_imgsize.pl
0376べっくあむ
02/06/22 21:20ID:9y/Dp6Qoありがとうございます。
動作上は問題ないと言うことですね。
>変数を使いまわすのは間違いをおかしやすかったりとあまり良い
>スタイルとは言えないかも。
確かにこんな変数名では、ちょっとしたタイプミスで、
見つけ難いバグを自らの手で作ってしまいますよね。
気をつけてみます。
0377nobodyさん
02/06/22 21:20ID:???そんな3年も前の化石なんか使うなよ。
これじゃだめなのか。
http://search.cpan.org/search?dist=Image-Size
0378nobodyさん
02/06/22 22:37ID:???半角カナを全角に変換とかはしたくないんですけど。。
0379xx
02/06/22 23:26ID:???サーバの環境および現在のフォーム出力文字コードぐらいは書いてもらわないと、、、、
0380nobodyさん
02/06/23 18:26ID:izD8oNpGDドライブにある下記のようなCGIスクリプトをapache経由で実行したら、
. のみでした。
そこで、コマンドプロント上で「perl inc.cgi」と実行したら、
ちゃっんと
C:/usr/local/lib
C:/usr/local/site/lib
.
とでます。
apache経由でも
C:/usr/local/lib
C:/usr/local/site/lib
.
になるようにできますか?
-----
#!/usr/bin/perl
print "Content-type:text/html\n\n<xmp>";
for(@INC){
print $_,"\n";
}
exit;
------
0381nobodyさん
02/06/23 18:30ID:jOy7H3G4原因はよくしらないがperl -Iでどうかね。
それか@INCに対しpushするか。
0383380
02/06/23 19:00ID:???perlをc:/usr/local にインストールしたのですが、
/usr/bin/perl のスクリプトでも使えるように、
C:/usr/local/binをc:/usr にコピーしてたのが原因だったようです。
#前まではできてたのになぁ。。。
0384nobodyさん
02/06/24 01:51ID:???$n=pack "h*", "$_";
print $n;
}
で読み込んだテキストを元にもどす方法ってどうやるんですか?
while(<>){
$n=unpack "h*", "$_";
print $n;
}
じゃだめなんですけど
0385nobodyさん
02/06/24 03:26ID:???それpackとunpackの使い方が逆でない?
while (<>) { print unpack("h*", $_); } # テキスト→16進
while (<>) { print pack("h*", $_); } # 16進→テキスト
0386nobodyさん
02/06/24 18:03ID:pso5a6KFopen(DATA, ">$cdata")|| &write_error;
flock(DATA, 2);
print DATA @newdata;
flock(DATA, 8);
close(KDATA);
などとしています。
このflockは排他処理には役に立たないような事がよく
書かれていますが全く役立たないのでしょうか?
なにも処理しないよりはマシという程度ですか?
0387nobodyさん
02/06/24 18:21ID:???>って宣言するだけです。礼儀正しい人は「もう触ってもいいよ」って言われるまでは触りません。礼儀正しくない人は構わず触っちゃいます。ただそれだけです。つまり、単なる紳士協定。OK?
># これ以上簡単な説明は出来ないよ。
過去スレのJAPUさんのセリフより。
0388nobodyさん
02/06/24 18:41ID:kznFdEhQflock(DATA,8);は別にいらん
0389nobodyさん
02/06/24 19:35ID:???全体を見ないと確かなことは言えないけど、
書き込みのときだけロックしてもだめ。
データの読み出しから書き込みまで、
ずっとロックし続けないと排他処理にならない。
0390nobodyさん
02/06/24 21:50ID:???【Perl】ファイルロック(排他処理)について語ろう
http://pc.2ch.net/test/read.cgi/php/1024795138/
0391386
02/06/24 21:52ID:pso5a6KFありがとうございます。
>>388さん そうなんですか、知りませんでした。
>>389さん これも驚きました。読み込みの時はflock使ってませんでした。
本に書いてあるものをそのまま参考にしていました。
わたしの使い方は問題あるんですね。もう少し調べてみようと思います。
0392nobodyさん
02/06/24 22:32ID:???>>386のロックが役に立たないってのは
open HANDLE, ">file"; # まずfileの中身を空にして開く、と…
flock HANDLE, 2; # ロックするかな
このopen & truncateが問題だろ。
正しくは
open HANDLE "+<file"; # 読み書きモードで開く、と…
>>386の方法でも何もしないよりはマシかもしれんが、
確実に効果がある、とは程遠かろう。
0393nobodyさん
02/06/24 22:49ID:???それをopen(&flock)してる間に処理、っていうのがいいんじゃないかな。
0394nobodyさん
02/06/25 13:52ID:???そういう場合は、やはりgrepでしょう。
@URI = grep { s/^Location_URL=(.*)/$1/ } @list;
0396nobodyさん
02/06/25 15:48ID:???grepで元の配列を壊すのはいかがなものかと。
@URI = grep { /^Location_URL=(.*)/ } @list;
0397396
02/06/25 16:00ID:???ところで元の配列を壊さずに一部を取り出す一番効率の良い方法ってどんなんだっけ…。
@URI = map { substr $_, 13 } grep { /^Location_URL=(.*)/ } @list; # じゃないよな…
0398394
02/06/25 16:24ID:PBYsCZmL元を壊さずにそれ(>>397)より効率のいい方法ってあるんかいな。
0399fusianasan
02/06/25 16:51ID:???59点ってとこだな。
0400nobodyさん
02/06/25 17:02ID:???@URI = map{ /^Location_URL=(.*)/ ? $1 : () } @list;
0402perl5.6.1
02/06/25 21:24ID:???失敗しなくするにはどうすればいいですか?
#!/usr/bin/perl -w
use strict;
sub t($);
open(F, "+<in.txt"); # aが30個くらい並んだだけのファイル
t(*F{IO});
close(F);
sub t($)
{
my $f = shift;
truncate($f, 10) || warn("error");
}
0404nobodyさん
02/06/25 23:21ID:???402じゃないけど質問させてください。
open F, ">file.txt" or die;
my $fh = *F{IO};
print {$fh} "test\n" or die;
truncate *$fh, 10 or die;
close $fh or die;
このコードで、printやcloseは$fhでも*$fhでもオーケーなのに
truncateだけは*$fhしか指定できないんですが、どういうこと?
0406404
02/06/25 23:35ID:???実は402を見てからperlrefとか読んでいろいろ実験してたので、
まだIOオブジェクトがよくわかってないのですが、
これがバグとわかれば安心して眠れます。
0407nobodyさん
02/06/26 03:05ID:???なんでそんなわかりにくいもん使うの?オブジェクト使いたかったら
素直にIO::Fileとか使えばいいのに・・・
0408perl5.6.1
02/06/26 07:02ID:???printに*$fhって渡せました?
おれの環境では下のコードはsyntax errorになるんです。
#!/usr/bin/perl -w
use strict;
my $stdout = *STDOUT{IO};
print *$stdout "test\n"; # print $stdout "test\n";なら大丈夫
>>407
モジュールの使い方を調べたり覚えたりするのが面倒だっただけです。
*FOO{THING}自体はそんなに分かりにくいものでもないし。
関係ないけど、sort { $a <=> $b } @f;の方が分かりにくいです。
use strict;なのに$aと$bは宣言しなくていいのは何、みたいな。
0409nobodyさん
02/06/26 09:25ID:???use IO::File;
my $fh = IO::File->new( $filename ); ## open()と基本的に同じ
print $fh "foobar\n";
のどこが面倒くさいのだろうか。少なくともグロブがなんちゃらとか
考えるよりかはるかにシンプルだと思うんだけどな。大体perldoc perlref
を読んでる暇があるのにperldoc IO::Fileが面倒くさいのもわからんし。
まぁ使いたくなかったらそれはそれでいいんだけど。素直に使ったほうが
楽だし、そのほうがPerl コミュニティのカルチャーにそってると思う。
0410404
02/06/26 09:37ID:???print関数の第1引数は、シンボルでもスカラ変数でもない場合は
ブロックに入れないと構文エラーになるよ。(昨日覚えた)
print {*$stdout} "test\n";
>>409
ほっといてくれー。こういう瑣末なことを調べるのが趣味なんだよー。
たぶん408の人も、おれと同じタイプ。
あ、もちろん実際にスクリプト書くときは素直にIO::File使います。
0411nobodyさん
02/06/26 12:14ID:???ああまぁ趣味のスクリプトとかならいいんですけどね。
プロダクションコードでそういうのを見たくないのでとりあえず
牽制した、ということで。
0412nobodyさん
02/06/26 15:38ID:1ADBKX33(公開といっても使うのはネットの仲間だけ)これだけはしちゃイカン!って
処理とかあるんでしょうか?cgiのバグでunixコマンドを打てるとかっていうのが
気になるんですけど。
■ このスレッドは過去ログ倉庫に格納されています