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

【Perl】初心者コーナー Part15

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん02/08/08 23:19ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【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あたりを見よう。
0809名無しさん@Meadow02/09/10 12:47ID:???
>>806
while(<STDIN>){
next if /^$/;
s/omae/bakaka/;
s/omae/ahoka/;
print;
}
でもええよ。
0810nobodyさん02/09/10 12:59ID:???
>808
($sec , $min , $hour , $mday , $mon , $year , $week) = localhost(time);
print (int($mday/7)+1)*10 + $week ;
0811nobodyさん02/09/10 12:59ID:???
>810 =~ s/localhost/localtime/;

∧‖∧
0812nobodyさん02/09/10 13:02ID:???
>810
それだと2-6日は必ず第1週になるよ…
0813nobodyさん02/09/10 13:29ID:???
0814∧‖∧02/09/10 13:46ID:???
>812
仕様書の意味取り違えてました。

($sec , $min , $hour , $mday , $mon , $year , $week) = localtime(time);
print (int(($mday+8-$week)/7))*10 + $week;

かな?
0815T女の竹田02/09/10 19:32ID:???
カレンダーとかかな?
>>808を読むと日曜が始まりみたいだけど、それなら

($sec , $min , $hour , $mday , $mon , $year , $wday) = localtime(time);
として、

第何週かは
int(($mday + 12 - $wday) / 7)

何日目かは
$wday + 1

だと思う。たぶん…
0816nobodyさん02/09/10 20:37ID:???
>>810
>>815
ランダムに日付を変えて何度かテストしてみても
期待通りの結果が得られて大丈夫でした。
ちなみに、利用するのは
いつも巡回する複数サイトの一部記事を
引っこ抜いて表示させるものです。
新しく追加するサイトのファイル名が
今回質問させていただいたフォーマットでした。
ありがとうございました。
0817nobodyさん02/09/10 21:40ID:ApnEpI8H
Perl 5.6.1、Vine2.5で勉強してます。プログラミングはPerlが初めてです。
リャマ本第2版、P172の問題2が分かりません。
題意は、Unixのmvコマンドと同じ働きをするプログラムを書け、
という内容で、ヒントとして、第2引数がディレクトリの場合も考慮せよと。

で、漏れの解答はこんな感じです。変数の名前、正規表現の
区切り文字は末尾の解答例に合わせてます。

($old, $new) = @ARGV;
if (-d $new){
$basename = $old;
$basename =~ s#^/.*/##g;
$new = $new . "/$basename";
}
rename($old, $new) or
die "Cannot rename $old to $new: $!";

一応は思った通りの動きをします。メデタシ。

ところが、解答例は、4行目が以下のようになってる。
($basename = $old) =~ s#.*/##s;
勿論、こちらも思った通りの動作をしますです。
かっこは、漏れの解答での3行目と4行目を合体させてだけなので
無視するとして、よく分からないのは、右辺です。

1) s/ は置換だけど、後の/sは一体何?
2) .*/ だと、頭の/が残るような気がするんだけど。。。

なんでだろう。。。?

0818nobodyさん02/09/10 21:44ID:Lqs0IC/U
http://yahooo.s2.x-beat.com/
081981702/09/10 21:45ID:ApnEpI8H
自己レスですが、(2)は、たった今、自分の書いたのをみて分かりました!
ルートディレクトリの「/」も 「.*/」で、「.」にマッチするやん!
ってゆーか、これだと、
# test.pl aaa ~/bbb
の場合、エラーになるよね?
ニョロがマッチしないから。。。

で、1)の方は、おながいします。

0820nobodyさん02/09/10 21:45ID:???
>>817
1)については
ttp://namazu.org/~tsuchiya/perl/info/perl-ja_44.html#SEC44
082181702/09/10 21:59ID:ApnEpI8H
>>820サン、ありがとうございます。

