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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/05/30(水) 11:34:01ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

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

前スレ http://pc11.2ch.net/test/read.cgi/php/1171102883/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0599nobodyさん2007/07/29(日) 22:11:15ID:???
>>598さん
できました!ありがとうございます!!
0600nobodyさん2007/07/30(月) 04:51:28ID:???
質問です。perlの質問ではなさそうですけど、詳しそうな人が多そうなので…

フォームに入力されたメールアドレス宛てに、sendmailで送信しているのですが、
例えば、hogehoge@yahoo.co.jpと入力しようとして、誤ってhogehoge@yahooと入力すると、
hogehoge@yahoo.sakura.ne.jpのように、レン鯖のホスト名が補完されるのは仕様なのでしょうか。(レン鯖はさくらです。)
0601nobodyさん2007/07/30(月) 04:55:48ID:???
市ね、板違い
0602nobodyさん2007/07/30(月) 09:53:03ID:???
送る前にドメインチェックぐらいしろよカス
0603nobodyさん2007/07/30(月) 16:13:02ID:9vd3BgBN
質問です。

Class::DBI で Postgres にアクセスしているのですが、
任意のデータの "stat" というカラムのデータを書き換えるために
$self->stat("now()::text || ',$stat'");
としたところ、書き換え後のデータ内容は
now()::text || ',00000001'
となってしまいました。

2007-07-30 16:09:47+09,00000001
↑こうしたいのですが、どうすればいいでしょうか?

SQL の UPDATE文でないとだめですか?

0604nobodyさん2007/07/31(火) 11:45:26ID:???
何でPerlの日付関数を使わないの?
特に理由があるならSQL文発行すればいいんじゃないの
0605nobodyさん2007/07/31(火) 15:58:20ID:???
類推してこんなんか。

now()::text.','.$stat
06066032007/07/31(火) 17:21:44ID:???
レスありがとうございます。

>604
1行で書ければラクかなと思ったのですが・・・
Perl の localtime で文字列 $new_stat を生成してから、
$self->_stat($new_stat);
とすることにしました。

>605
syntax error って怒られました。
0607nobodyさん2007/07/31(火) 17:40:25ID:???
$self->stat("now()::text || ',$stat'");
$self->stat(now()::text || $stat);
0608nobodyさん2007/07/31(火) 18:19:29ID:???
1行ね〜、無理やり書くとこんな感じか。$selfてのが謎だが
$self->sql_stat(do{ref($self)->set_sql('stat',q{UPDATE __TABLE__ SET stat = now()::text||%s});",$stat"})->execute;
0609nobodyさん2007/08/01(水) 11:03:14ID:cHuXo2mz
Aサーバ
/home/mydirectory/

Bサーバ
/var/saitama.txt


Bサーバの/var/saitama.txtを
Aサーバの/home/mydirectory/以下にコピーした後に
/var/saitama.txtを削除する
と言う動作を1つのスクリプトを作りたいと思います。
サーバ間のファイルの転送はSFTPです。
どのようにしたらよいでしょか?

perlのバージョンは5.8 RedHatです。
0610nobodyさん2007/08/01(水) 11:07:27ID:???
>>609
>>1
> 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
>
> 最低でも1と3が無いと誰も答えられないよ。
1はわかったので、2と3を書いてくれ
0611nobodyさん2007/08/01(水) 11:17:25ID:???
Net::SFTP でも使ってあとは素直に書けばOK
0612nobodyさん2007/08/01(水) 17:34:49ID:???
sftpって第3者サーバ間転送もサポートしてたの?
ftpだけかと思ってた。
0613nobodyさん2007/08/01(水) 21:53:07ID:EB3VEkPE
すいません、ホントにド素人で始めてDBへ接続しようとしています。
一応PostgresqlとDBIモジュールをインストールし、localhostでテストを行ってます。
sampleというDBを作成してperlから以下のように接続しようとしていますが、
うまく行きません。

use DBI;
$dbh = DBI->connect("dbi:Pg:dbname=sample");

エラーログをみると、
install_driver(Pg) failed: Can't locate DBD/Pg.pm in @INC (@INC contains: C:/usr/local/lib C:/usr/local/site/lib .) at (eval 7) line 3.
Perhaps the DBD::Pg perl module hasn't been fully installed,
or perhaps the capitalisation of 'Pg' isn't right.
Available drivers: DBM, ExampleP, File, Gofer, Proxy, Sponge, mysql.
at C:/Apache2/htdocs/testdb.cgi line 24

となっています。
これって、DBIモジュールのインストールがうまく行っていないのでしょうか?
ちなみにDBIモジュールはhttp://www.jisaba.net/xp/mt3/05.htmから行いました。

