Perlコーディング初心 ..
[2ch|▼Menu]
63:nobodyさん
07/09/21 14:07:32
>>60
scriptタグのsrcでアクセスさせる。JavaScript。

64:nobodyさん
07/09/21 20:24:02 yGE03KVM
winXPsp2とactive perlでローカルテストをする時の質問なのですが、
例えば print 1; という命令のあるplファイルをダブルクリックしても1が表示されません。
いや正確には一瞬何かが出てきてるっぽいんですが、閉じるの早すぎです。

コマンドプロンプトから実効命令をするとprint先がコマンドプロンプトに来るので、
勝手に閉じることはないようですが。
いちいちコマンドプロンプトやらずに簡単なコードテストの時はダブルクリックで済ませたいのですが
方法ありましたら教えてください。

65:nobodyさん
07/09/21 20:46:57
>>64
END{<STDIN>}
とか書いとけば。

66:64
07/09/21 21:00:38 yGE03KVM
>>65
ありがとうございます。
うまく出ました^^
endって一体なんなのですか?

perlの説明サイトとかで関数調べてendありませんし。
最後にやるってことですか?
となると<STDIN>が閉じさせない命令の本体になるんでしょうか?
どういう理屈なんでしょうjか。


67:nobodyさん
07/09/21 22:37:24
>>66
URLリンク(perldoc.jp)
perlmodのBEGIN, CHECK, INIT and END BEGIN CHECK INIT ENDのところ。

プログラムの終了するところで、
<STDIN>で、コンソールの入力待ちをしてる。

68:64
07/09/21 23:02:02 yGE03KVM
>>67
コンソール???あの黒い画面のことかな。
で、試しに適当に打ち込んだら本当に入力できました。
最後にenterを押したら画面が消えました。
perlの方にはしっかりとその内容が送られてるんですかね?

試しに
my @array = <STDIN>;
print $array[0];

としてみましたが、今度はenterを何度押しても画面が閉じません。
配列に入れてるから無限に取るっぽいですね。
my $scalar = <STDIN>;
print $scalar;
END{<STDIN>}
としたらうまくいきました。

任意の内容を入力してenterした瞬間に制御が一瞬コードに行ってprint $scalar;が実行されました。
ローカルでやるときはこうやって引数を取るというのも面白いですね。
物凄い面白いことを教えていただいて感謝です。


69:nobodyさん
07/09/22 13:27:49
質問です。
Class::DBI使ってDB操作する場合、二つのレコード間で主キー以外のデータを交換するには
どのように書いたらいいですか?

70:nobodyさん
07/09/22 15:58:05
#! /usr/local/bin/perl

print "content-type:text/html\n\n";

print "<html>\n";
print "<head><title>タイトル</title></head>\n";
print "<body>\n";
print "<h2>テスト</h2>\n";
print "</body>\n";
print "</html>\n";


↑これでInternal server error 500になる。
ただしレンタルサーバー上ではエラーだが、
自分のパソコンでやったらちゃんと表示される。

ソースにもし間違いがあったら
場所と対処法を具体的に指摘しろ。

71:nobodyさん
07/09/22 17:15:55
>>70
態度でかいぞ。
そんなやつには教えてやらん。



#! と /usr の間に半角スペースが入ってるのが問題とか言わん。


72:nobodyさん
07/09/22 17:44:10
>>68
和んだ、俺も10年くらい前Cやった時そんなだった。

73:69
07/09/22 19:54:58
すみません。解決しました。

74:nobodyさん
07/09/22 21:34:17
>>70
パーミッションはちゃんとやってあるのか?
とりあえず雑魚が粋がるのはやめておけ。

75:nobodyさん
07/09/22 22:09:17 VEv2R0s3
スレリンク(php板:369-372番) から来ました。

URLリンク(ws.strikeiron.com)
このサービスを SOAP::Lite から使いたいんですが、ドキュメントのWSDL関連部分を読んでも
  use SOAP::Lite;
  print SOAP::Lite
    -> service('URLリンク(www.xmethods.net)')
    -> getQuote('MSFT');
としか書いてません。
WSDLを見てみると、GetStockQuotesメソッド(オペレーション?)のパラメタとして
QuoteTicker(MSFTとかの文字列)だけでなく、オブジェクト構造みたいなのを組んで
メアドなども渡さないといけないようなんですが、どう書けばいいんでしょうか。

76:75
07/09/22 22:43:31
URLリンク(guide.soaplite.com)(wsdl)
> SOAP::Liteでは今のところWSDL 1.1のサポートは限定されているが〔中略〕、
> 複雑な型(types)を記述に含まないサービスにはアクセス可能だ。

と書いてあるので、無理なのかもしれませんね・・・

77:75
07/09/23 03:01:09
やっと自己解決・・・
URLリンク(wsparam.strikeiron.com)
という、もっと単純なWSDLを使用。
URLリンク(www.strikeiron.com)
ここの下のほうにPerlのサンプルが(も)置いてあるので、それを改造。
わかりやすいのでSOAP初心者にはおすすめかも。

78:nobodyさん
07/09/23 03:53:09
>>74
なぁーんてこった!
cgiファイルのパーミッションを
755にしたらそれで動いたぜ
そんなこと教科書には
どこにも一言も書いてなかった!
ローカルで動かす教科書だからかな?
サノバビーィーーーッチ!

それでパーミッションが500でも
動くのはなんでだ?

79:nobodyさん
07/09/23 05:27:46
それくらいググれカス

80:nobodyさん
07/09/23 06:45:28
やはりWebProg板はレベルが低いな。最高。

81:nobodyさん
07/09/23 06:53:38
だって初心者スレだもん。いいじゃない。

なんか、すごくレベルの高い質問が最近多すぎな気がする。俺のレベルが低いだけなんだろうけどw
Webprogなんだから、動けばいいじゃない的な考えがイクナイ?

82:nobodyさん
07/09/23 07:50:40
if ( $hoge =~ /$moge/ ){ print "もげら" }
って感じで書いて$mogeが展開されてくれないみたいなんだけど、
特別な書き方があるのかな。
ぐぐったけど正規表現ばかりで、変数をつかってる例が全然見つからなかったんだけど、
こういう記述方法自体があまり一般的じゃなくて、他の書き方があるのかな。

