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

Perl コーディング初心者質問コーナー Part35

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/05/26 16:48ID:kkhhiYmo
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0713nobodyさん04/07/03 22:52ID:???
>>712
length
0714nobodyさん04/07/03 23:36ID:???
sub 709{

$i=1;
while(1){ if(@_%10<10) $i++) }

return $i+1;

}
0715nobodyさん04/07/03 23:38ID:???
sub 709{

$i=1;
while(1){
$j=1;
for($j=0; $j<$i; $j++){ $j*=10; }

if(@_%$j<10) $i++) }

return $i+1;

}
0716nobodyさん04/07/03 23:41ID:???
>>714-715
動きませんが。
まともに書けないなら無理しなさんな。
0717nobodyさん04/07/03 23:51ID:???
ただ適当に書いただけ。
別に動かそうと思って書いたわけじゃないが
0718nobodyさん04/07/04 00:00ID:???
>>717 ← こ、この言い訳は苦しすぎるw

>>709
unsigned integerなら>>713でいいんでないの?
0719nobodyさん04/07/04 00:03ID:???
なんでさ
10のn乗で割っていくってようりょうだぞーってレスのつもりだが
で、10で割り続けてたので単純にpow入れようやっておもい
Perlってpowあったかなーとおもい、自分でn乗だすようにしてーー
って適当にやったから括弧の場所とかほっときぱなしになったわけだが

良い訳とかキモイ
0720nobodyさん04/07/04 00:06ID:???
ループはダサイ。
int(log($NO)/log10)+1
072171904/07/04 00:06ID:???
ってついカーっとなってスマン・・・
たしかにそうとられても仕方ない罠。
072271904/07/04 00:07ID:???
>>720
スマンな。Perlは去年少しかじって止めたのでほとんど関数把握してないんよ
0723nobodyさん04/07/04 00:12ID:???
そんな奴が回答者かよ
072471904/07/04 00:16ID:???
j3勉強のついでということで
0725nobodyさん04/07/04 00:26ID:???
perlだけに下手に自分で10で割ったりしながらループするより
length取ったほうが速そうだな。誰かベンチしてみない?
0726nobodyさん04/07/04 00:49ID:???
splitで1文字ずつに分解して配列数数える方法もありじゃないか?
0727nobodyさん04/07/04 00:52ID:???
おそらくそれが一番早いかと
072870904/07/04 00:54ID:Udr24Tj0
>>713
lengthで調べてみたら、出来ました。ありがとうございました。

もう一点、お聞きしたいのですが、
特定の文字列と一致した場合だけエラーになるようにしたいのです。

$NO="123456";
$NO2="23";

if ($NO eq /$NO2/g) {
  print "エラーです";
}

こんなふうに書いたのですが、上手くいきません。
サイトをいくつか見ながら書いてみたのですが、原因がわかりません。
すいません、どなたか教えてください。
0729nobodyさん04/07/04 00:54ID:???
(°д ゚)ハァ?

=~
0730nobodyさん04/07/04 01:35ID:???
なんか基本から解説してる本を1冊買うことをすすめるよ。
0731nobodyさん04/07/04 01:43ID:???
>>728
indexで十分だ。
やっぱ本買うよろし。
073270904/07/04 01:47ID:Udr24Tj0
本を買おうと思ったのですが、良い本が見つからなくて・・・
HTMLで言う、「とほほのWWW入門」みたいに、
Perl開設の良いサイトなど無いでしょうか?

ここのスレに載っていたページはどうもわかりにくくて・・・
0733nobodyさん04/07/04 01:49ID:???
今更でスマソだが、漏れなら、
@no = qw(1 2 3 4 5 6);
print $_ = @no."桁\n";
0734nobodyさん04/07/04 02:16ID:???
ここなんか例が載ってて判りやすいと思うのだが。
http://www.big.or.jp/~mio/ga/pl/plref/pl_ref.htm
0735nobodyさん04/07/04 02:41ID:???
>>732
> ここのスレに載っていたページはどうもわかりにくくて・・・
だったらなおのこと、本も用意したほうがいいですよ。