なんか質問自体も正しいのか分からない状態ですが、よろしくお願いします。
0614nobodyさん2007/08/01(水) 22:34:28ID:???
>>613
エラーメッセージよく読め。

Perhaps the DBD::Pg perl module hasn't been fully installed,

と親切に指摘してくれてるじゃないか。
0615nobodyさん2007/08/02(木) 00:15:05ID:???
分からんことをすぐ人に聞く奴は伸びない
0616nobodyさん2007/08/02(木) 01:27:36ID:???
ぼくは困るとすぐ人に聞いていますが、チンコの皮は、伸びやすいです。
0617nobodyさん2007/08/02(木) 04:14:18ID:???
この包茎野朗が
0618nobodyさん2007/08/02(木) 07:34:23ID:???

夏夏夏夏
0619nobodyさん2007/08/02(木) 10:13:28ID:???
ココナツ
0620nobodyさん2007/08/02(木) 13:13:49ID:???

愛愛愛愛
0621nobodyさん2007/08/02(木) 13:14:46ID:???
アイランド
0622nobodyさん2007/08/02(木) 13:24:37ID:???
なんそかそれ(笑)
0623nobodyさん2007/08/02(木) 13:29:13ID:???
ジェネレーションギャップを感じたw
0624nobodyさん2007/08/03(金) 01:21:20ID:HqqiKgbo
フリーのCGIを改造しているのですが下記のものを付け足すと500エラーがでてしまいます。
print "<br><br><br><br>\n";
print "<form>\n";
print "<input type=\"button\" value=\"戻る\" onClick=\"javascript:history.back()\">\n";
print "</form>\n;

どこが間違っているのかご指摘お願いできないでしょうか?
よろしくお願いします。
0625nobodyさん2007/08/03(金) 01:30:15ID:???
print "<input type=\"button\" value=\"戻る\" onClick=\"javascript:history.back()\">\n";

"" で囲まれた中で " を使う場合は \" のようにエスケープしてね♪
0626nobodyさん2007/08/03(金) 01:34:14ID:???
>>624
バックスラッシュが全角なのはわざと置き換えていて本物はちゃんとしてる
んだろうけど、どうみても最後の行の「"」が閉じていない
06276242007/08/03(金) 01:34:55ID:HqqiKgbo
>>625
ありがとうございます。
上記はエスケープしきれてないのでしょうか?
06286242007/08/03(金) 01:37:08ID:HqqiKgbo
>>626
おはずかしい…
できました。ありがとうございました。
0629nobodyさん2007/08/03(金) 01:37:12ID:???
この際
print '<br><br><br><br>'."\n";
みたくするか、ヒアドキュメントを使ってみては?
0630nobodyさん2007/08/03(金) 01:37:25ID:???
>>625
その人はたぶん \ を勝手に\に変換してしまうあのブラウザを使ってるんでしょう。

>>624
> print "</form>\n;
ここ。何かが足りない。

「500エラーが出ます」じゃなくて、せめて use CGI::Carp qw(fatalsToBrowser); してほしい。
もっと言えばコマンドラインでチェックして syntax OK. が出てから CGI として動かしてほしい。
06316302007/08/03(金) 01:38:06ID:???
リロード…orz
06326292007/08/03(金) 01:45:51ID:???
>>630
氏ねって書かれるんだろうけど、ローカルでテストできる環境を整えたり、
telnetでperl -cできる環境を持てる初心者って、あまりいなそうな気がするけどね。
この人だって、エスケープしたり、"を閉じ忘れるくらいの初心者なわけだし。

俺は未だにローカルでテストできる環境を持ってなかったりするし、排他処理にflockを使ってたりするから、
windowsで書いてて、なかなか満足するテスト環境にも恵まれてない。

今はようやくtelnetが使える外部鯖が手に入ったから、コマンドラインでチェックできるけど、
何がいいたいかというと、文法をチェックできる環境を整えるのって、cgiをいじったりするより、
案外難しいんだってこと。
0633nobodyさん2007/08/03(金) 01:57:50ID:???
>>632
えと、いちおうその辺も想定しまくったうえで

せめて use CGI::Carp qw(fatalsToBrowser); でも入れてね
「500エラーです」では何もわからないけど、まともなエラーメッセージ出るようになるよ

という気持ちで書いたわけですよ。
「氏ね」と思う人も当然いるだろうし、「環境構築とかわかんねーよ」な人もいるんだろうけど
それについてあーだこーだ言うつもりはないんです。少なくとも「氏ね」とは思ってません。
06346292007/08/03(金) 02:06:36ID:???
>>633
いや、別に俺もそんなに反論的な意見でもなかったです^^