教えてちゃぶだい。

83:nobodyさん
07/09/23 08:00:28
>>82
$mogeの中には何が入ってるの?
2バイト文字関係とか、文字コードでこけてる可能性もありそう。

84:nobodyさん
07/09/23 11:07:04
>>82
変数使うときはquotemeta()くらいはかましときなはれ。

85:nobodyさん
07/09/23 14:57:13
サンクス!
quotemetaでいけたよ。

1)index($hoge, $moge) でもやったけどダメ
2)auotemeta() してみた
3)$hoge =~ /$moge/ で成功!
4)でもなぜかそれ+ index($hoge, $moge) じゃダメ

って感じだった。
中に入ってるのはどちらもEUCの2バイト文字列なんだけど、
なぜか$mogeが空の文字列として扱われてしまってるっぽい動作だった。
print $hoge.$moge;とかで出力するとちゃんと出力されるんだけどね。
良く分からないけどとりあえず解決はしてよかった。
ありがとう。

86:nobodyさん
07/09/25 00:47:19 XOfpdsF8
はじめまして。

use strict;
use diagnostics;

という宣言をした状態で、

Name "html::copyright" used only once: possible typo at bbs.cgi line 554 (#1)

というwarningが出ました。

html::copyrightは、htmlモジュール で、
$copyright = 'hogehoge ';
などというように、宣言されています。
warnings は、他のモジュールの変数は見てくれないのでしょうか?

実は、html::copyright 以外にも数十個でていて、紛らわしいことこの上ないです。
(他のwarningにも混じってしまい、識別が困難です)
このwarningをつぶしたいのですが、何とかする方法はないでしょうか?


87:nobodyさん
07/09/25 00:49:11 XOfpdsF8
x 実は、html::copyright 以外にも数十個でていて、紛らわしいことこの上ないです。
o 実は、html::copyright 以外にも used only once: possible typo が、数十個でていて、紛らわしいことこの上ないです。

used only once: possible typo・・・
は、意味は、わかっておりまして、
一度しか使ってないので、ミスじゃない?ってことなのですが、
実際には、ちゃんと、htmlモジュールで代入してから、mainで参照しているのに・・・ということです。

88:nobodyさん
07/09/25 03:43:51
>>87
Use of uninitialized value
が続かないなら、理由が分からない。
一度ourで宣言してみたらどうなる?

89:86
07/09/25 17:25:00 XOfpdsF8
試しに、最小限のコードを書いてみたら、
-----test_pm.pm-------
package test_pm;
use strict;
use warnings;

our $hoge = "test foo bar";
1;
-----main.pl---------
use strict;
use warnings;

use test_pm;
print $test_pm::test;
-------------------

> perl main.pl
Name "test_pm::test" used only once: possible typo at main.pl line 5.
Use of uninitialized value in print at main.pl line 5.

ちゃんと、Use of uninitialized value でて、実行不能でした orz
ourでも、myでも同じでした

>>86は、CGIなんですが、なんで、ちゃんと動いているんだろ・・・
もうちょっと解析してみます。

90:86
07/09/25 17:28:00 XOfpdsF8
x print $test_pm::test;
o print $test_pm::hoge;

スペルミス。
これでも同じ結果です。

91:nobodyさん
07/09/25 21:26:37 o7XeBw4v
先日このスレで
END{<STDIN>}
を教えてもらったものです。その節はありがとうございました。

ローカルチェックをする時に、ダブルクリックだけでいいという大変便利なものなのですが、
エラーが出てるときに一瞬で画面が閉じてしまうのです。

ちなみにその時のエラーはuse strictによるmy使え先刻でした。
途中でエラー中断してるのでEND{}まで行かないのは至極当然な話ですが、
エラーの時はエラー内容をSTDINに出力させりょうと思うと大変なことになりますか?

エラーにも色々あるので難しいかもしれませんが、用はコマンドプロンプト画面に出ることを
代わりにそのままSTDINに出力してもらえばいいわけなのですが。

92:nobodyさん
07/09/25 21:28:39
>>89
CGIってことはサバにあるわけだ。
つまり君がローカルで試してるファイルとは違うファイルが動いてる可能性もあるわけね。

93:nobodyさん
07/09/25 21:36:47
>>91
コンソールを開いておけない余程の事情でもあるの?

94:91
07/09/25 22:20:58 o7XeBw4v
>>93
いえ、単純にちょっとしたコードテストをしたいときにわざわざ
1.コマンドプロンプト画面を開いて
2.ファイルがあるフォルダを開いて
3.黒画面にファイルをD&Dしてenter

という手順を踏むのが面倒だといつも思っていたのです。
1.ファイルをダブルクリックする
これだけで済むなら最高です。

意外に大きな差かなって思いまして。
黒画面へのエラー内容出力ってどういう仕組みで行ってるんでしょうか?
きっとperlの方から出してるんだと思いますが、その出し先をSTDINに変えればできるのでは?
とか思ったり。

95:nobodyさん
07/09/25 22:46:42
>>94
同じファイル?ならコンソール開きっぱなしで1回目だけ「perl スクリプト名」で実行しておけば連続テストは↑+Enterで済む。
慣れにもよるけど多分ダブルクリックより速く操作できる

エラーはSTDERRに出力される。
誤解しているようだけどSTDINは標準入力であって出力ではない。標準出力はSTDOUT

96:91
07/09/26 00:17:27 zmZEFb0X
>>95
2回目以降は確かに楽なんですけど。
STDERRに出力されてるので、END{<STDIN>}で出る入力受付画面には出力されない?
STDOUTへの分はきちんと表示されますし。

STDERRの取得方法があるのでしょうか?

97:nobodyさん
07/09/26 00:27:31
>>89
これ、ActivePerl 5.8.8.822で普通にtest foo barと表示された
ダメ出しも無し

98:nobodyさん
07/09/26 00:37:06
>>96
ラクダ本より
>内部的に発生する例外によって終了する場合でも、ENDサブルーチンは呼び出される(ただし、シグナルによって撃沈された場合は除く)
とあるようにENDそのものが実行されない。自分で(できれば)トラップする必要がある。これはsigtrapを使えばよい。

…が、それくらいなら最初からコンソールから使うことを強く勧める。元々ダブルクリックで起動するようには設計されてないし。

99:nobodyさん
07/09/26 00:41:02
>>91
echo off
perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
pause

みたいなバッチファイル作って、,plに関連付けして置くぐらいかなぁ。

統合型開発環境(みたいなエディタ)を使うと、その場で実行して、
その場で結果表示できたりするので、そういうの使うと便利だよ。

100:nobodyさん
07/09/26 00:56:23
しまった。
> perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9

> perl %1 %2 %3 %4 %5 %6 %7 %8 %9
だた。

101:101
07/09/26 02:22:27
型グロブというものについて
教科書を今日読んで理解したので
型グロブについて誰か質問してください。
説明します。

102:nobodyさん
07/09/26 05:15:12
型グロブをうまいこと使っているモジュールを列挙してください。

103:nobodyさん
07/09/26 13:38:32
>>99-100 perl %*

104:nobodyさん
07/09/26 17:01:12
>>101
ありがとうございます!
スカラー変数
配列変数
リスト
ハッシュ変数?
それらのリファレンスなど

上記との違いを説明してください。
そして何の為にグロブがあるのですか?
僕は素人なのでまだ使うべきところに出会っていません。
いや使えてたらもっと簡単につくれてたのかもしれません。

105:nobodyさん
07/09/26 18:35:06
ビウログってなんですか?

106:nobodyさん
07/09/27 02:15:46 rW8f5K4d
質問です。

if($Fm{'form'}){  処理  } #フォームに何か入力されていれば処理

上記の場合
フォームに0と入力した場合もスルーされてしまいます。
認識させるにはどのような書き方になるのでしょうか。

if分の前に
$Fm{''form'}=sprintf( "%c", $Fm{''form'} );
のように文字列にするという方法を思いついたのですが、ちょっとスマートじゃないなと思っています。
よろしくおねがいします。