ははぁ、なるほど!
文字列を単一行として扱う、ということですね。
だけど、この問題の場合、こんなオプションが必要なのでしょうか?
勘違いしているかもしれないけど、漏れの理解では、深いディレクトリ
を処理すると、引数が複数行になってしまうことがあるかもしれないので
sをつける、と思ってるのですが、この考えによると、普通mvするとき
引数に改行なんか入れないですよね?
そもそも、んな深いディレクトリを掘ることってあまりないので、
今まで思いもよらなかったし、そもそもmvコマンドで引数に改行
入れてもいいのかどうかも分からん。。。

0822nobodyさん02/09/10 22:32ID:???
いくら長くても一行だと思うが。
0823nobody02/09/11 02:17ID:Zh9eBVFz
”どこが間違っているのかわかりません”的なものじゃないんだけど

crypt関数の使い方で聞きたいことがあります。

(例)
print "文字列を暗号化します。適当に文字をいれて下さい\n";
$get = <STDIN>
$key ="sp";
$pass = crypt($get,$key);
print "暗号化された文字列は$passです\n";

この$keyの部分は任意の二文字を入れるんだけど
それってどういう意味があるんでしょうか?
これによって暗号化される結果などが違ってくるのでしょうか??。
特に意識することではないんでしょうか?

