Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0166nobodyさん
2005/06/01(水) 12:26:27ID:???ぐぐり方が悪すぎるんじゃ...
Exporterとperlをキーワードにして日本語のページを検索すると
普通に出てきますが...
0167nobodyさん
2005/06/01(水) 21:46:59ID:???Exporterはモジュールのシンボル(通常はサブルーチン)を呼び出し元に輸出するためのモジュール。
DynaLoaderはCなどで書かれた外部サブルーチン(XS)をロードするモジュール。
詳しいことはぐぐるなりマニュアル読むなりせよ。
オブジェクト指向でPurePerlなモジュールを書く分にはどちらも無関係。
0168nobodyさん
2005/06/01(水) 23:13:36ID:4wa3Dv1bファイルを添付することは出来ませんか?
0169nobodyさん
2005/06/01(水) 23:38:04ID:???できる。でもsendmailそのまま使ってあとは自分で作るのはお勧めしない。
search.cpan.orgでmailとかMIMEとかキーワードに検索するといろいろでて
くるのでなるべく利用するのが吉かと。
0170nobodyさん
2005/06/02(木) 07:19:19ID:???その言い方から予想するとプラグマ以外の他のモジュール使わないで単独で動くモジュールってことかな。
0171nobodyさん
2005/06/02(木) 07:21:43ID:???0172nobodyさん
2005/06/02(木) 12:06:12ID:???PurePerlってのは他の言語で書いたライブラリに依存せず、Perlのみで書かれたコードのこと。
どんなモジュールを使っているかは関係ない。
標準ライブラリだと、CGI.pmはPurePerlで、POSIX.pmはPurePerlじゃない。
といってもそんな厳密なものではなく、例えばData::Dumperなんかはコンパイル済みライブラリがあれば
その(速い)ルーチン、無ければPurePerlルーチンを自動的に選択して使用する。
非PurePerlモジュールに依存したPurePerlモジュールをPurePerlというか否かも意見の分かれ目だな。
>>171
まあXSインターフェイスを使わなくてもDynaLoaderを使うことはあるわな。
ここでは単に「外部サブルーチン」という意味でXSとした。
0174nobodyさん
2005/06/02(木) 18:02:31ID:???foreach (1 .. 10) { $i++; } continue { $j++; }
print " ($i , $j) \n";
こういうコードを実行すると、結果が (10 , 10) ってなるんだけど、これはいいの?w
(10 , 9) ってなってほしかったんだけど・・・ orz
0175nobodyさん
2005/06/02(木) 19:32:12ID:???どこからどう考えても (10,10) なのだが・・・。
foreach節の最後に last until $i < 10; とでも付け加えれば
最後の continue は実行されないが。
0176nobodyさん
2005/06/02(木) 19:41:55ID:???ラクダ3版の「4.4.3 foreachループ」の最後のあたりに
はっきりこのように書いてある。
while文と同様に、foreach文もcontinueブロックを持つことが
できる。continueブロックは、ループが普通に実行された場合
でも、nextが実行された場合でも、ループの各繰り返しの最後
に必ず実行される。
0177nobodyさん
2005/06/02(木) 20:09:01ID:QYKowdcjprint $saitama;
}
すいません↑これって何をしてるんですか?
-eで$saitamaが存在しているのかどうかを調べているんでしょうか
0178nobodyさん
2005/06/02(木) 20:12:30ID:???正解。
0179nobodyさん
2005/06/02(木) 20:15:16ID:QYKowdcj0180nobodyさん
2005/06/02(木) 20:40:27ID:???$text =~ s/\A([^\n]*)\n//s;
$d{title} = $1;
こんなのが出てきたんですけど、$1は、「上の正規表現『s/\A([^\n]*)\n//s』で一番最初にマッチングしたもの」であってますか?
0182nobodyさん
2005/06/02(木) 21:38:25ID:U6HelXRG名前 住所 電話
A氏 東京 1111111111
B氏 大阪 2222222222
C氏 愛知 3333333333
D氏 広島 4444444444
上記のようなデータファイルがあって、B氏だけの内容を変更したい時、
ファイルを出力用 ">" で開いて再度1レコードずつ書き込めばできる
のですが、出力用で開くと一旦データが全て消えて危険性が高いので、
入出力両用 "+<" 等で開き、他のレコードは保持したまま、B氏のレ
コードだけを書き換えるようなことは出来るのでしょうか?
0183nobodyさん
2005/06/02(木) 21:45:15ID:???0184nobodyさん
2005/06/02(木) 21:55:58ID:???0185nobodyさん
2005/06/02(木) 22:00:22ID:U6HelXRG他にも項目があって固定長には出来ないのですが、固定長にすると
対象レコードのみ書き換えられるのでしょうか?
>>184
成功したかどうかはどう判断すれば良いでしょうか?
0187nobodyさん
2005/06/02(木) 22:22:01ID:???他にも方法はいくらもあるけど、上のもそうだがいちいち聞くな、自分で考えろと。
0188nobodyさん
2005/06/03(金) 06:02:35ID:???http://www.hoge.com/aaa/bbb/ccc.html へのアクセスが
http://www.hoge.com/index.cgi?aaa/bbb/ccc.html となるように書き換えをさせています。
RewriteRuleは→ ^(.*)$ index.cgi?$1 [L,QSA] こんな感じで。
で、http://www.hoge.com/aaa/bbb/ccc.html?ddd にHTMLフォームからPOSTで適当なクエリを送って、
そいつを取得したいのですが、
QUERY_STRING には aaa/bbb/ccc.html&ddd が入っているものの、
フォームからポストしたクエリが標準入力に来ていないっぽいのです。
フォームからポストするクエリの量を変えてやると CONTENT_LENGTH の値が変わるので、
全く送られていないわけではないみたいなのですが…
いったいどこに行ってしまったのか心当たりはありませんでしょうか?
0189188
2005/06/03(金) 07:13:27ID:???なんか全然別のつまらないところでミスっていただけでした……
板汚しすみません……
0190nobodyさん
2005/06/03(金) 09:54:19ID:lSpNwut+0191nobodyさん
2005/06/03(金) 10:01:33ID:???0192nobodyさん
2005/06/03(金) 10:02:31ID:???0193nobodyさん
2005/06/03(金) 16:31:13ID:p0YkzVQclocal $_ = shift;
-(tr/\x00-\x7f//)+2*length
}
↑これはどんなことをしてるんでしょうか
lengthwは
if((lengthw $x) < 50){} のような使い方をしているみたいですが
どなたか分かる方がおりましたら解説希望です。
0194nobodyさん
2005/06/03(金) 17:23:46ID:???なにがしたいのかはよくわからん。
0195nobodyさん
2005/06/03(金) 17:24:10ID:???0196nobodyさん
2005/06/03(金) 18:09:23ID:???$_がunicode文字列でbytesプラグマの影響範囲内でなければ
lengthはバイト数じゃなくて文字数だな。
もしそうならアスキーの範囲は1,それ以外は2で文字幅を
数えてるような気がする。
条件が示されてないのでなんともいえんが。
0197193
2005/06/03(金) 18:27:26ID:p0YkzVQcお答えありがとうございました!
というか
local $_ = shift;#←これがよく分かってないんです。
-(tr/\x00-\x7f//)+2*length #←これは_$が略されてるのは想像つくんですが。。
0198nobodyさん
2005/06/03(金) 18:45:47ID:???結局見てみないとわからんねw
>>197
local $_ = shift;
↓=
local $_ = shift @_;
OK?
0199193
2005/06/03(金) 18:52:05ID:p0YkzVQcわけ分かりませんでした。ありがとうございました!
ちなみにbytesプラグマの影響範囲内ではありません。
0200nobodyさん
2005/06/03(金) 18:56:41ID:???use Time::Local
とか意味分かんないし
0201nobodyさん
2005/06/03(金) 18:58:28ID:???0202nobodyさん
2005/06/03(金) 19:12:25ID:???0203nobodyさん
2005/06/03(金) 19:23:19ID:???それは単に君が勉強が足りてないだけのような気が。
0204nobodyさん
2005/06/03(金) 19:47:19ID:???↓=
BEGIN {
require 'Time::Local.pm';
import Time::Local;
}
アンダースタンンドゥッ!?
0205nobodyさん
2005/06/03(金) 19:59:28ID:???0206nobodyさん
2005/06/03(金) 20:25:00ID:???http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_require_VERSION
>>205
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html#Package_Constructors_and_Destruc
0207nobodyさん
2005/06/03(金) 21:08:38ID:???0208nobodyさん
2005/06/03(金) 21:17:01ID:???0209nobodyさん
2005/06/03(金) 21:21:50ID:???http://search.cpan.org/~drolsky/Time-Local-1.11/lib/Time/Local.pm
>>208
Perl に関してはググるより前に perldoc れ or CPAN れが必要な気がする。
0210nobodyさん
2005/06/03(金) 21:26:58ID:???0212nobodyさん
2005/06/03(金) 21:38:29ID:p0YkzVQcこんなのが出てきましたけど、私にはチンプンカンプンです。
これだけで申し訳ないのですが、↑が分かる人がいましたら、解説願います。
0213nobodyさん
2005/06/03(金) 21:44:52ID:???0217nobodyさん
2005/06/04(土) 22:52:44ID:???0218nobodyさん
2005/06/04(土) 23:48:24ID:???たとえば12345678を11.77にしたいです。
0219nobodyさん
2005/06/04(土) 23:55:29ID:???my $manko = 100;
print int($chinko / (1024 * 1024) * $manko) / $manko;
0220nobodyさん
2005/06/05(日) 00:02:38ID:???0221nobodyさん
2005/06/05(日) 00:43:39ID:???0222nobodyさん
2005/06/05(日) 04:55:26ID:???0223nobodyさん
2005/06/05(日) 13:21:23ID:???0224nobodyさん
2005/06/05(日) 15:28:16ID:???↓のような場合で、
for($i=0;$i<=10;$i++){
$po[$i] .= int(rand(6));
}
これはあくまで例なのですが、似たような場合などでも、
randで選ばれる数字が同じものが続けて入ってしまう事が良くあるのですが、
これをもっとばらけさせたいのですが、何か方法があるのでしょうか?
上手く説明できずにすみませんが何卒よろしくお願いします。
0225nobodyさん
2005/06/05(日) 16:27:58ID:???0〜5までの数字から完全にランダムに選んだ場合、
直前と同じ数字になる確率は1/6もあるわけで、
10回も続けてやれば一度でも同じになる確率は
8割以上だからまあ当たり前だろうな...
同じ数字が続くのがいやならひとつ前の数字を
保存して同じ数字にならないように細工すりゃ
いいんじゃねーの。
お手軽コース:
同じ数字の間はやり直す
少し考えたコース:
0〜4までの乱数を求めて、前の数字と等しいか
大きければ1を加える。
0226nobodyさん
2005/06/05(日) 16:42:19ID:???コード書いてみたがね。
同じ数字が並びそうなら振りなおすなも。
my @numbers;
my $last = $num = -1;
for(my $i = 0; $i <= 10; $i++){
$num = int(rand(6)) while($last == $num);
$numbers[$i] = $last = $num;
}
print @numbers;
# 11回振ってるようだが、いいんきゃーも?
0227nobodyさん
2005/06/05(日) 18:10:57ID:???下のテーブルをセレクトしたいだけなんですが、mysqlのコマンド上ではちゃんと表示される日本語がPerlで出力させるとクエスチョンマークで表示されてしまいます。
↓こういう風に表示させたい。
>2005-06-05 17:27:47<>0<>ニュースタイトル!<
>2005-06-05 17:27:48<>0<>news title!<
↓こういう風になってしまう。
>2005-06-05 17:27:47<>0<>?????????<
>2005-06-05 17:27:48<>0<>news title!<
どうやったら日本語を出力できるんでしょうか。どなたかご教授お願いします。m(__)m
◆ソース(perl v5.8.6)
$dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0});
$datasp = $dbh->selectall_arrayref(q{
SELECT * FROM NEWS
});
for($n = 0; $n < scalar(@$datasp); $n++){
printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]);
}
0228nobodyさん
2005/06/05(日) 18:11:25ID:???◆テーブル
| NEWS_DATE | NEWS_IMPORTANCE | NEWS_TITLE |
| 2005-06-05 17:27:47 | 0 | ニュースタイトル! |
| 2005-06-05 17:27:48 | 0 | news title! |
◆DBステータス
mysql Ver 14.7 Distrib 4.1.12a, for Win32 (ia32)
Connection id: 1
Current database: testdb
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 4.1.12a-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: sjis
Db characterset: sjis
Client characterset: sjis
Conn. characterset: sjis
0229nobodyさん
NGNGmy @dice_seed = (1..6);
my @dice_rand;
for(reverse (0..$#dice)){
push @dice_rand, splice @dice_seed, rand $_, 1;
}
みたいな。。。
0230nobodyさん
2005/06/05(日) 19:24:15ID:???たぶんこれ。オレも以前はまった。
ttp://www.mysql.gr.jp/frame/modules/bwiki/?FAQ
の「mysql コマンドでは大丈夫なのに、PHP,perl,accessなどで文字が ? に化けるのは? 」
0231227
2005/06/05(日) 20:35:05ID:???ログイン直後に SET NAMES sjis を追加したらできました!
ありがとう!!!
もう、perlあきらめてphpで開発しようかと思ってたら
phpでも同じだったんですね・・・
◆ソース(変更後)
$dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0});
$dbh->do('SET NAMES sjis'); # ←追加
$datasp = $dbh->selectall_arrayref(q{
SELECT * FROM NEWS
});
for($n = 0; $n < scalar(@$datasp); $n++){
printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]);
}
1: HTMLを取得して例えば
<A href="http://www.**.co.jp/~sample/image/a.jpg">
<A href="image/a.jpg">
<A href=http://www.**.co.jp/~sample/image/a.jpg>
<A href=image/a.jpg>
とあるものをすべて
<A href="http://www.**.co.jp/~sample/image/a.jpg">
に統一したい。
2:
$url = $ENV{'QUERY_STRING'};
$url =~ s/$0//gi;
$surl = $url;
if($surl !~ /\/$/){$surl =~s/(.*)\/.*/$1\//i;}
use LWP::Simple;
$html = get $url;
&jcode'convert(*html,'sjis');
#携帯で見れるようにしたいのでテーブル等不要と思われるものを削除
#出来ればここも1行に統一できればうれしいです
$html =~ s/<(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
$html =~ s/<\/(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
3: 相対パスと絶対パスの相互の方法がまったく思い浮かばずにいます
これぐらいでよろしいのでしょうか。よろしくお願いいたします。
0233nobodyさん
2005/06/06(月) 01:24:14ID:???>これぐらいでよろしいのでしょうか。
もう少しやりたいことと何が問題なのかを整理して書いてくれ。
1と3って同じことだと思っていいのか?
とりあえず hoge/./ を取り除いたりまではしてない。
my $server = 'http://www.example.com'; # サーバのところまで
my $base = 'http://www.example.com/~sample/'; # 相対パス起点
sub absolute($)
{
my $str = shift;
$str =~ s/^"//;
$str =~ s/"$//;
if($str =~ m,^/,) {
return qq("$server$str");
} elsif($str =~ m,^http://,) {
return qq("$str");
} else {
return qq("$base$str");
}
}
$target =~ s,(<A[^>]*\s+href=)("[^"]*"|\S*)([^>]*>),$1.absolute($2).$3,eigm;
2: まとめればいいんだな?
$html =~ s/<\/?(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
個人的には
$html =~ s,</?(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt)[^>]*>,,gi;
の方が好きだな。
0234nobodyさん
2005/06/06(月) 01:26:42ID:???$target =~ は $html =~ だと思ってくれ。
0235nobodyさん
2005/06/06(月) 01:31:08ID:???度々申し訳ない。>>1 のテンプレ?に合わせようとしてたんだな。
でもやっぱり何が問題なのか、どこがポイントなのかを整理して欲しいとは思う。
0236nobodyさん
2005/06/06(月) 14:15:56ID:nLjgLi0Tflockを使わずにflockと同じ動作する方法って、ありますか?
0237nobodyさん
2005/06/06(月) 14:29:00ID:???0238nobodyさん
2005/06/06(月) 15:25:52ID:???0239nobodyさん
2005/06/06(月) 15:44:24ID:???【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
0240nobodyさん
2005/06/06(月) 23:17:43ID:???0241nobodyさん
2005/06/06(月) 23:52:50ID:7fi2eBpp多分超簡単なものを作ってます。
ファイルをオープン後
$buff=<DAT>;
@buff=<DAT>;
としました。
これは、データの1行目と全てのデータを表示させたかったからなのですが
どうやら上記のように書くと@buffには、$buffを除いたものしか入ってこないようです。
簡単に、データの1行目、1行目を含む全データを格納したいのですが
どうしたらいいでしょうか。
0242nobodyさん
2005/06/06(月) 23:58:16ID:???$buff=$buff[0];
できました、ありがとうございます
整理できていなくてすいませんでした
いまさらですが整理というか用途を書きますと
携帯からこのcgiにアクセスし、
****.cgi?http://www.abc.*.jp/
と言う形でみたいページのアドレスを指定します
指定されたアドレスをcgiで取得し、テーブルなどの携帯では不要なタグを切り捨てます
次に、アンカー?<A〜タグにあるhrefにこのcgiをかえすように、
href=****.cgi?リンク先
と言うようにかえたいので、hrefのぶぶは絶対パスに統一する必要があるのですがこの方法が分からずにいました
あともう一つ間違えてたら分かればでいいので教えていただきたいのですが、
>>232のソース+>>233パスを統一するソースのみのソースで何故かbodyタグまで消されるのですが、理由分かりますでしょうか
0245nobodyさん
2005/06/07(火) 09:57:36ID:???Blockquote とか UL とかも消されてるはず。
もうちょっと正規表現考えた方が良かったね。 プ
たしかに…
気づきませんでした
ありがとうございます
0247nobodyさん
2005/06/07(火) 12:03:54ID:???↓これだけの文章だと、"newdir"というフォルダがなければ、作るまで永遠に繰り返すってことになりますかね?
while (!mkdir("newdir", 0755)) {
}
0248nobodyさん
2005/06/07(火) 12:32:22ID:???0249nobodyさん
2005/06/07(火) 14:54:20ID:???while (!mkdir("newdir", 0755)) {
rmdir("newdir");
}
0252nobodyさん
2005/06/07(火) 17:02:56ID:???なので、もし既にnewdirフォルダが存在していた場合、無限ループになるわけで。
0254nobodyさん
2005/06/07(火) 17:46:05ID:???0255 ◆wSkAcTBWJw
2005/06/07(火) 17:50:20ID:Jzx4SwvB\%hogehoge と記述した場合、どのような意味を成すのでしょうか?
具体的には↓のような文章なのですが、
return \%hogehoge if (rename($hogehoge{path}, $hogehoge{cureer}));
ifの中が真(renameに成功)の場合は\%hogehogeの中に何かを入れているのでしょうけども、
よく分かりません。どなたか教えてください。
0256nobodyさん
2005/06/07(火) 18:06:11ID:???0257nobodyさん
2005/06/07(火) 18:22:21ID:???「perl リファレンス」でぐぐれって事な
0258nobodyさん
2005/06/07(火) 18:39:51ID:???hogehoge{path}を戻り値がリファレンスとして返される。
0259nobodyさん
2005/06/07(火) 18:46:16ID:???renameに成功した場合は
$hogehoge{cureer}を戻り値とし、リファレンスとして返される。
0260nobodyさん
2005/06/07(火) 18:56:32ID:???> \%hogehogeの中に何かを入れているのでしょうけども、
何も入れてないでしょ。
renameに成功したら、return \%hogehoge を実行してるだけ
0261nobodyさん
2005/06/07(火) 19:59:03ID:???つーかそれからの話などそれで消えてなくなる。
0264nobodyさん
2005/06/07(火) 20:33:44ID:B1nXEBrs$xx = <FILE>;
$xx++;
print FILE $offCount;
close(FILE);
ファイルから値とって、1増やして上書きしたいんですけど、上の通りにしてもできないんです。
$fileの初期値を1にして、上の通り実行すると、$fileが空っぽになる
open(FILE, "+<$file");
$xx = <FILE>;
$xx++;
print FILE $offCount;
close(FILE);
こんな感じで追加書き込みモードにすると、うまく行くので、変数にはちゃんと値が入ってるみたいです。
ご指摘お願いします。
0265nobodyさん
2005/06/07(火) 20:44:04ID:???$offCount ってなんだよ。
+> はまず最初にファイルを真っ白にするんだが。
■ このスレッドは過去ログ倉庫に格納されています