107:nobodyさん
07/09/27 02:23:35
if($Fm{'form'} ne ""){  処理  }

108:nobodyさん
07/09/27 02:35:47
>>107
素早い回答ありがとうございます。
その手がありましたか。目からうろこでした。
ありがとうございます!

109:nobodyさん
07/09/27 03:41:52
length とかも

110:nobodyさん
07/09/27 06:29:35
1000:1234:abcd:2000::/120のような省略されたIPv6のアドレスを展開して
リストに格納したいのですが、プレフィックス長(=120)に応じて
展開する部分が一部不完全なので教えてください。
下のコードだと、下4桁の連番生成しかできない上に、プレフィックス長が4の倍数でない場合にうまくいきません。
これを4の倍数でなくても&下4桁以上もちゃんと展開できるようにしたいのですが…。
たとえば、1000:1234:abcd:2000::/127であれば、
1000:1234:abcd:2000:0000:0000:0000:0000
1000:1234:abcd:2000:0000:0000:0000:0001
の二つが出来てほしいのです。
できれば10進数で連番作ったものを16進数変換してる部分もなんとかしたいんですけど…。

sub _Gen{
  my ($addr, $pref) = split(m|/|, $_[0]);
  $addr = &_Format($addr); # ここで省略のない32桁の英数字を4桁ごとに:で区切ったものになる
  $addr =~ s/://g;
  if($pref % 4 != 0 || $pref < 112 || $pref > 128){
    return;
  }elsif($pref == 128){
    1 while $addr =~ s/(\w+)(\w\w\w\w)/$1:$2/;
    return $addr;
  }
  my $fixed = substr($addr, 0, $pref / 4);
  my $keta = (128 - $pref) / 4;
  my (@addrs, $tmp);
  for(my $i=0; $i<16**$keta; $i++){
    $tmp = sprintf("$fixed%0${keta}x", $i);
    1 while $tmp =~ s/(\w+)(\w\w\w\w)/$1:$2/;
    push(@addrs, $tmp);
  }
  return @addrs;
}

111:nobodyさん
07/09/27 06:34:39
defined 常考

112:101
07/09/27 09:02:14
型グロブについて。

スカラー変数
アレイ
ハッシュ(連想配列)

この3つを同時に
扱うために、型グロブは
生まれてきたのです。

113:101
07/09/27 09:04:34
例えば

$a ←これはスカラー変数
@a ←これはアレイ(配列)
%a ← これはハッシュ(連想配列)

aの左側についてる記号は
$だったり
@だったり
%だったりとそれぞれ違うが
記号の右側はaで全部統一されている。

このとき

「aの型グロブ!」
と宣言すれば、

$a @a %a

この3つを全部同時に扱うことができる。
これが型グロブ。

114:nobodyさん
07/09/27 09:14:21
こいつはOmotiとかタクトくせぇ

115:101
07/09/27 09:59:46
つまり
4年1組と
4年2組と
4年3組が
いたとして、

「4年生全員集合!」
と言うと、4年生が全員集まってくるのです
これが型グロブです。

116:nobodyさん
07/09/27 11:04:43
全員集まってくることがどういうことか(メリットなど)
を語らないと通じないでしょ
肝心な部分が抜けてるポ^^

117:nobodyさん
07/09/27 13:26:43
どっちも4年生なら配列かハッシュ使えば済むでしょ
どっちかというと「全学年の1組集合」の方が近いのではないかと。

118:nobodyさん
07/09/27 13:32:25
その例なら多重配列使いたいからそれもちょっと…

119:118
07/09/27 13:33:29
ごめん勘違いしてた

120:nobodyさん
07/09/27 13:34:07
この聞いてjも居ないのに延々と騙ろうとするのはタクトに違いない。

121:nobodyさん
07/09/27 13:58:24
ねぇねぇ
なんでおじちゃんたち
DBが全部やってくれることを一生懸命書いてるの?

122:nobodyさん
07/09/27 14:53:03
DB使ってないしぃ

123:nobodyさん
07/09/27 15:13:12
DB使わない理由って やっぱサーバーにないから?
それとも手をつけたことがない?
後者なら絶対覚えたほうがいいよ。
生産効率が全然ちがうよ