>>733
頑張ってください。>>726-727も眺めつつ。
0736nobodyさん04/07/04 03:33ID:???
>>732
じゃあ「CGI&Perl究極のレシピ350 とほほが教える」でも買ってみたら?
http://www.esbooks.co.jp/books/detail?accd=31095149
Perlの解説本というより目的別のサンプル集みたいなのだから
丸々コピーばかりしないで参考にすればいくらか勉強にはなるだろう。
0737nobodyさん04/07/04 07:41ID:???
俺も持ってる、トホホ氏の。
何気に役に立つよ
0738nobodyさん04/07/04 10:09ID:???
>>732
知ってると思うけど
http://tohoho.wakusei.ne.jp/wwwperl.htm
0739nobodyさん04/07/04 13:38ID:bJ9Q5bUP
初めまして、さっそく質問で申し訳ないのですが、
パスワードの暗号か処理で暗号化を施した場合、
暗号化をログから解除して元パスワードを知ることはやはり不可能でしょうか?

例えば↓
sub encrypt {
local($inpw) = $_[0];
local(@char, $salt, $encrypt);

@char = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');
srand;
$salt = $char[int(rand(@char))] . $char[int(rand(@char))];
$encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt);
return $encrypt;
}
のようなものからパスワードを探ることは・・・?
0740nobodyさん04/07/04 14:18ID:???
キーがわかるなら総当りしていけば? 単純に複合は無理でしょ。
0741nobodyさん04/07/04 14:58ID:???
暗号化前の平文をログって置けばよい。
0742nobodyさん04/07/04 18:07ID:???
簡単に複合できてしまう暗号なんてオhる
0743nobodyさん04/07/04 18:39ID:???
ハッシュの使い方が全然わかりません…
$testに環境変数の一部をUserAgent,IPみたいにコンマ区切りで入れたいだけなんですが…

助けてください…
0744nobodyさん04/07/04 18:43ID:???
>743の質問の意味が全然わかりません…
助けてください…
0745nobodyさん04/07/04 18:44ID:???
$test= join(',',@ENV{keys %ENV});
07467M. ◆dq7M./4Uw. 04/07/04 18:58ID:???
>739
それが出来ないから暗号として成り立つわけで。。。
0747nobodyさん04/07/04 20:30ID:???
2つのファイルのファイル名を入れ替える時ってどうすればいいのかな?
今は
$file1 = 'one.jpg';
$file2 = 'two.jpg';
$temp = 'temp.jpg';
rename $file1,$temp;
rename $file2,$file1;
rename $temp,$file2;
ってやってるけど、いい方法ある?
教えてエロい人!
0748nobodyさん04/07/04 21:22ID:???
>>747
renameの戻り値は見といたほうがいいと思うよ。

あとはtemp.jpgが固定なのとrenameだと上書きされる
のがちと気になるかな。

私がやるなら多分こんな感じにすると思う。最初のrenameを
linkにしたのは一時ファイル名がすでに使われてるときに上書き
しないため。途中でエラーになった時の処理をどこまで凝るかは
その時によるけどor dieは一番手抜きのパターンね。

$file1 = 'one.jpg';
$file2 = 'two.jpg';
$temp = "temp.jpg.$$";
link $file1,$temp or die;
rename $file2,$file1 or die;
rename $temp,$file2 or die;

0749nobodyさん04/07/04 21:29ID:???
>>748
ナンダコレ
釣りか?
0750nobodyさん04/07/04 22:07ID:Sq5R/TGN
プログラム版で板違いといわれてこっちに来ました

全文検索でヒットした奴を
行の真ん中に表示されるようにしたいんですがどうすれば良いんですか?

つまりglobalを検索したとすると、

                      global SchoolNet Director
 we have increased the US publics global awareness
                CanWest global Communications
              help address global warming issues
   California Wood Use Endangers global

↑こういう風に結果を出したいんです。
行全体を出力して、まんなかに検索した語を表示させたいんですが
そもそもどういう方針でやればいいのかさえわかりません。
どうすれば良いんですか?
0751nobodyさん04/07/04 22:38ID:???
>>750
Webプログラミングか?そうじゃなかったらム板池
0752nobodyさん04/07/04 22:46ID:???
table タグで位置あわせするとかその手の話のように読めるが、
もしそうだとしたら、単にHTMLの話だから、
プログラミングでも、Webプログラミングでもなく、Web製作板に行くべきだな。
0753nobodyさん04/07/04 23:20ID:???
>>750
マルチするの早杉。向こうで解答貰ってるぞ。
0754nobodyさん04/07/04 23:53ID:???
>>751-753