0824nobodyさん02/09/11 02:21ID:???
>>807>>809
親切にありがとう。
微妙に本にかいてなかったので助かりました。
0825nobodyさん02/09/11 02:41ID:???
>>823
>結果などが違ってくるのでしょうか
全然変わる。
0826nobodyさん02/09/11 03:06ID:???
>>823
そんなの、それを実行してみればすぐに解りそうなもんだが?
0827nobodyさん02/09/11 03:13ID:???
(`Д´)
0828nobodyさん02/09/11 12:43ID:???
PERLでURLを指定してそこのソースを取得する方法を知っている方、
どうかおしえてつかーさい。
0829nobodyさん02/09/11 12:58ID:???
>828
「LWP」で検索。
0830nobodyさん02/09/11 13:13ID:l0g0P0Oz
ライブラリを読み込む際、いちいちrequire **.plってかかなきゃダメでつか?
7枚くらい読みこまなきゃいけないんですけど長ったらしくて。
0831nobodyさん02/09/11 13:17ID:???
>>830
>ダメでつか?
>7枚くらい
( ´,_ゝ`) プッ
0832nobodyさん02/09/11 14:44ID:???

 馬 鹿 ば っ か し だ な(藁





おれをふくめてな。
0833nobodyさん02/09/11 15:06ID:???
「オ・・・ッ  オクッ・・
オクレ兄さあああああああああああああああんッッッ
0834名無しさん@Meadow02/09/11 16:09ID:???
>>830
別ファイル(仮にloading.plとする)に
require "a.pl";
require "b.pl";
.
.
.
って書いといて、本ファイルでは
require "loading.pl";
だけで逝けるよ。
さすがに、require "a.pl", "b.pl" ...;はだめでしょ。


0835nobodyさん02/09/11 17:07ID:???
>>834
ナルホド。
>require "a.pl", "b.pl" ...;
はい。ダメですたw
ありがとござました。
0836nobodyさん02/09/11 18:55ID:???
改行だとわかってるときはchompよりchopのほうがいいの?
0837nobodyさん02/09/11 18:59ID:???
\r\nも\nしか削らない<chop
byとほほパパ
0838nobodyさん02/09/11 20:31ID:ofaOgNiv
初心者なんですが、変数から特定の文字列を探す方法ってないですか?
すまそ。教えてください。
0839nobodyさん02/09/11 20:32ID:???
>838
index

後は検索しる。
0840nobodyさん02/09/11 20:39ID:ofaOgNiv
>>839
indexって何番目にあるかを検索するだけですよね?
どうやって使うのかが分からないです。
0841nobodyさん02/09/11 20:45ID:???
>840
特定の文字列を探したかったんでしょ?
使い方は検索しる。

文字列を探して抜き出してどうこうしたいってなら、
substrを使うとか、indexを使わず正規表現に頼るとか。
後は検索しる。
084283902/09/11 20:48ID:ofaOgNiv
>>840
使い方何となく分かりました。ありがとう!
0843nobodyさん02/09/11 21:12ID:???
ユーザー関数を定義する事ってできますか?
0844名無しさん@Meadow02/09/11 21:48ID:???
ユーザー関数を定義しる:
ユーザーが作ったサブルーティン、ライブラリ、モジュール。
(反対語:)組み込み関数

ユーザー定義を関数にするんじゃないか?
0845nobodyさん02/09/11 21:49ID:wdtzvpz4
できます。
0846nobodyさん02/09/12 02:13ID:???
>>837
>\r\nも\nしか削らない<chop

\n について勉強したほうがいいよ
084784702/09/12 14:36ID:???
$syu =~ s/<br>/\r\n/g;
$value =~ s/<br>/\r/g;
$value =~ s/<br>/\n/g;
このようにフォームデータを変換するのと逆に、
すべてのOSの改行文字に対応して、改行を<br>に変換することはできますか?

フォームのtextareaのvalue=""にログを入れたいのですが。
084884702/09/12 14:37ID:???
一行目の$syuは$valueの間違いです。
0849nobodyさん02/09/12 14:42ID:???
出来ない。
つーか、\nで十分。
085084702/09/12 14:45ID:???
>>849
分かりました。
0851nobodyさん02/09/12 17:28ID:???
for($NUM = 0; -e "$NUM.jpg" == 1; $NUM++){

print "<a href=\"$NUM.jpg\">$NUM</a>";

}
としたのですが、上手く動きませんでした。
For文は
for(NUM =0; ここの条件が成り立ってるとき動作する; NUM++)
こういう事ではないのでしょうか?

while文で
while(-e "$FileAddress$NUM.jpg" eq "1")
こうしたらできたのですが・・・
085285102/09/12 17:34ID:???
ファイルが連番で[1-20].jpgである場合、

-e でファイルが存在を調べるか、
readdir で一覧を取得するか どちらかを考えたのですが
どちらの方が効率が良いと思うでしょうか?

ご教授頂けないでしょうか、お願いいたします
0853nobodyさん02/09/12 17:51ID:???
Benchmark.pm で調べれ
0854>>84702/09/12 18:16ID:???
$syu =~ s/\x0D\x0A/<BR>/g;
$syu =~ s/\x0D/<BR>/g;
$syu =~ s/\x0A/<BR>/g;

>>847
この産業で出来るぞ。

0855nobodyさん02/09/12 18:18ID:???
>>854
<BR> を改行に変換したかったんじゃないのか?
0856nobodyさん02/09/12 18:22ID:V0oL4dfD
なんかファイル処理でDBM使わされることになったんですが、ファイルロックがイマイチ分かりません。

sub Filerock {

my $now = time();
my $lockfile = "lock";
my $locking = "lock.now";
for($_=5; $_>=0; $_--){
if(rename($lockfile, $locking)){
utime($now, $now, $locking);
$SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "intProc"; # 割り込みで中断するときの処理を定義
&Dbmopen;
return;
}
sleep 1 if $_;
}

&Header("フォームエラー");
print "<h2>ロックちう</h2>\n<hr>\n";
&Footer;
exit;
}


こんなんで良いんでしょうか。
もっと効率の良いコードがあればアドヴァイス願います。
0857nobodyさん02/09/12 18:25ID:???
ダミーファイルでも開いてflockしとけ
0858nobodyさん02/09/12 18:31ID:NNUPZyEk
http://yahooo.s2.x-beat.com/
0859nobodyさん02/09/12 18:32ID:???
>>851
$NUM.jpg
と
$FileAddress$NUM.jpg
違うよ
0860nobodyさん02/09/12 18:49ID:???
>>859
それで?
0861初心者厨房02/09/12 19:24ID:jvK2X5HW
Perlの勉強を始めたばかりの初心者です。ちゃんと書いたつもりなんですがうごきません。
どうしてなんでしょうか。教えてください。お願いします。
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print 10+5 # 足し算
print " / "; # 区切り
print 10-5; # 引き算
print " / "; # 区切り
print 10*5; # 掛け算
print " / "; # 区切り
print 10/5; # 割り算
print " / "; # 区切り
print 10%5; # 剰余算

_END_
0862nobodyさん02/09/12 19:26ID:???
print 10+5 # 足し算
0863nobodyさん02/09/12 19:27ID:???
print 10+5 # 足し算
↓
print 10+5; # 足し算

エラーメッセージぐらい読め
0864nobodyさん02/09/12 19:31ID:???
>>863
氏ね!
0865nobodyさん02/09/12 19:33ID:???
>>864 ハァッ!!!!!!!!!!!!!!!!!!!!!?
0866nobodyさん02/09/12 19:34ID:???
>>863
揚げ足取りは氏ね!
0867nobodyさん02/09/12 19:38ID:???
>>865
氏ね!
0868nobodyさん02/09/12 19:38ID:???
>>866
何が揚げ足取りなんだ?
0869nobodyさん02/09/12 19:39ID:???
( ● ` ∇ ´ ● )ガオー
0870初心者厨房02/09/12 19:54ID:ODncwTzE
ありがとうございます。わかりました。ところでエラーメッセージのどこをみればわかるのですか?
0871nobodyさん02/09/12 20:01ID:???
>>870
もう(#・∀・)カエレ!
http://pc.2ch.net/test/read.cgi/php/1028646335/
↑みてこい
#!/usr/local/bin/perl -w
か
perl -wc hoge.pl

print 10/5;
print " / ";
↑きもい書き方やめれ
$f=10/5;print "$f /";
0872名無しさん@Meadow02/09/12 20:07ID:???
>>864-870
荒らしさん、こんにちは
あなたの存在がエラーです
0873初心者厨房02/09/12 20:08ID:ODncwTzE
ほんとに始めたばっかでなにがなんだかわかんねーんだからしょうがねーだろ。
0874nobodyさん02/09/12 20:11ID:???
< ● ` ∀ ´ ● > < >>873 一緒に祖国に帰るニダ
0875nobodyさん02/09/12 20:15ID:???
1 :ぼぶ ◆EMrmvKLI :02/09/10 19:18 ID:G4zqfa38
これはいろんなとこにコピペしてください。
みんなで台風を起こしましょう。
東京駅を中心に右回りです。
9月22日夜9時にみんなでいっせいに「フゥー」と吹くのです。
注意
周りに障害物のないところでやりましょう(なるべく高いところ)
「フゥー」以外に扇風機やうちわを使ってもかまいません。
       !東京を壊しましょう!
0876初心者厨房02/09/12 20:15ID:ODncwTzE
帰ります・・・>>874
0877nobodyさん02/09/12 21:03ID:???
#!/usr/local/bin/perl
print "Content-type: text/html\n\n;


$atai='値';
print '「$atai」(シングルクォート文字列では展開されない)/';
print "「$atai」(ダブルクォート文字列では展開される)";

_END_
何がまちがってんの?
0878nobodyさん02/09/12 21:11ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0879nobodyさん02/09/12 21:20ID:???
で、>>861 = >>877 なんでしょ?(プ
0880 ◆4XfSMGTg 02/09/12 21:21ID:???
糞な質問ばっかりだな
0881nobodyさん02/09/12 21:22ID:???
まぁね。みりゃわかるっしょ>>879
0882nobodyさん02/09/12 21:54ID:???
てゆーか最近カマッテ君が住みつきだしたのはなんで?こんなとこに。
上級者ぶってツッコミ入れてるのも知ったかぶりだからとんちんかんだし
とりあえず初心者嘲笑いたいなら的確に回答してやってからにするのが筋ってもんじゃないの
0883nobodyさん02/09/12 22:47ID:???
何でもかんでも答えるのは如何なものかと。
0884nobodyさん02/09/12 23:03ID:???
◆4XfSMGTgの発言禁止依頼しました
0885nobodyさん02/09/12 23:03ID:???
答えないでいるならいいが、質問馬鹿にするだけしといて
そいつ自身答えられないパターン多すぎなのも見ててうざ
0886nobodyさん02/09/12 23:28ID:???
下手に答えて自分がバカにされるのが嫌なんだろ、きっと。
0887nobodyさん02/09/12 23:29ID:???
>>882=885 煽られた初心者
0888nobodyさん02/09/12 23:39ID:???
>>887
いや今まで無視してたよ リアクションしてあげないのが一番だから。
ここに来て立て続けで軽く荒れてきたから
ちょうどいいかと思ってつっこんでみただけ。
0889nobodyさん02/09/12 23:54ID:???
で、結局釣られたのは>888というオチか
089088802/09/13 00:03ID:???
はいはいごめんよ 俺が悪かった。許してね。>>889

−−−−−−−−−−−−−−−−−−−−−−−−−−−

以下、普通のスレに戻って下さいませ。
0891nobodyさん02/09/13 00:08ID:???
場を乱すだけ乱しといて何を今更…
0892nobodyさん02/09/13 00:16ID:???
>>891
これ以上乱れないように882で釘さした形だと思うが。887とかが俺を煽ってきただけだし
申し訳ないがもうレスらないんでよろ
0893nobodyさん02/09/13 00:16ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
~~~~~~~~~~~~~~~~~~~~~~~~~~
0894nobodyさん02/09/13 03:15ID:R5wD3hCH
mbx形式のメールをmh形式にばらす
スクリプトを書こうと思ってます。

mbxは複数のメールが1つのファイルになっていて
ピリオドだけが書かれた行がメールの区切りになっ
てます。そのmbxファイルを1つ1つのメールに
ばらして連番で出力したいのです。

#書いたプログラム-mbx.pl
open(OUT,">$n");

while(<STDIN>){
unless(/^\.$/){
print OUT;
}
else{
++$n;
}
#ここまで

で、実際にperl mbx.pl < hoge.mbx
とすると1に全て出力されてしまいます。
なにがいけないんでしょう?
0895nobodyさん02/09/13 03:17ID:???
>>894
追記
最初に$n = 1;で初期化してます。
0896nobodyさん02/09/13 03:17ID:???
>894
改行文字忘れてるよ
0897nobodyさん02/09/13 03:25ID:???
>>896
ごめん意味わからない。どこにつけ忘れてるの?
0898nobodyさん02/09/13 03:29ID:???
>897
unless(/^\.\n$/){
かな?
0899nobodyさん02/09/13 03:42ID:???
>>898
指摘サンクス。
あとはどうすれば連番で出力できるのか
教えてくらはい。
0900nobodyさん02/09/13 03:43ID:???
>894
てか unless( $_ eq ".\n" ) でいいんじゃ...
0901nobodyさん02/09/13 03:56ID:???
メール本文に.\nがあったらまずいかな
と思ったんだけど。。。
0902nobodyさん02/09/13 04:04ID:???
>>899
open(OUT,">$n");
をwhileの中に入れてないからでわ?
0903nobodyさん02/09/13 04:05ID:???
何がしたいのかイマイチわからないけど
こういう事か?

$n = 0;
while(<STDIN>){
next if($_ eq ".\n");
++$n;
open(OUT,">$n".'.mh');
print OUT;
close(OUT);
}

>>901
区切りに使われてるものが本文中に無変換で置かれてることは
ないだろう。もしあったらシステムが破綻する。
0904nobodyさん02/09/13 04:05ID:???
>899
こんな感じでどう?

$n = 0;
loop: {
 $n++;
 open( OUT, ">$n" );
 while ( <> ) {
  if ( $_ eq ".\n" ) {
   close OUT;
   redo loop;
  }
  print OUT;
 }
}
0905nobodyさん02/09/13 04:15ID:???
>>904
書き込みで開いたら何も出てこないぞ…(;´Д`)
0906nobodyさん02/09/13 04:16ID:???
>905
?
090790502/09/13 04:29ID:???
ごめん、勘違い。
0908nobodyさん02/09/13 04:30ID:???
>区切りに使われてるものが本文中に無変換で置かれてることは
>ないだろう。もしあったらシステムが破綻する。
よく考えたらそうですよね。

>>903>>904
両方試したけど各行ばらばらになって出力されてしまいます。
.mbxの改行コードはlfなんですが。

なんでだろう。。
レス数が900を超えています。1000を超えると表示できなくなるよ。