124:nobodyさん
07/09/27 16:59:17
>>110
これじゃだめなん?

use Net::CIDR;

print join("\n", Net::CIDR::cidr2octets("1000:1234:abcd:2000::/127"));

125:nobodyさん
07/09/27 17:11:50
わざわざDB使うほどの事してないしぃ
ゴミ箱にごみを捨てるのは、わざわざ執事雇って呼んで捨てさせる程の事じゃないしぃ

126:nobodyさん
07/09/27 19:38:27
>>124
うああああ、助かった
こんな便利なものがあるなんて!
ありがとう〜!

127:nobodyさん
07/09/27 20:05:25 fs1IYXrA
色々なPerlがあるようですが、
rand ≠ rand(1)
となるものはあるのでしょうか?ちなみに自分のactiveperl fow win32 5.8は
rand == rand(1)
になっていると思います。
サバによって違うなら面倒でもrand(1)としといたほうが無難なのでしょうか?

それと演算子の優先順位をわかりやすい表にしてるところ知っていたら教えてくださいませm(__)m

last if 1-rand(1) <= 0.3;
こういうの書く時
last if ( (1-rand(1)) <= 0.3);
とすれば確実ですが、地味に面倒で意外と見づらいです。

128:nobodyさん
07/09/27 20:36:42
同じだよ
その手の仕様をプラットフォームによって違うようにする必要性がないし

129: ◆TWARamEjuA
07/09/27 20:40:25 BE:2178645-2BP(6825)
URLリンク(perldoc.perl.org)
とか。。。

130:127
07/09/27 20:54:10 fs1IYXrA
>>128
そうですよね。まあでも括弧を外すなら結局rand(1)としないとしつこく引数にとられてしまいますね。
>>129
英語のページですか・・・
僕の学力の低さを見透かしたような皮肉orz

バカにでもわかる一覧表的なページはないということでFA?

131:nobodyさん
07/09/27 21:18:44
unless (0 and 1){
print 1;
}

1と表示されます。unlessは条件式が偽を出してくる時にブロックを実行するのですよね?
0 and 1なら片方が真を出すのでブロック実行されないと思ったのですが。
複数の条件式が全て偽を出した時にだけブロック実行をさせたいのです。

回答宜しくお願いいたします。

132:131
07/09/27 21:22:38
ちなみにこれをifでやるとさらにおかしなことになります。

if (1 and 0){
print 1;
}

これです。何も表示されません。先ほどのunlessとの整合性がつきません。
ifによる条件式部分ではちゃんと二つ共が真の時だけ実行されるのに、
unlessの場合は片方が偽を出せば実行されます。

もしかして
真 and 偽
は最終的に偽扱いされるのですか?

133:nobodyさん
07/09/27 21:28:31
>>132
>もしかして
>真 and 偽
>は最終的に偽扱いされるのですか?
そう。当たり前。

134:nobodyさん
07/09/27 21:28:52
(0 and 1) は(「偽」かつ「真」)だからそんなの成り立たない
(「真」かつ「真」)なら結果「真」と評価できる
つまり、(0 and 1)は常に「偽」と評価される
だから unless (偽) は常にそのブロック内が実行される

135:131
07/09/27 21:46:53
なるほどです。
やはりちょっと違いますねunlessは。
ifのfalse版みたいに思うと微妙にやられますね。

全然関係ない話ですが、Perlには資格ってあるのですか?
書道3段とか簿記3級みたいに客観的にPerlにおけるプログラミング力を第3者に示すもの。
頑張って勉強してそのうちバイトでプログラムの仕事取ってみたいですが、
その時にそういう資格的なものがあるなら売り込みやすいなと思いまして。

本当に関係ない話ですいません。

136:nobodyさん
07/09/27 21:59:00
>>130
URLリンク(perldoc.jp)

137:127
07/09/27 22:08:14 fs1IYXrA
>>136
日本語のページありがとうございます。
見てきますm(__)m

138:nobodyさん
07/09/27 22:39:59
perlの仕事なんか無いよ

139:nobodyさん
07/09/27 22:51:34
>>135
記号論理をやれば当然のことで、それを理解していればifの否定版と考えて問題は起きない

140:nobodyさん
07/09/28 00:24:10
スカラー変数と配列変数をいっぺんに作りたいです。
my ($s1,$s2............$s20);
my (@r1,@r2............$r20);

全部書くのが面倒な時は簡単な方法はありますか?

141:nobodyさん
07/09/28 00:37:13
コードの先頭でまとめて宣言するってこと?
そんなことすんならuse strict使わない、宣言しないほうがよっぽどいい

142:140
07/09/28 00:42:26
>>141
# 初期化

というところでいっぺんに使う変数を宣言しています。
何故というより癖みたいなものですかね。
それで分析プログラムを作ってたら、やたらと記録や集計用の変数が必要になったんです。
一つ一つまともに名前を考えるのが非効率なのでそこだけ適当な名前にしています。

strcit使いながら賢く宣言できませんか?
無理ならあきらめます。

143:nobodyさん
07/09/28 01:00:34
変数をたくさん使いたいなら代わりにハッシュ使えば一つで済むじゃん

144:nobodyさん
07/09/28 01:01:15
なんだか意味が良くわからないけどハッシュにいれればいいじゃない
キー名を考えるのは同じだけど

145:nobodyさん
07/09/28 03:02:00
>>140
なんか、その変数名だと単に配列と二次元配列の初期化だけですむ気がすんだけど?
my ( @s, @r ) ;
# @s は、オマエさんの ( $s1, $s2, ..... ) を入れる配列
# @r は、オマエさんの ( [@r1], [@r2], .... ) を入れる配列

本当に別々の変数名が必要なのか?
本当に必要ならば上の人たちが言ってる通りハッシュorハッシュリファレンス
使え。

146:nobodyさん
07/09/28 03:04:18
for (1..20) { eval "my(\$s$_ , \@r$_)" }

147:140
07/09/28 06:42:10
>>143-145
ごもっともなんですけど、リファレンスにするとコードが汚くなるんですよね。
いちいちデリファレンスしながらのコードは読みにくいし。
ハッシュも同じです。単なるスカラーと配列変数以上に読みやすいものはないかと。