バカは下手にでると際限なく威張りますね
わからないならレスしなくていいよ。
0755nobodyさん04/07/05 00:30ID:AbFm7153
質問させてください。
windowsで動かしているとき、
perlを動かすときにdos窓のウィンドウタイトルはc:\perl\bin\perl.exeや
コマンドプロントから起動させた場合はc:\winnt\system32\cmd.exeのようになって
いると思うのですがそれを任意の文字に設定したいのです。
色々検索してショートカットから起動すれば変えられるのはわかったのですが
当方、rocket mouseというtoolからウィンドウタイトルを任意の文字にした
ものを起動させるのが目的でして、このtoolの場合、plファイルのショートカット
を指定してもそのショートカットから起動させるのではなく、リンク先を参照して
起動するため、ウィンドウタイトルを変更して起動させることができません。
ここを調べろ、ここは確認したのかなどのご指摘ありましたらよろしくお願いします。
0756nobodyさん04/07/05 00:49ID:???
>>755
> ここを調べろ、ここは確認したのかなどのご指摘ありましたらよろしくお願いします。
>>1は読んだか?
0757nobodyさん04/07/05 00:59ID:???
>>755
Perlと何の関係が?
075875504/07/05 03:14ID:???
レスありがとうございます。
>>756さんの言うとおりもう一度1を読み返してみます。
>>757
私はてっきりperlスレで質問する内容だと思ったのですが
ご指摘いただいたので違う方向からも再度考えさせてもらいます。
ありがとうございました。
0759nobodyさん04/07/05 04:03ID:???
プロセスを常駐させるにはどんな関数やモジュールを使えばいいでしょうか?
fork関数を使えば良いですか?
0760nobodyさん04/07/05 06:29ID:???
皆さんは入力文字列をエスケープする際にどのような処理をしてますか?

自分はこんな感じです
/&/&/
/\"/"/
/\'/?/
/</</
/>/>/
/\s/ /
/\r\n/<br>/
/\r/<br>/
/\n/<br>/

他に
こんな文字も危険、この文字はこれに置換がいい的なアドバイスもOK
0761nobodyさん04/07/05 06:30ID:???
↑ 消えたので&を&にして書き直しました

/&/&amp;/
/\"/&quot;/
/\'/&#39/
/</&lt;/
/>/&gt;/
/\s/&nbsp;/
/\r\n/<br>/
/\r/<br>/
/\n/<br>/
0762nobodyさん04/07/05 06:48ID:???
Perlのコーディングの話が少ないな。
0763nobodyさん04/07/05 10:32ID:???
この板の住人の大半は
1. コーディング以前の箇所で躓いている
2. 自分の抱える問題がコーディングの問題なのかどうかを切り分けできない
3. そもそもコーディングという言葉の意味を知らない
のいずれかだから。
たぶんこのスレも「Perlを使ったCGIに関する質問ならなんでもOK」だと思われてる
0764nobodyさん04/07/05 10:59ID:???
なるほど、
スレタイ嫁
だけじゃ通じなくなってきたワケだな。
0765nobodyさん04/07/05 15:04ID:???
どーでもいいけど此処って初心者と中級者しかいないね
0766nobodyさん04/07/05 15:19ID:???
無意味なレスをつける>>765はスレタイも空気も読めない初心者
0767nobodyさん04/07/05 15:40ID:???
>>760
s/[\0-\0377]//g;
0768nobodyさん04/07/05 16:48ID:kgB0NkdW
除算の繰上げってどのようにします?


### 除算の繰上げ
$a = 10;
$b = 3;

$c = $a % $b;
$d = int($a / $b);
if($c){$d++;}


いつもこんな感じですが
なんか、もっさりしてます。
スマートにコーディングしたものですが・・・。
0769nobodyさん04/07/05 18:12ID:???
$a = 10;
$b = 3;
$d = int(($a + $b - 1) / $b);
0770nobodyさん04/07/05 23:09ID:???
>>766
空気読めないのお前じゃん。放置しろよ
0771nobodyさん04/07/05 23:29ID:???
粘着ねぇ・・・
0772nobodyさん04/07/06 00:04ID:Xk4rbtY7
perlの ImageMagickを使って画像のexif情報を削除して
ファイルサイズを小さくしたいのですが、できません。

ググってみたところ

$image->Strip();

で削除できるという記述をみたのですが、同じようにやっても
画像が表示できなくなります。

どうやればexif情報だけすっぱり消せるかご存知の方は
いらっしゃいませんでしょうか?
0773nobodyさん04/07/06 02:32ID:???
有効期限が1時間のcookieを焼きたい。
cookieのexpiresに使える形式の時間の取得って、
gmtime time
だと全て数字だから微妙に違うよね。