use CGI::Carp qw(fatalsToBrowser);
は俺も使ってますが、結構ダメなこともあるんで、正直微妙ですw
0635nobodyさん2007/08/03(金) 02:11:08ID:???
>>639
勉強の為に
> use CGI::Carp qw(fatalsToBrowser);
のダメなところを教えていただけませんか?
0636nobodyさん2007/08/03(金) 02:15:29ID:???
>>635
俺も初心者だから、よくわかんないけど、
> use CGI::Carp qw(fatalsToBrowser);
って書いてても、500が出るときは出るってこと。

perl -wcより、出てくるメッセージは親切だと思う。使って損はない。
0637nobodyさん2007/08/03(金) 07:59:24ID:???

>>636

それマジで言ったん? ソースあんならすぐ出せ。

マジなら2ちゃんねら総力を挙げて潰すが。
0638nobodyさん2007/08/03(金) 08:20:11ID:???
> 2ちゃんねら総力
できもしないこといわないでくださいw
0639nobodyさん2007/08/03(金) 08:49:48ID:???
これ同一人物?
流行ってんの?
http://pc11.2ch.net/test/read.cgi/tech/1150900544/78n
http://pc11.2ch.net/test/read.cgi/tech/1181500187/757n
0640nobodyさん2007/08/03(金) 08:57:50ID:???
たった2つ3つで「流行ってんの?」はないだろ〜
0641nobodyさん2007/08/03(金) 09:47:07ID:???
>>637
俺のバックには○○がついてるんだぜ!みたいな…

ねらー気取ってんじゃねぇよカス厨
自分で何もできないくせに虚勢張ってんじゃねぇよばーか^^
0642nobodyさん2007/08/03(金) 09:54:48ID:???
二行目に
> use CGI::Carp qw(fatalsToBrowser);
を入れて500が出るなんて、シェバング間違えてるぐらいじゃないか。
0643nobodyさん2007/08/03(金) 10:26:00ID:???
流行らせるんだよ!!
2ちゃんねら総力を挙げて。
0644nobodyさん2007/08/03(金) 11:22:32ID:???
2ちゃんねら総力を挙げてオナニー
0645nobodyさん2007/08/03(金) 14:56:52ID:???
>>637 はたまに見かけるコピペだよ。
ニュー速とかにもある。
0646nobodyさん2007/08/03(金) 15:05:53ID:???
ただのVIP用語らしい。
0647nobodyさん2007/08/03(金) 16:08:03ID:???
このコピペはニュー速で流行り出したらしい
0648nobodyさん2007/08/03(金) 17:19:15ID:???
『VIP用語』って
どんなけ長い用語だよ
0649nobodyさん2007/08/03(金) 22:35:25ID:oY004xfP
CGIからplの関数を呼び出して、
さらにplがあるところからDBにアクセスする
ということをしたいのですが、うまくいきません。

手法としては、plから相対でDBにアクセスするか、
plの絶対アドレスからアクセスしたいと思っているのですが、
どのようにすれば可能でしょうか?
0650nobodyさん2007/08/03(金) 22:53:25ID:???
日本語でやれ
0651nobodyさん2007/08/03(金) 22:56:09ID:???
>649
おまえは文章もまともに書けないのか?
0652nobodyさん2007/08/03(金) 23:21:30ID:oY004xfP
>>650,651
ライブラリ自身の絶対パスを取得する方法はありませんか?
0653nobodyさん2007/08/04(土) 00:01:01ID:???
DBって何。バークレーなんとか?SQLiteとか?DBI?
0654nobodyさん2007/08/04(土) 00:21:38ID:???

use File::Spec;
use Cwd;

print File::Spec->catfile(getcwd, __FILE__);
0655nobodyさん2007/08/04(土) 00:33:18ID:TU5rHtE+
>>654
ありがとうございます。問題解決しました
0656nobodyさん2007/08/04(土) 16:32:08ID:???
はじめまして。

bbbb
aaaa ←ここをggggにしたい
dddd
eeee
cccc
aaaa
ffff
って感じで改行(\n)で区切られたデータファイルがあって、
そこに新データggggを書き込みたいのですが、
その際にaaaaが存在すれば一番最初にあらわれるaaaaのところに
ggggを上書きしたいんですが、どうすればよいでしょうか。

・aaaaが存在しなければ通常通りにデータ末尾にggggを
・二番目以降のaaaaはそのまま置き換えない
を実現したいのです。