>>146
それってforブロックの中でローカル化されてませんか?
evalするとローカル化されないとか?

148:nobodyさん
07/09/28 06:53:34
>>147
そのevalに突っ込み入れられる実力があれば、
キミの望んだことは実現出来るよな?

まあ、自分の考えに固執しないで、他の人が普通に「hash使え」って
言ってる意味を考えた方が良いと思うけど。
=> perlでは143-145が普通の感覚だし、たかだか変数の
 宣誓にevalなんぞ使ってたら「変態さんがいるわ&hearts」
 と言われること受けあいだ。
そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?

149:nobodyさん
07/09/28 08:03:45
> 書道3段とか簿記3級みたいに客観的にPerlにおけるプログラミング力を第3者に示すもの。

書道の段位なんて流派ごとに異なるので、客観性があることにできないんと思うよ。
日商簿記2級くらいまでなら試験対策する時間さえあれば能力関係なしにとれるから
持ってたからといってだから何?レベルだよね。


150:nobodyさん
07/09/28 08:31:35
URLリンク(d.hatena.ne.jp)
脳内では、コレが参考になるかもしらんが、
○自己判断のレベルが客観的判断のレベルと一致しない。
○レベル7と8との間にとても深くて暗い河がある。

プログラミングの技量の判断として有名なのはFizzBuzz問題
だが、有名になりすぎて知ってて当たり前。


151:nobodyさん
07/09/28 12:19:13
Lv8かなぁ?Lv9にはなってない気がする。

152:nobodyさん
07/09/28 14:28:43
>>150
ほんと、7と8の間の河が深すぎる。7.5がほしい。
俺はたぶん6か7だけど。

153:nobodyさん
07/09/28 15:13:33
use strictってどういう効果有るの?ググってもよく分からないや

とか思ってる他人のソース弄って何とかしている人がここに一人。

154:nobodyさん
07/09/28 15:43:49
strictやwarningsは融通が利かなくなるので嫌いでちゅわ

155:nobodyさん
07/09/28 15:58:21
いいね、初心者スレらしい。

156:nobodyさん
07/09/28 16:22:17
strictや-wを使って粋がってる自称玄人は笑えるww

157:nobodyさん
07/09/28 16:32:49
無理にstrictやwarings使って本末転倒になってる馬鹿はよく見る

158:nobodyさん
07/09/28 17:27:09
普段から常に使ってるがどういう場面で本末転倒になるんだろう

159:nobodyさん
07/09/28 17:36:03
その昔はグローバル変数をサブルーチンでいじり倒すようなコードがあったけど
スコープ区切って引数と戻り値のやりとりするほうが100万倍読みやすいよ

160:140
07/09/28 18:12:42
>>148
>そのevalに突っ込み入れられる実力があれば、
>キミの望んだことは実現出来るよな?

すいません。もう少し普通の会話がしたいです。

>そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?

このよくある「答は一つ、綺麗でスマート」っていうのはどうにも好かない。

161:nobodyさん
07/09/28 20:40:06
>>160
じゃおまえの好きなようにすれば?

162:nobodyさん
07/09/28 21:25:32
>>140
「Perlはあなたが自分の首を締めるのに十分なロープを
提供しているのだ」てな忠告がラクダ本に載ってたな。

#--- Filter/Range.pm ---
package Filter::Range;
use strict;
use Filter::Simple sub {
  s{
    my \s* \( \s*
    ([\$\@%][A-Z_a-z][0-9A-Z_a-z]*?) ([0-9]+) \.\. ([0-9]+)
    \s* \)
  } {
    'my(' . join(',', map "$1$_", $2 .. $3) . ')'
  }egx;
}; 1;
__END__

#!/usr/local/bin/perl -w
use strict;
use Filter::Range;
my($s1..20) = (1..20);
print $s10;
__END__

163:nobodyさん
07/09/28 21:41:10
Damian Conway ぷろだくとか。

164:nobodyさん
07/09/28 22:27:42 3wKaaJqT
サブルーチンを10個くらい作ってあります。
同じディレクトリに5個くらい違うCGIファイルがあります。
5個のCGIファイル全てに、冒頭の10個のサブルーチンをコピペしてあります。

print routin(1,2);
5個のCGIふぁいるではこういう記述でサブルーチンが使えます。
どうもこれを外部ライブラリ化とかいうのすると
print パッケージ名::routin(1,2);
で使えるようになるとか。

でもパッケージ名を入れるとなると5個のCGIファイル全てを書き直すのが嫌です。
またパッケージ名が入って見た目がウザくなるのも嫌です。

外部ライブラリにしながらも、メインパッケージにあるのと同じごとくサブルーチンを使うにはどうすればいいでしょうか?
メインパッケージに初めに全部もらえばいけるんじゃないかとか妄想していますが。

165:nobodyさん
07/09/28 22:30:18
>>164

>>19読んで応用しろ。キーワードはexporter

166:nobodyさん
07/09/28 22:45:38 3wKaaJqT
orz

167:nobodyさん
07/09/28 23:42:41
べつにExporterなんかいらないだろ
全部plファイルにしてrequireでつなげろ

168:nobodyさん
07/09/28 23:57:57
おれだったらOOPが楽かな

169:nobodyさん
07/09/29 00:02:00
>>167
すげえまじで感動したw
つか、require '....pl' ってperl4時代のモンだと思って使ってもなかったよ。
これからも使わんけどw
もちろんstorableとか使用するときには必須>require

170:nobodyさん
07/09/29 00:04:52
があ、Data::Dumper の読み込み時だ。require 使うのorz...

171:nobodyさん
07/09/29 00:51:07 2KPMiuug
>>167
え?
明日試してみます。

172:nobodyさん
07/09/29 02:58:11
みんなrequire つかわないのかw
おらぁ使いまくりだ
メインCGI一個に 汎用サブルーチンplに処理ブロックごとにpl分割
これが楽でいい。


173:164
07/09/29 06:51:46 2KPMiuug
>>167
できないんですけど・・・・
s.plのpackage s;にサブルーチンを移しました。
で、

print check(1,2,3,4,5);
でエラーでました。メインパッケージにそんな関数ないと。
もちろん
print s::check(1,2,3,4,5);
なら動作します。