cookie用に使える形式にするのに自分でルーチンを作ろうかなとか思ってるけど、
既存のモジュールで、こういうメソッドもってるやつないのかな?
0774nobodyさん04/07/06 02:52ID:???
>>773
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI/Cookie.pod
0775nobodyさん04/07/06 04:13ID:???
>>772
http://cachu.xrea.jp/perl/
0776nobodyさん04/07/06 04:29ID:???
>>772
I believe Strip() first showed up in ImageMagick 5.5.7.
0777nobodyさん04/07/06 08:08ID:???
10/3で出た答えが整数なら真、小数点が付くなら偽を返す条件式を書きたいんですが、
PERLでは引数が整数であるか、少数点つきの数字であるかを判定してくれる関数はないのでしょうか?

0778nobodyさん04/07/06 08:45ID:???
>>777
馬鹿たれ
0779nobodyさん04/07/06 09:39ID:???
>>777
10 % 3
0780nobodyさん04/07/06 10:23ID:???
$answer = 10 / 3;
print "ぎーーーーーーーーーーーーーーーーーーーーーーーっ" if not $answer - int $answer;
0781777=77304/07/06 10:33ID:???
>>778-779ありがと。
>>774
なんかムダなソースを読みこんで重くしたくないから、自分で作ってみた。
野暮ったいソースだから、見にくいけど、色々突っ込んでくれるとありがたい。
とりあえず2時間後のGMTを計算するサブルーチン。

ifのとこは上から
処理1.何も繰り上がらず2時間だけプラス
処理2.日、曜、時刻だけ繰り上がり
処理3.処理2+月も繰り上がり
処理4.処理3+年も繰り上がり