下だと失敗してしまいます。
よい方法をお願いできませんでしょうか。
open(f,"+<hoge.dat");
flock(f,2);
$data = <f>;
if($data =~ m/aaaa/){$data =~ s/aaaa/gggg/;}
else{$data .= "gggg\n";}
seek(f,0,0);
truncate(f,0);
print f $data;
flock(f,8);
close(f);
exit;
0657nobodyさん2007/08/04(土) 17:05:20ID:???
$hoge_of{$data}++して、
$hoge_of{aaaa} == 1のとき $data = 'gggg'
$hoge_of{aaaa} != 1のとき $data .='gggg'
0658nobodyさん2007/08/04(土) 17:13:18ID:???
$data =~ s/aaaa/ggggg/is;
で終わり
0659nobodyさん2007/08/04(土) 17:16:52ID:+PxwZdc+
open(FILE, "+< hoge.dat");
flock(FILE, 2);
my @dat = <FILE>;
my $hit;
foreach(@dat){
if(/^aaaa$/){
$_ = 'gggg';
$hit = 1;
last;
}
}
push @dat, "gggg\n" if !$hit;
seek(FILE, 0, 0);
print FILE @dat;
truncate(FILE, tell(FILE));
close(FILE);
0660nobodyさん2007/08/04(土) 17:30:25ID:RQKCxjR+
perlをインストールする時、Freeはどれを選択すればいいんですか?
(Windows使用)


ttp://www.activestate.com/downloads/
0661nobodyさん2007/08/04(土) 17:36:26ID:+PxwZdc+
ActivePerl 5.8.8.822 and ActivePerl 5.6.1.638
http://www.activestate.com/store/download.aspx?prdGUID=81fbce82-6bd5-49bc-a915-08d58c2648ca
0662nobodyさん2007/08/04(土) 17:43:21ID:RQKCxjR+
>>661 もう一つ教えてください。下記の2種類あるんでが
どれを選択すればいいんですか?

Windows (x86)
AS package
MSI

Windows 64-bit (x64 AMD64)
AS package
MSI
0663nobodyさん2007/08/04(土) 18:25:57ID:???
>>662
http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.822-MSWin32-x86-280952.msi
0664nobodyさん2007/08/04(土) 18:30:12ID:???
msi のがいい
64bit は OS が 64bit である場合のみ
既に開発してて過去の古いソースが有りソレを何が何でも生かしたいのであれば 5.6 系がいいかもしれないけど
そうでなければ Perl は Ver 5.8 系をオススメ
06656562007/08/04(土) 19:43:16ID:???
>>657->>659

有難うございます。
さっそく試してみます。
0666nobodyさん2007/08/04(土) 19:53:57ID:???
build818以降PPM4になってアレだから5.8.8build817が個人的にはよい。
build815もいいけど、816はバイナリ互換がないから死ぬ。
0667nobodyさん2007/08/04(土) 20:01:14ID:???
>>666
アレって何だよ! 具体的に言えよ!
0668nobodyさん2007/08/05(日) 04:19:15ID:???
>>667
GUIバージョンになったのがイヤとかいう話じゃね?
それでも ppm3 で以前のを使えると思うが。
0669nobodyさん2007/08/05(日) 05:40:21ID:ZbLLWuy9
perlをこれから学びたいと思っているのですが
jcode.plって必ずつかわなければいけないのでしょうか?

文字コードはeucで作る予定です。
0670nobodyさん2007/08/05(日) 06:34:40ID:???
>>669
やめた方がいいと言われそうだけど、俺は好きだw
0671nobodyさん2007/08/05(日) 09:31:45ID:???
jcode.plはできる限り使わないほうがいい。
0672nobodyさん2007/08/05(日) 10:59:54ID:???
今からやるならせめてJcode.pm、できればEncode.pmがよさげ。
# 新しいJcodeはEncodeのラッパーだったっけ?
0673nobodyさん2007/08/05(日) 11:07:42ID:???
>672
です
Encode.pm が全部やってるはず
0674nobodyさん2007/08/05(日) 20:17:05ID:???
>>669
use Encode;

文字コードはUTF-8でやった方がいいよ。
0675nobodyさん2007/08/06(月) 17:56:09ID:???
在庫管理の機能をつけたいのですが
入荷毎の履歴から古いものから順番に在庫を減らす工程がわかりません。

$num='30';
---log
1<>29<>
2<>4<>
3<>16<>

---
というログをwhileで読み込んで行き、
$readline_num-$num がマイナスになるようなら
差分数値を次のreadline_numに…
という流れだと思うのですが
どうにもこうにも形にできません。

結果的には最初のlogが
---log
1<>0<>
2<>3<>
3<>16<>

---
という風になり、最終的に全部が0になるようならエラーを返したいのです。