どういうことですか?
ウソ付きましたか?

174:nobodyさん
07/09/29 07:14:33
3時間の出来事をシミュレーションするプログラムを書いています。
一応完成したのですが、時間の捉え方が「残り時間」というものになっています。
これを例えば、9時〜12時の間とかで捉えたいのです。

今は内部の処理が進むにつれて「残り時間」の変数を減算して、「残り時間」変数が0になったら処理おしまいというものです。
これを開始時刻と終了時刻を初めに決めて、+10秒とか命令出しながら実際に時間が進んでるかのような感じに
「今何時?」と聞けるくらいの感じに変えてみたいのです。

使えそうなモジュールがあったら教えてください。

175:nobodyさん
07/09/29 07:57:19
>>173
>package s; に移しました。
何故移す?

176:nobodyさん
07/09/29 12:27:00
変数名を参照することって出来ますか?

$test = 'abc';

という変数があるとして、$testの'test'の部分を知りたいのです。
例えば、@a = ($test, $boo, $hoge);
という配列があるとして、
これを それぞれ変数名 => 値 というハッシュに変換したいのです。
$h{'test'} => 'abc'
のように。

177:nobodyさん
07/09/29 13:07:39
>>176
> @a = ($test, $boo, $hoge);
この時点で $a[0] には $test が持つ値 'abc' そのものがコピーされて入る。
よって代入後に @a 内の各値からコピー元の変数名を辿る事はできない。

178:nobodyさん
07/09/29 21:46:18 m5gmrcyE
文字コードをUTF-8に変換したいのですが

use Jcode;
$str = "あああ";
print Jcode->new($str)->utf8;

とすると
Undefined subroutine &Jcode::_Classic::euc_utf8 called at パス/Jcode/_Classic.pm line 255.
というエラーが発生してしまいます。

ちょっと調べたらJcodeのバージョンを下げれとありましたがそれは無理なので何か他に方法はないでしょうか。

179:nobodyさん
07/09/30 02:32:26
未だにJcodeが使われるのは子飼弾がちゃんとEncodeの使い方を解説しないからなのか・・・

180:nobodyさん
07/09/30 04:35:03
>>178

使っているPerlのバージョンは?
Jcodeはどのようにインストールしたもの?

>>179
Web関連のムックで書いてなかったか? >Enocdeの使い方



181:164
07/09/30 08:09:20 9pVP3h63
>>175
そりゃ中身なにもないものをrequireしてもしょうがないからですよ。
一体何が間違ってるというんですか?

メインパッケージにないものをrequireを使えば
routin(1,2,3);
で呼べるというのは本当なんですか?ウソなんですか?

182:nobodyさん
07/09/30 08:18:04
ほらね、strictとwarningsを無理に使うと本末転倒になるでしょ。

183:nobodyさん
07/09/30 08:34:17
>>181
誰もウソなんかついちゃいない。
お前が全然理解できてないだけ。

184:164
07/09/30 08:40:27 9pVP3h63
>>183
だから何をどうしろというんですか?
最小コードを教えてください。


185:nobodyさん
07/09/30 08:49:27
>>182
181の事を示して言ってるならwarningsもstrictも無関係にエラー出るぞ。
176はそう言う次元のお話しではないし、
178は、my宣言してないからwarningsとか宣言してないと見るが?

別にstrict,warningsを嫌うのは勝手だけど、事象は切り分けてくれ。
ここは初心者スレで勝手に脳内変換して>>182を信じてしまう人が
いる可能性もあるんだから。




186:nobodyさん
07/09/30 08:59:25
>>184
うざいなあ、ここで文句垂れてる間にググればとっくに exporter の使い方も
習得出来てるだろうに

% cat foo.pl
sub foo{ 1 ; }
1;
% perl -le 'require q{foo.pl} ; print foo()'
1


187:nobodyさん
07/09/30 09:40:39
>>185
ああごめん。mod_perlと混同して勘違いしてた。
Perlが初めての方なら尚更strict/warningsは
ややこしくなるから不必要だと思うけど。

188:164
07/09/30 10:10:19 9pVP3h63
>>186
突っ込みが下手すぎ。
package使うなって言って欲しかった。

189:nobodyさん
07/09/30 10:12:50
>>188
くだらない質問でもど偉そうに聞いていいスレ
スレリンク(php板)

190:164
07/09/30 11:09:19 9pVP3h63
もしもお前に部下がいるなら可哀想だ。
まだ使う側でないというなら、今のうちに間違いを指摘してきた相手が目下だと反省のできない上司にならないよう気をつけておけ。


191:nobodyさん
07/09/30 12:11:48
>>188
「最小コードを書け」
って言われたから書いたまでだが?
>>175で package に関する点は指摘されてるだろ

>>187
mod_perl の mod の字も出てないのに…


192:nobodyさん
07/09/30 12:51:11
自分の読解力、理解力の無さを棚に
上げて回答者を批判する男の人って…

193:164
07/09/30 14:35:18 9pVP3h63
>>191
>>175のどこがpackageに関する点の指摘なのよ。
あれじゃサブルーチンを別ファイルに移した事の指摘だろ。

>>192
女ならいいのか?クソフェミニストめ。

194:nobodyさん
07/09/30 15:37:17
質問してもよろしいでしょうか?
すみませんが宜しくお願いいたします。

特定の契機を迎えたとき?
@_や$_には値が自動でセットされるようになっていますよね?
その契機の一覧みたいなものが知りたいのですが、膨大ですか?
うまくまとめてるサイトあれば教えてください。

195:nobodyさん
07/09/30 15:38:11
やはり読解力の欠片も無いな

196:nobodyさん
07/09/30 15:44:41
>>194
URLリンク(search.cpan.org)
URLリンク(perldoc.jp)
ラクダ本

197:nobodyさん
07/09/30 16:14:26
>>179
5.005とか5.6と互換を取るのに便利だったりする。
(5.005は古いバージョン使ってたり、変換規則が違ったりするけど。)

それはともかく、チュートリアルをpodで欲しいとか思うよね。
unicodeのチュートリアルとか、あっちこっちにドキュメントが散らばってて、
しかも、翻訳も無かったりして、初心者にはきついと思う。