一応うるう年は4で割り切れるって部分だけは採用してる。100年とか400年とかは
どうせ生きてないから無視した。
0782777=77304/07/06 10:39ID:???
sub ti{
( my $sec , my $min , my $hour , my $mday , my $mon , my $year , my $wday , my $isdat , my $yday ) = gmtime time;
$year += 1900;
my @wday = qw/Sun Mon Tue Wen Thu Fri Sat Sun/;
my @mon = qw/Jan Feb Mar Apr May Jun Jul Aus Sep Oct Nov Dec Jan/;
my @a = qw/31 28 31 30 31 30 31 31 30 31 30 31/;
if ( !($year % 4) ) { $a[1] += 1 ; }
my @b = qw/00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60/;
my $timer;
if ( $hour < 22 ) {
          $hour += 2;
          $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|;
} elsif ( $a[$mon] != $wday ) {
          $hour -= 22;
          $wday += 1;
          $mday += 1;
          $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|;
} elsif ( $mon != 11 ) {
          $hour -= 22;
          $wday += 1;
          $mday -= $a[$mon];
          $mon += 1;
          $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|;
} else {
          $hour -= 22;
          $wday += 1;
          $mday -= $a[$mon];
          $mon += 1;
          $year += 1;
          $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|;
}return $timer;}
0783nobodyさん04/07/06 10:41ID:???
お前ら今はサイバーノーガードの時代ですよ。
cookieの有効期限はリミットの2030付近にするのがナウイですよ。
0784nobodyさん04/07/06 10:52ID:???
>>782
いちいち繰り上がり計算しなくても、gmtime(time+7200)でいいような気が...
078577704/07/06 10:53ID:???
$mday -= $a[$mon];
のところは
$mday -= $a[$mon] -1;
だった。
078677704/07/06 10:56ID:???
>>784
うおーーーーーーーーーーーーーーーーーーーーーーー!?
0787nobodyさん04/07/06 12:22ID:???
重くしたくないと言って無駄なコードを書くやつは(ry
0788nobodyさん04/07/06 13:40ID:DU8HZvls
list.txt
abc:123
aiu:456

1.
open(IN, "list.txt");
while (<IN>) { print; }
close(IN);

2.
open(IN, "list.txt");
while (<IN>) {
$tmp = <IN>;
print "$tmp<br>\n";
}
close(IN)


1.だと abc:123 aiu:456 と出力されるのに
2.だと abc:123 としか出力されないのはどうしてでしょうか、、?
0789nobodyさん04/07/06 13:51ID:???
>>788
aiu:456だけ表示されるというのならわかるんだけどなぁ。abc:123だけ表示される
のはかなり不思議だ。
0790nobodyさん04/07/06 13:51ID:???
>>788
もう一回勉強して来い
0791nobodyさん04/07/06 13:57ID:DU8HZvls
>>789
すいません、aiu:456 としか出力されない の間違いでした・・・
0792nobodyさん04/07/06 15:02ID:DU8HZvls
色々調べたのですが、何が駄目なのか良くわからないのですが、、、

open(IN, "list.txt");
while (<IN>) { 処理 }

データを1行単位で読み込み、データのある行が存在する間は while文で繰り返す
という意味ではないのでしょうか、、、?
0793nobodyさん04/07/06 15:11ID:???
while (<IN>) { # ここで list.txt の一行目が読み込まれる
$tmp = <IN>; # ここで list.txt の二行目が読み込まれる
print "$tmp<br>\n" # 当然 $tmp の中には二行目しか入っていない
0794nobodyさん04/07/06 15:37ID:DU8HZvls
そうだったのですか!!
<IN>で取得したものは$_ に代入されるのですね。
本当に助かりました。有難うございます。
0795nobodyさん04/07/06 15:44ID:???
>>794
# 何だか表現が微妙に気になる…。

1: abc:123
2: aiu:456
3: abc:123
4: aiu:456
5: abc:123

ファイルの中身をこの5行にして、実験してみるのもいいかも。
0796nobodyさん04/07/06 15:49ID:???
重ね重ね有難うございます。
早速100行くらいにして試しています。
0797nobodyさん04/07/06 18:37ID:???
$tmp .= $_;
っでねが?
0798nobodyさん04/07/06 19:05ID:???
>>797
大丈夫か?(w
0799nobodyさん04/07/07 00:38ID:???
>>798
ループ抜けてからプリント。
0800nobodyさん04/07/07 03:31ID:???
>>799
何の為だ?
0801nobodyさん04/07/07 03:43ID:Dj0xztEm
非常に初歩的な質問なのですが、
受け取った変数を自動的に
別ファイルへ渡す処理はどうやってすればいいのでしょうか?
(フォームを使えば変数を渡せるけど、
自動的には不可能ですよね?)

ヒントでもいいので教えてくだせえ
0802nobodyさん04/07/07 05:27ID:???
>>801
あとはサーバー側のファイルに記録するくらいじゃないだろうか。
phpならその「自動的」ってのに近いと思う。
0803nobodyさん04/07/07 11:11ID:???
cgiで受け取ったパラメータをハッシュで取り出したいんですが、
use CGI;
$q = CGI->new;
$hash = $q->Vars;
print $hash;
としたら
HASH(0x8158408)と表示されます。
%hash = $q->Vars;
だとeachなどを使ってもキーなどが出てきません。
色々と検索をするのですが、どうして良いものか解からなくなってきたので
どなたか良い方法を教えて下さい。

いちおう、下記のサイトは見たのですが上手く目的のことができませんでした。

簡単なCGI
http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm#FETCHING_A_LIST_OF_KEYWORDS_FROM
080480304/07/07 11:20ID:???
すみません。
自分で色々と勘違いをしていました。
自己解決しました。
0805nobodyさん04/07/07 12:12ID:lnfuZW7X
ある関数の中で require でファイルを取り込んでから
その関数を抜けたときって
require したファイルの内容は有効なんでしょうか?
0806nobodyさん04/07/07 12:37ID:???
>>805
有効。
何故試してみない?
0807nobodyさん04/07/07 15:17ID:???
>>798
頭大丈夫か?
0808nobodyさん04/07/07 16:04ID:???
>>807
797は明らかに間違ってるだろ?バカか?
0809nobodyさん04/07/07 16:32ID:???
list.txt
1: abc:123
2: aiu:456
3: abc:123
4: aiu:456
5: abc:123


open(IN, "list.txt");
while (<IN>) {
$tmp .= $_;
}
print "$tmp\n";
0810nobodyさん04/07/07 16:44ID:???
>>808
痛いからもういいよ
0811nobodyさん04/07/07 16:46ID:???
>>809

open(IN, "list.txt");
while ($tmp = <IN>) {
print "$tmp<br>\n";
}
close(IN)

暗黙の$_使うか明示的に一時変数$tmpを使うか、だけの違いだろ。

>>808
間違ってるよね
0812nobodyさん04/07/07 16:52ID:???
>>811
馴れ合うな、キモイ
お前は解答さえしてればいんだよカス
■ このスレッドは過去ログ倉庫に格納されています