Perlコーディング初心者質問スレ Part 38
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/10/07 23:23:08ID:kiEzDCJF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0587nobodyさん
04/11/06 20:56:12ID:ZyicEXrdを実行すると、「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:???iso-2022-jp|shift-jis|euc-jp|multipart\/mixed
という記述をします。これを応用して、『英語か日本語にマッチ』するかどうかを記述するには
どうすればよいでしょうか?
0590587
04/11/06 22:56:11ID:???よろしくお願いします。
use encoding "shift_jis";
use Encode;
chdir 'c:\\test';
$str = encode("shiftjis","あ.tif");
rename "p.tif", $str;
0591nobodyさん
04/11/06 23:23:01ID:???no encoding;
で一旦切ってしまって、処理後にもう一度
use encoding "shift_jis";
しておく…のはあまりスマートじゃないですね。。
>>589
「キャラクタセットが英語または日本語である場合マッチ」ということなら、
http://www.iana.org/assignments/character-sets
↑と睨めっこして、必要なのを足していくとか。
(キャラクタセットの指定が無かったり、Unicodeを使われたら、終わりな気もするけど。)
0592nobodyさん
04/11/07 19:03:48ID:???する方法をど忘れしてしまったので教えてください。
「#」じゃなく。
0593592
04/11/07 19:14:26ID:???=comment # ここからコメント
=cut # ここまでコメント
0594nobodyさん
04/11/07 19:14:34ID:???0595nobodyさん
04/11/07 20:51:25ID:OKDqn1bD@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);でないとだめなようです。
0599597
04/11/07 21:00:05ID:V/bBugXzランダムに生成された全角半角混合の文字列
$xx=げあじgraふぇeあefaじえeaあい;
から9番目のeを取り出す方法を教えて
0601nobodyさん
04/11/07 22:01:19ID:???0602nobodyさん
04/11/07 22:03:13ID:???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:???そこまでやったら、直接取り出せばいいんじゃない?
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];
なんにせよ環境も要件もよくわからんと返しようがないのぉ。
0605597
04/11/08 02:03:34ID:???トリップ生成用途だったのですが、これでうまくいきそうです。
みなさんどうもありがとうございます。
0607595
04/11/08 11:09:36ID:IV2+5aK4で代入したら、$data[0]にしか代入されていません。
どなたかよろしくお願いします。
0608nobodyさん
04/11/08 12:07:11ID:???その場合の <DAT> は一行しか読み込まないので、当然そうなるだろう。
というか何がしたいのだいったい。
ひょっとして君のやりたいことは @data = <DAT> だったりしないか。
0609nobodyさん
04/11/08 13:34:38ID:???0610595
04/11/08 15:22:15ID:hLOeveWjあっ、すみません。<DAT>はファイルハンドルです。
>>608
なぜこの場合だと一行しか読み込まないのですか?
では、どうすればすべての行を読み込んでくれますか?
説明不足ですみません。返答お願いします。
0612595
04/11/08 16:59:14ID:x02iMqC5すみません。やっていることがおかしかったですね。
ありがとうございました。
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:???とすると改行\nが消えないですが、それを消して配列に代入する方法はありませんか。
0616nobodyさん
04/11/08 21:45:10ID:???0617nobodyさん
04/11/08 21:57:37ID:???{ local $/ = undef; @var = split(/\n/, <IN>); }
あたりかな。ただしファイルの末尾の空行が消えるのが嫌なら、
splitの第3引数に負の値を与えるとともに、splitしたあとで
@varの最後の要素を捨てる必要があるだろう。
普通に読んだ後でchomp @varした方が書くのは楽だね。
0618nobodyさん
04/11/08 22:31:46ID:???0619nobodyさん
04/11/09 00:16:14ID:???これを回避するにはいちいちヒアドキュメントを閉じるしかないですか?
0620nobodyさん
04/11/09 00:47:01ID:???0623nobodyさん
04/11/09 06:54:36ID:???このスレで質問するとよく言われます。。
>617>618
ありがとうございます。
0624nobodyさん
04/11/09 07:22:29ID:???言われないように努力したりしないの?
釣りだと思われるような質問しちゃってるんだよ?
0625nobodyさん
04/11/09 07:43:45ID:???例えばWindowsで下を実行すると
print $^O
> MSWin32
とか出ますが,WinXPとかWin98とかくらいまで詳しく知るには,どういう方法がありますか。
(できればUnix系でも詳しく知りたいです)
0626nobodyさん
04/11/09 09:36:25ID:enWymUQXされていないかとかしたいのですが、どうやってやったらいいのでしょう?
$url = "http://www.example.com/file.jpg";
@data = stat $url;
とかやっても取れないので(うすうすわかっていましたが)。。。
ウェブ上のデータとstatの内容を取得する方法を教えてください。
0627nobodyさん
04/11/09 09:59:56ID:???lwpでもなんでもいいけど
httpのヘッダで
Date か Last-Modified みるしかなかんべ。
取れなかったら諦めるしかない。
0628nobodyさん
04/11/09 10:07:38ID:enWymUQXありがとう。
そういうものなんですか。
0629nobodyさん
04/11/09 18:49:56ID:???$hoge =`uname -m`; とか。
詳しいことはUNIXのコマンドリファレンスでも探せば良し。
>>626
他のサーバーのデータは、
socketでソケット作って、connectで繋いで初めて得られる。
色々複雑だから、素直に解説本読みなはれ。
0630nobodyさん
04/11/09 19:46:44ID:???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:???ありがとうございます。こんな風にしていろいろな環境で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アクセスしてみたら、真っ白のページが表示されます。
んで、ホームページのソース表示してみたら、
確かにそこにはhtmlソースがちゃんとあるんだけど、
表示されていない。
原因はどんなことが考えられますでしょうか?
0634nobodyさん
04/11/09 23:31:31ID:???つうか原因探ってほしいならソースをどっかにあげましょう
0635632
04/11/09 23:34:40ID:mn5HDpbSContent-Type: text/html; charset=EUC-JP
<html lang="ja"><head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP">
<title>test</title>
このコードに問題ありますか?
0636632
04/11/09 23:36:40ID:???他ブラウザで試したら表示されました。
企業から配布されてるスクリプトなのにテキトーだなぁ
サンクスでした。
0637nobodyさん
04/11/10 00:18:59ID:sQyPPo3Ncronでcgiを動かすにはどのように設定ファイルを書けば宜しいのでしょうか。
/public_html/a.cgi
にありますcgiを例えば1時間毎にa.cgi?a=1&b=2とパラメータを渡してcronで
実行したいのですが。
よろしくお願い致します。
0638nobodyさん
04/11/10 00:22:22ID:???0639nobodyさん
04/11/10 00:37:27ID:sQyPPo3N大変申し訳ありません。
該当スレを御存知でしたらお願いしたいのですが。
0641nobodyさん
04/11/10 05:09:30ID:???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とかして、ディスクの使用状況をテキストに書き出したいんだけど、
これじゃあ戻り値を取得できないですよね。
どうやったら取得できますか?
0644nobodyさん
04/11/10 11:55:42ID:I1NueUmN自己解決しますた。m(_ _)m
0645nobodyさん
04/11/10 16:07:28ID:???どのようにしたらいいのでしょうか?
ファイル作成後に「ダウンロード」とボタンを表示してクリックしたら
ファイルをダウンロードするみたいな感じです。
0646nobodyさん
04/11/10 17:04:37ID:I1NueUmNprint "<a href=\"file\">DL</a>\n";
0647nobodyさん
04/11/10 18:18:53ID:???結構な頻度で値が取得できません。
ですが、少し時間をおいて取得すると値が取得できるので、
cookie作成のスピードよりもリダイレクト後のページで値を取得してるっぽいです。
従いまして、cookie作成時に少し時間を開けてからリダイレクトしたいのですが、
sleepを入れても意味がありませんでした。
この様な場合の対処方法をご存知の方がいらっしゃいましたら、どうかご教授ください。
よろしくお願いいたします。
0648nobodyさん
04/11/10 20:55:28ID:sQyPPo3Naaa,bbb,ccc,ddd
111,222,33,4444
このようなファイルがありaaa,bbb,ccc,dddを読み込んだ後にaaa,bbb,ccc,dddを削除して
ファイルを上書きするような処理です。
よろしくお願いします。
0649nobodyさん
04/11/10 21:03:44ID:???「ダウンロード」とボタンをクリックしたらファイルを作成して
print "Location: http://www.example.com/file.zip\n\n"
0650nobodyさん
04/11/10 21:52:59ID:QZhMSK0Dダウンロードボタンをクリックして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削除したい行以外を別の一時ファイルに書き込んで、元のファイル名にリネームする
で良いんじゃない?
他にいい方法があれば知りたい
0652nobodyさん
04/11/10 21:57:30ID:???0653nobodyさん
04/11/10 22:21:12ID:???クッキーを食べない時と食べる時がある状況が良く分からないけど…。
<meta http-equiv="refresh" ..>
を使ってクライアント側で飛ばして見るとか。
# 状況は改善されない予感。
0654nobodyさん
04/11/10 22:24:11ID:QZhMSK0D0655nobodyさん
04/11/10 22:30:47ID:???あぼーんすると変な状態で残ったりする。別ファイルに書き込み、
書き終わったらrenameなら書き換え前か書き換え後のどっちかには
なるので、オレはこのほうが好き。
0657nobodyさん
04/11/11 00:08:27ID:???IEでcookieが急に読めなくなった。(前はできてました。)
プログラムAでcookie送信してプログラムBに遷移して
そのcookieを取ろうとしても取れなかった。
他のcookieは取得することができました。
ネスケでは大丈夫だったんだけどなぁ。
ちなみにCGI.pm使って
$hoge=param('hoge');
とやって$hogeが空になっており、
cookieのフォルダを見るとちゃんとそのcookieがありました。
0659nobodyさん
04/11/11 00:52:30ID:???0660657
04/11/11 01:49:17ID:???paramのとこcookieです。
>>659
クッキーの設定も疑って全て許可にしてもだめだったのです。
でも、今家のPCで同じスクリプト走らせたらできました・・・。
で、サーバの方も試したらできました。
仕事場のPCからやった時はできなかったんですよほほほ。
ご迷惑おかけしました。
0661nobodyさん
04/11/11 11:33:09ID:???エラー出したいんですが、
どうすればいいんでしたでしょうか?
~[0-9]を使えばいいことはわかるんですが・・・
if($a=^[0-9]){
echo"error";}
何か間違ってますか?(^^;
0662nobodyさん
04/11/11 11:35:42ID:???0665nobodyさん
04/11/11 13:59:06ID:???0666nobodyさん
04/11/11 14:33:41ID:tk5UM/xB記載されている内容を処理しファイルに書きたいのですが
可能でしょうか?
基本的なことですみません。
何の言語を覚えたらいいのかわかりませんので。
0667nobodyさん
04/11/11 14:54:37ID:???0668nobodyさん
04/11/11 15:18:47ID:tk5UM/xB以下のようなことをWindows XP上でしたいのです。
できますか。
実行したら、例えばこの板のスレッド一覧
http://pc5.2ch.net/php/subback.html
を読んで
インデックス/スレタイ/その時点での書き込み数
をCSVファイルに書き込むようなものです。
中でリンクから各スレを読んで>>1のハンドルも取得できればなおよいです。
0670nobodyさん
04/11/11 15:21:57ID:???0671nobodyさん
04/11/11 15:28:02ID:riaohoToperlプログラムをローカルPCで実行
ネット上のウェブページの情報を取得
いろんな処理
ローカルPCに保存
ってこときゃ?
0672671
04/11/11 15:29:21ID:riaohoToすまそ
0673nobodyさん
04/11/11 15:32:15ID:R3WWGPIlチェックして必要があれば弾いたり空いている場所に追加したり削除する
CGIを作りたいのですが・・・・。
ユーザー名の入ったファイルを行入力演算子で配列に読み込んで、
それをいろいろやってから再び配列に戻して、最後に
$i=0;
while($i<=$count){
print FILE "$username[$i]\n";
$i++;
}
みたいに、改行して出力すれば次にCGIを呼び出したときに再び
行入力演算子で配列に読みこめるファイルが作成できるのでしょうか?
何度もやったのですが、どうしてもうまくファイルが作成できないのです。
0674nobodyさん
04/11/11 15:33:41ID:???そんな感じぢゃな。
perlプログラムをローカルPCで実行 → ActivePerl をゲットせよ
ネット上のページの情報を取得 → LWPの使い方を習得せよ
解読処理 → HTMLをパースする方法、正規表現とか HTML::Parser とかを習得せよ
CSVファイルに書き込む → まあ何とでもなるぢゃろう
>>672
その FILE とかいうファイルハンドラは
当然書き込みモードで open されとるんぢゃろうな?
0676673
04/11/11 15:35:58ID:R3WWGPIlいえ、入力モードで開いて配列に読み込んで、
一旦閉じてから再び出力モードで開いてます
0677nobodyさん
04/11/11 15:46:34ID:tk5UM/xBありがとうございます。
>>675
覚えてからできないのがわかったら悲惨ですから
先に確認したいと思いました。
じゃ勉強始めます。
0678nobodyさん
04/11/11 16:00:47ID:???スレの中身見るのは、自分で作りな。
use LWP::Simple;
$url = "http://pc5.2ch.net/php/subback.html";
@lines = split(/[\r\n]/, get($url));
foreach my $buf (@lines) {
if ($buf =~ /<base href="([^\"]+)"/){
$base_ref = $1;
last;
}
}
foreach $buf (@lines) {
if ($buf =~ /<a href="(\d+)\/l50">(\d+):(.*)\((\d+)\)/){
$thethread = $1;
$num = $2;
$title = $3;
$rescount = $4;
print "$thethread, $num, $title, $rescount\n";
}
}
0679nobodyさん
04/11/11 16:42:01ID:???このスクリプトの問題点を調べたいのですが、どのようにすればよい
かアドバイスを頂けたらと思います。
利用しているスクリプトは、余裕派掲示板です。
http://specters.net/cgipon/
バージョンは、2.62と、3.00 beta7を利用しておりどっちが
CPUを食っているかはまだわかりません。
そこまでCPUを使ってるのにkillしないサーバ屋もサーバ屋ですが、
とりあえず、他人の迷惑になるので調査したいのですが、とっかかり
がわかりません。
発生頻度は、1-2日に1回位起きてるのかもという位で、まだ
詳しくはわかりません。
よろしくお願いします。
0680nobodyさん
04/11/11 16:49:47ID:???0683nobodyさん
04/11/11 20:23:40ID:???>レンタルサーバにてたまにcgiがCPU 90%を長時間(600hとか)使うことがあります。
600時間てあんた、一体何動かしてるんだ?
ほぼ一ヶ月だぞ?
■ このスレッドは過去ログ倉庫に格納されています