198:nobodyさん
07/09/30 23:01:50
コーディングではないけれどPerl関連(Windows関連?)ということでお願いします。
PerlのパスをUNIX風に設定しておくことってできますか?(usr/bin/perl)
今は5.8なんですが、前に5.6の頃、実際のパスがc:\perlだとしても
この書き方(パス)で動いてた気がするんだけど・・・

199:nobodyさん
07/10/01 00:24:00
5.8でも動く件

200:198
07/10/01 01:04:55
>>199
すんません、ブラウザでCGIとして起動した場合はどうですか?
関連に気づかなくて書かなかったんですが、
こちらでもプロンプトでは動くんだけど、ブラウザではアウトです。

201:nobodyさん
07/10/01 01:27:53
普通にpath通せばいいんじゃね?

202:nobodyさん
07/10/01 02:12:06
それはPerlじゃなく各々のhttpdの管轄
なので他の適切なスレを当たって下さい

203:198
07/10/01 02:14:31
>>201
ありトゥース!・・・が、しかし。。
恥をしのんでお尋ねしますが、パス通すって・・?
Windowsの環境変数にusr/bin/perlを追記するってことではないですよね。
い、いかように・・・

204:nobodyさん
07/10/01 07:19:52
関連付けでおk。

205:nobodyさん
07/10/01 09:49:39 4GodVsb7
>>180
レス遅くなってすみません。
JcodeやめてEnocdeで対応させました。

perlのバージョンは5.8、Jcodeは最初サーバーには入っていなかったので
自前で自分のディレクトリにインストールして使ってました。
それで問題なかったのですが最近サーバの方が用意してくれたらしく
そっちを読み込むようになってました。
そのサーバにインストールされた新しいJcodeで問題が発生していたと言う次第でした。
しかし新しいJcodeはなんであんなとんでもないバグを持ってるんだろうか。
UTF-8変換できなきゃJCodeの存在意義が無くなるのに。

206:nobodyさん
07/10/01 10:32:27
>>203
環境変数にperl.exeのパスを通せばいい。
もしくは出来るならhttpdの方で指定するとか。

207:nobodyさん
07/10/02 00:21:38
>>203
かなり無理やりな解決方法。

C:\直下にusrを作って、そこへC:\Perl\bin\(Enter連打でinstした場合)をフォルダごとコピー。
でC:\Perl\lib\とC:\Perl\site\もフォルダごとコピー。
これでC:\usr\直下に、binとlibとsiteができる。
それでcgiファイルの頭に
#!/usr/bin/perlでOK。

でも、ppmや、自前でモジュールインストールする度に、本来のC:\Perl\以下よりlibやsiteをコピー
しなければならないし、UpgradeやUninstallの時も当然ながら消してはくれません。
普通の人にはお勧めできない。

実を言うと、C:\直下にusrやtmpやvarなんかを作ってると、perlスクリプトの中からフルパスで
/var/tmp/〜とかやってファイル操作したりするのに、Unix環境といちいち書き換えなくて済むっちゅう
横着ができたりします。

208:nobodyさん
07/10/02 00:40:37
activeperlで>207の方法をやるなら、perldoc reloc_perlを見ると幸せになれるかもしれない。

209:nobodyさん
07/10/02 01:54:23
質問です。
LWP::UserAgentとCrypt::SSLeayを利用して、SSLでサーバと通信を行っています。
相手先の証明書が、期限切れなど信頼できない場合は、以降の処理を打ち切りたいのですが、
それを判別するにはどうすればよいですか?

210:nobodyさん
07/10/02 02:05:01
LWP::Protocol::httpsにヒントがあるかもね

211:180
07/10/02 02:34:16
>>205
ん、別に少し間が開いたくらいは気にせんからいいよ。

ただ、サーバー管理者が入れたのがおかしいってのは変だね。
症状からすると、(わざわざ)pure perl のコードを選択したときのバグっぽいけど
これって fix されたんじゃなかったっけか?

それにPerl本体が 5.8なら Encodeを利用する形でJcodeは入るはずだしなあ。


212:nobodyさん
07/10/02 06:25:36 SbhRpQr+
レン鯖に特定のモジュールがインスコされてるかどうか
テストするのに良い方法はないでしょうか?

213:nobodyさん
07/10/02 07:23:13
@INCを総当たり

214:nobodyさん
07/10/02 08:34:43
>>211
原因を特定できないのなら黙っておけ。

215:nobodyさん
07/10/02 09:25:29
>>212
実際に use して調べるのが一番確実。

#!/usr/bin/perl -w
use strict qw(subs vars);
my $token = qr/[A-Z_a-z][0-9A-Z_a-z]*/;
my $module = ($ARGV[0] || '') =~ /^($token(?:::$token)*)\z/ ? $1 : '';
my $result = $module ? eval "use $module" : 'usage: URLリンク(...)';
$result ||= $@ || qq/$module ${"${module}::VERSION"}/;
print "Content-Type: text/plain\n\n$result";
__END__

216:nobodyさん
07/10/02 09:39:01
もう少し可読性を高める努力をしろよ。

217:nobodyさん
07/10/02 10:20:20
>>207
インストールしなおしでその構成になるようにしたほうがいいんじゃ・・・

218:nobodyさん
07/10/02 17:33:08
$^Oが取り得る値のリストってどこかにない?

219:nobodyさん
07/10/02 19:19:35
>>218
URLリンク(search.cpan.org)

220:nobodyさん
07/10/02 20:12:26
>>215
コードまで書いていただいてありがとうございました。
use <モジュール名> をevalして戻り値を確かめるわけですね。
どうもevalは使うのに躊躇してしまうんですが、こういうときは便利ですね。

>>213
@INCの中を覗くという発想も考えたことがなかったので
やってみたいと思います。

221:nobodyさん
07/10/02 21:03:46 2QBdgnfp
日本語変換の問題について質問です。
コードをEUCで書いて、出力をShift_JISで行うのが目的です。

今はjcode.pl使っています。
activeperlのwinxp用でローカルチェックをしています。