アドバイスよろしくお願いいたしますm(_ _)m
0676nobodyさん2007/08/06(月) 18:03:22ID:???
エスパー頼む
0677nobodyさん2007/08/06(月) 18:06:59ID:???
というか素朴な疑問。
テキスト系DB作ってる人って、区切り文字は何にしてる?
俺はタブなんだけど、<>って良く見るけど、どういう意味があるんだろう。
データに<>を含まないからっていうのは、もちろんだけど。
0678nobodyさん2007/08/06(月) 18:18:04ID:???
>>677
KENT流れ
0679nobodyさん2007/08/06(月) 18:32:44ID:???
漏れ的にはデータ内にHTMLタグが含まれてたときには
全部排除する前提だから<>という入力は
100%ありえないという前提で<>にしている、と思う
0680nobodyさん2007/08/06(月) 18:37:53ID:???
でも、セコイこと言うと、<>の方が1バイト多くね?
フィールドが数十個あって、レコードが1000以上とかあると、バカに出来ないような気がする。


まあ、大量のデータ扱うなら、DB使えっていうことでFAなんだろうけどw
0681nobodyさん2007/08/06(月) 18:43:51ID:???
俺の場合は毎度車輪の再発明してもしょうがないので、csvにするかStorableにするか
DB使うかといったあたりで場合に応じて使い分けだな。独自形式でテキストに保存って
いうのは基本的にやらない。
0682nobodyさん2007/08/06(月) 18:56:30ID:???
>>681
でも、csvって"の扱いがいやらしくない?そういう車輪は発明されてるんだろうけどw
0683nobodyさん2007/08/06(月) 18:59:48ID:???
>>675
whileでループ作って1行ずつマイナス処理してマイナスなら数値を0に置き換えて次の行、
プラスならその数値に置き換えてループ脱出して終了
ファイル(または配列)の終端に達したら、エラー送出してループ終了
でいいんじゃないの?

とりあえずなんかコード書いてみれば?
0684nobodyさん2007/08/06(月) 19:06:10ID:???
>>675
俺的には、何でもforeachとsplit
perl書くようになって、この2つは一番汎用してるかも。
0685nobodyさん2007/08/07(火) 02:30:26ID:???
今はData::Dumperは流行らないか。
06866692007/08/07(火) 02:43:38ID:???
遅くなりました。
たくさん回答頂いてしまい恐縮です。
Encode.pmを使ってみることにします。
ありがとうございました。
0687nobodyさん2007/08/07(火) 09:10:50ID:???
最近はaudreyのYAML::Syckをよく使う
0688nobodyさん2007/08/07(火) 10:41:18ID:???
Encode.pmって半角カナに完全対応してたっけ?
日本語入力がある場合は結局jcode.plが最適だったのでは。
0689nobodyさん2007/08/07(火) 10:50:16ID:???
あの手軽さを考えたら未だにjcode.plから抜け出せない。
0690nobodyさん2007/08/08(水) 08:23:14ID:???
>>688-689
何をもって「完全」かは知らんけど、Encode::JP::H2Z のような実装は
用意されている。jcode.pl は UTF-8 扱えない時点で選択肢外なので、
1. Encode + 自前の補助コード
2. Jcode Ver 0.88
3. Unicode::Japanese
の優先順位で使ってるかな。
0691nobodyさん2007/08/08(水) 10:53:06ID:???
半角カナより機種依存とか拡張外字とかの扱いに困ってるんですが
みなさんどうしてますか?
0692nobodyさん2007/08/08(水) 21:52:51ID:???
もう大分定着してきたと思うが、shiftjis使ってるやつは
cp932にしたら大分マシになると思う。
0693nobodyさん2007/08/08(水) 23:28:38ID:???
教科書立ち読みしてたら
シフトJIS使うときは、
2バイト文字の後半部分がC5のもの、
たとえば表とかつかうときは
表¥
ってしないと文字化けするから!
とかって書いてあって、はぁ?とおもった
これってperlでなくてもwebアプリつくるひとは
全員必須の知識なの?
0694nobodyさん2007/08/08(水) 23:34:32ID:???
知ってて損は無いけど、古すぎな知識。
0695nobodyさん2007/08/09(木) 00:51:15ID:???
正確に言えば、Webアプリ限定ですらないよな。
0696nobodyさん2007/08/09(木) 00:55:40ID:???
unicode万歳やで〜
0697nobodyさん2007/08/09(木) 01:01:57ID:???
utf-8がいちばん扱いやすい。
0698nobodyさん2007/08/09(木) 01:22:31ID:???
Unicodeキライ
■ このスレッドは過去ログ倉庫に格納されています