JCODEというモジュールもあるそうですが、activeperlには初期状態でなかったりしますよね。
確か自分は入れた覚えもあるのですが。

オススメは何ですか?
確か他にも変換用のモジュール?はあったと思いますが。
euc,shift_jis,jisの3つだけでのオススメが知りたいです。

222:nobodyさん
07/10/02 21:47:16
>>221
万能解は無いので、Encode / Jcode / jcode.pl / Unicode::Japanese を
一通り使い込んでから、好みと用途に合ったものをお選びなさいな。

223:nobodyさん
07/10/02 23:24:50
いまさらjcode.pl薦めるなよ。

224:221
07/10/02 23:41:50 2QBdgnfp
jcode.plを除いて一番汎用的に使えるのはどれですか?
汎用的って言っても、サーバーやローカル環境で一番広く使えるものです。
一番広まってるモジュールといえばいいのですかね。

225:nobodyさん
07/10/03 00:23:34
リストをリストのままリストの個数を得るにはどうすればいいですか?

(1,2,3,4,5)
これを配列にいれずにってことです。
grepとかでもリストが作られますよね。
そういうときにわざわざ配列に入れてから要素数を知るのが面倒です。

scalar(@{[grep{$_>0}]})
っていうのも同じくなんかなぁと思います。
普通にないなら関数作ろうと思うのですが。

226:nobodyさん
07/10/03 00:41:53
scalar(@{[1,2,3,4,5]})

227:nobodyさん
07/10/03 00:41:53
はあ

228:nobodyさん
07/10/03 01:16:44
システムに依存する組み込み関数が使用できるかどうか
手っ取り早く調べる方法ってなにかな?

229:nobodyさん
07/10/03 01:49:55
>>224
インスコしてなかったら自分で読み込むようにすればいいよ。
use libつかうなり同階層に置いてuseするなり。

230:nobodyさん
07/10/03 01:58:30
>>224
Perl 5.8.x なら標準モジュールの Encode が一番広まっていると言えば
広まっている。

>>225
リストコンストラクタが幾つの要素を吐くかは、吐かせてみないと
分からない。吐かせた結果を保存しないのなら、目の前を流れていく
個数を数えるしかない。

sub count { scalar @_ } $num = count((1) x rand 10);
$num = scalar @{[ (1) x rand 10 ]};
$num = 0; ++$num for (1) x rand 10;

>>228
URLリンク(search.cpan.org)
に目を通した上で eval 内で実際に使用して確認。

231:225
07/10/04 00:46:59 kUiVRXqk
>>230
黒魔術みたいなコードはいけないってこのスレで教えてもらいました。
素人ながら納得しました。
ですからあなたもそういうコード書いていてはいけないと思います。
それも教える側でそれを使うと黒魔術が流行ってしまいます。

僕にはあなたのコードが何をしてるのかわかりません。

232:nobodyさん
07/10/04 00:52:08
++$num for (1) x rand 10;
こんな書き方はじめてみたw
7行プログラミングとかに出てきそうだな。
だれか解説というか一般的な形にしてクレクレ


233:nobodyさん
07/10/04 00:57:28
foreach((1) x rand(10)){
++$num;
}

234:nobodyさん
07/10/04 02:06:39
こんなの全然黒魔術じゃないと思うが・・・

235:nobodyさん
07/10/04 03:26:46
中身が1行のfor(もしくはforeach)なんて普通こう書かんか?

↑もう何年もforeachなんて書かずにforで済ませてるからスペル調べちまったw


236:nobodyさん
07/10/04 03:33:49
それは分かりづらい。括弧でくくった方がいいな。
++$num for ((1) x rand 10);

237:nobodyさん
07/10/04 06:44:51
これだからPerlのコードは気持ち悪いんだよな

238:225
07/10/04 07:08:27 kUiVRXqk
((1) x rand(10))
これの意味がわかりません。
1*10とどう違うんですか。
それとforに10とか与える意味も。
0..10ならわかるけど。

239:nobodyさん
07/10/04 08:10:41
このスレは精神障害者ばかりですね。

240:nobodyさん
07/10/04 08:14:34
>>231
その程度の実力で関数を自作するってかw


241:nobodyさん
07/10/04 09:03:58
>>238
ひょっとして

>吐かせた結果を保存しないのなら、目の前を流れていく
>個数を数えるしかない。

の意味がわかってないのか?
お前が一定の個数で決め打ちしたいなら最初からそうすればいいだけ。

242:nobodyさん
07/10/04 09:42:16
>> grepとかでもリストが作られますよね。
>> そういうときにわざわざ配列に入れてから要素数を知るのが面倒です。

grepに限って言えばスカラーコンテキストでは条件が真になる要素数を返すわけだが。

% perl -e 'print scalar(grep { $_ > 0 } 0,1,1,0,1)'
3


243:nobodyさん
07/10/04 09:43:48
x 10ならわかるけどなんでrand(10)なん?
それがいまいちわからんぽ

244:nobodyさん
07/10/04 10:10:16
いつも10だと面白くないと思って乱数にしただけで特に意味はないだろう。
そんなこと気にしてるとハゲるぞ。


245:nobodyさん
07/10/04 10:20:27
>>238
URLリンク(perldoc.jp)
「Multiplicative Operators operator, multiplicative」の項

rand EXPR は 0 以上 EXPR 未満の値を返すので、整数値が欲しい際は
通常 int() を通す。但し perl が整数値を欲しがっている箇所に小数値が
与えられた場合は、自動で整数値に丸められる。

$str = substr('abcd', 0, rand 5); # '', 'a', 'ab', 'abc', 'abcd'
$var = $array[ rand @array ]; # @array 中の要素からランダム選出

x 演算子の右辺は「個数」という整数値を要求しているので、(1) x rand 5
という式は (), (1), (1,1), (1,1,1), (1,1,1,1) のいずれかになる。

>>243
>>241 が指摘してくれているように、最初から個数が分かっているなら
「リストをリストのままリストの個数を得る」必要はなく、$num = 10;
等と書いておけば済む。(1) x rand 10 という式には「要素数が不定で」
「コピペですぐ動作確認できる」リストのサンプルという以上の意味は無い。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4894日前に更新/271 KB
担当:undef