トップページ⇒tech
1001コメント340KB

Perlについての質問箱 29箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/12/21(木) 22:35:39
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

http://www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3

前スレ
Perlについての質問箱 28箱目
http://pc8.2ch.net/test/read.cgi/tech/1162273941/

リンク集は>>2-3
過去スレは>>4
0002デフォルトの名無しさん2006/12/21(木) 22:36:10
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
0003デフォルトの名無しさん2006/12/21(木) 22:36:40
[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさん2006/12/21(木) 22:37:13
[過去スレ]
1 ttp://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 ttp://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 ttp://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 ttp://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 ttp://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 ttp://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 ttp://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 ttp://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 ttp://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 ttp://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 ttp://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 ttp://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 ttp://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 ttp://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 ttp://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 ttp://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 ttp://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 ttp://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 ttp://pc8.2ch.net/test/read.cgi/tech/1131286411/
21 ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 ttp://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 ttp://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 ttp://pc8.2ch.net/test/read.cgi/tech/1146022352/
25 ttp://pc8.2ch.net/test/read.cgi/tech/1149259409/
26 ttp://pc8.2ch.net/test/read.cgi/tech/1153412251/
27 ttp://pc8.2ch.net/test/read.cgi/tech/1157874614/
28 ttp://pc8.2ch.net/test/read.cgi/tech/1162273941/
0005デフォルトの名無しさん2006/12/21(木) 22:38:30
>>1 乙でし
0006 ◆TWARamEjuA NGNG?BRZ(6677)
(´-`).。oO(「埋め」やっているやつは石器時代の人間か?)
0007デフォルトの名無しさん2006/12/21(木) 23:05:10
>>6
現代人なら何するの?
0008デフォルトの名無しさん2006/12/21(木) 23:13:39
ごめんね、おかあさんじょーくでquineかきこんだから、ごめんね

前スレ>>985
一応答えておきましょう。2変数の値の交換。
($x, $y) = ($y, $x)
で$xに$yの値を代入して、$yに元の$xの値を代入

if ($x < $y) { ($x, $y) = ($y, $x) }
で、$xのほうが小さかったら$yと入れ替える。つまり$xのほうが大きくなるようにすると言う意味。
0009デフォルトの名無しさん2006/12/21(木) 23:29:13
>>7
1000まで無駄なく使う、ってわざわざ言わなきゃわからないのか?
0010デフォルトの名無しさん2006/12/21(木) 23:38:48
スレ隔てると中途半端になりそうな気もするがね。
0011デフォルトの名無しさん2006/12/21(木) 23:42:00
C/C++も、Javaも、Rubyも、Pythonも宿題スレがあるんだな。
だから空気の読めない初心者が混ざるのか。
0012デフォルトの名無しさん2006/12/22(金) 00:03:24
ちゃんと問題そのものを載せてくれるとまだ良いんだけどな
0013デフォルトの名無しさん2006/12/22(金) 01:30:06
>>11
質問箱なんだから初心者が来るのは構わないんだけど結局>>12の言うとおりじゃない?
0014デフォルトの名無しさん2006/12/22(金) 01:58:54
問題そのものを載せないのもそうだが
コードが動かないときに自分の思いこみでコードの一部分だけ切り出して貼ったり
途中までやったけど分かりませんって書いて コードは一行もなかったり
0015GOLFer名無しさん2006/12/22(金) 02:27:18
@t=($x=1,$y=2,$z=3);
$w=($l=@t)**2;
{$j = 0;while(1){$i=0;while(1){@t[$i,$i+1]=
([$t[$i]=>$t[$i+1]]->[$t[$i]<=$t[$i+1]]=>[$t[$i+1]=>$t[$i]]->[$t[$i]<=$t[$i+1]]);
last if$i++==$l;}last if$j++==$w;}}
print "@t";
0016デフォルトの名無しさん2006/12/22(金) 07:52:52
>>1 乙
my @in = qw( 4 2 6 ) ;
my @new ;
for( 0..$#in ){
  my $min = $in[0] ;
  my $ind = 0 ;
  for (0 .. $#in ){
    if ( $min > $in[$_] ){
      $min = $in[$_] ;
      $ind = $_ ;
    }
  } 
  push @new, $min ;
  splice @in, $ind, 1 ;
}
print @new , "\n" ;
0017デフォルトの名無しさん2006/12/22(金) 12:42:52
>>14
なんかエラーがでます。







そのエラーを貼れよ!!
0018デフォルトの名無しさん2006/12/22(金) 22:16:57
○○ if △△ の形の条件分岐とかって使ってる? 俺は使ってないんだが。
0019デフォルトの名無しさん2006/12/22(金) 22:20:55
next ifとreturn ifは使う
0020デフォルトの名無しさん2006/12/23(土) 00:05:34
elseを伴わない場合で処理が1行ならほぼ間違いなく使う。
0021デフォルトの名無しさん2006/12/23(土) 00:12:52
すいません、ちょっと質問です。
jcode.pm で、文字コードを自動判定させると
なんか時々変な判断しませんか。

#別に半角カタカナは使ってはいません。

例:
  $szName = Jcode->new("ほげほげ")->euc;
  ・・・・・たっぷりと文字列処理
  print Jcode->new($szName)->sjis;

#  あれ? なんか化けてる。

  $szName = Jcode->new("ほげほげ".'sjis')->euc;
  ・・・・・たっぷりと文字列処理
  print Jcode->new($szName,'euc')->sjis;

# うん、これならOK. でも引数が多いのは嫌ですね。
0022デフォルトの名無しさん2006/12/23(土) 00:19:52
そもそも、バイト列の並びから文字コードを確実に判定する方法なんてないですよ。
0023デフォルトの名無しさん2006/12/23(土) 01:01:47
だよね
可能なら自動判定は避けるべき
漢字一文字だと一部の漢字は自動判定できないし
cgiの場合なら入力時の漢字コードは決まっていると思うので、元の漢字コードを指定しましょう
0024182006/12/23(土) 01:44:44
結構みんなバラバラなのね。うちの周りだと使ってる人がほぼゼロだった。
純粋なPGがいないからかもしれないが。
0025デフォルトの名無しさん2006/12/23(土) 01:51:22
関係ないですが

$sql = "select from T_hogehoge where (判定='A')";

てのを書いてて、「あ、右端に顔文字・・・・」と思ってしまいますた。

・・・・余談でつ。
0026デフォルトの名無しさん2006/12/23(土) 02:09:12
>>18
あまり複雑な条件では使わない

my $fh = new IO::File ">hoge";
return undef unless defined $fh;
とか

$str .= "hoge¥n";
$str .= "moge¥n" if $flag;
return $str;
とか
0027デフォルトの名無しさん2006/12/23(土) 03:25:00
>>26
後者は同意だけど、前者は
my $fh = new IO::File ">hoge"
    or return;
と書くおいら

perlstyleに言及があるとおり、場面に合わせて読みやすいであろう方を選択だよね。
0028デフォルトの名無しさん2006/12/23(土) 08:33:59
ソースのインデント増やしたくないから積極的に
利用する(ある意味 next とかの積極利用なんだけど )
0029デフォルトの名無しさん2006/12/23(土) 08:54:26
PBPに
while ( <> ){
 next if !/^(\S+)\s+(\S+)$/ ;
 #ここで$1, $2 の処理をする
}
みたく書いてあったときはある意味衝撃だったw
ええ知らなかっただけですともorz...
0030デフォルトの名無しさん2006/12/23(土) 10:12:42
\ を一々 \ に変えてる奴って頭おかしいの?
0031デフォルトの名無しさん2006/12/23(土) 10:21:08
>>30
Safari厨だと思われ。
0032デフォルトの名無しさん2006/12/23(土) 12:21:42
Vistaになればみんなそうなるのかな?
0033デフォルトの名無しさん2006/12/23(土) 13:43:42
>>32
ならない。
0034デフォルトの名無しさん2006/12/23(土) 16:33:52
useしたモジュールで発生する"Use of uninitialized value"エラーを出力させたくないのですが、
どのようにしたらよろしいでしょうか?
モジュールには手を加えたくないのですが。。
0035デフォルトの名無しさん2006/12/23(土) 16:59:53
perl -w を使わずに use warnings すればいいんじゃね?
0036342006/12/23(土) 17:21:35
>>35
質問文が分かりにくくてすみません;

#program start
use hogehoge 'hoge';
print hoge('unko');
#program end
例えば、上記のプログラムを実行して標準出力に出力される、
"Use of uninitialized value in %s at hogehoge.pm line 30."
というエラーの出力を止めたいのです。。
0037デフォルトの名無しさん2006/12/23(土) 17:52:44
>>36
つまり何か。hogehogeモジュールがその中でwarningsプラグマを有効にしているにも拘らず、
正常な処理の範囲内でundefinedな値のチェックを怠っていて、しかも、
他の人が作ったモジュールだから触るわけには行かない。とそういう状況なわけか。
0038342006/12/23(土) 18:01:53
>>37
Yes!まさにその通りです!
0039デフォルトの名無しさん2006/12/23(土) 19:03:35
レキシカルな特殊変数に干渉する方法がわからん…
一応、思いついたDirty Hack二通り
1.
BEGIN { local *warnings::import;
require hogehoge; import hogehoge 'hoge'; }

2.
{ use IO::Null;
tie local *STDERR, 'IO::Null';
print hoge('unko'); }
0040デフォルトの名無しさん2006/12/23(土) 19:37:17
いったんhogehogeにパッケージ切り替えてno warnings 'uninitialized';したら?

use hogehoge qw/hoge/;

package hogehoge;
no warnings qw/uninitialized/;

package main;

print hoge('unko');

試してないからわからん。
0041デフォルトの名無しさん2006/12/23(土) 20:11:47
表示されなければいいのなら$SIG{__WARN__}を定義して横取りする手もある。

The routine indicated by $SIG{__WARN__} is called when a warn-
ing message is about to be printed. The warning message is
passed as the first argument. The presence of a __WARN__ hook
causes the ordinary printing of warnings to STDERR to be sup-
pressed.
0042342006/12/23(土) 23:26:18
>>39-41
ありがとうございます _ _
>>39さんの1の方法を使わせていただきました。
>>40
no useは地の文での解釈となってしまうようでした。
0043デフォルトの名無しさん2006/12/24(日) 12:18:30
perl で PDFからテキストコンバータしたいんだけど、そんなモジュールってある?
0044デフォルトの名無しさん2006/12/24(日) 12:34:08
http://search.cpan.org/search?query=pdf+extract+text&mode=module
たくさんあるんじゃね?
0045デフォルトの名無しさん2006/12/24(日) 12:36:07
CPANでそうやってけんさくするのか。
 ありがとう。
0046デフォルトの名無しさん2006/12/24(日) 15:04:19
WindowsのActivePerl-5.8.8.819-MSWin32-x86-267479.msiでインストールしたパッケージに
Jcode.pmと新しいEncode.pmとEUCJPMSをインストールしようとしましたが、
Jcode.pm以外はインストールできませんでした。
Encode.pmの場合は
NMAKE : fatal error U1077: 'C:\MSVSEE\VC\bin\cl.EXE' : リターン コード '0x80'
Stop.
NMAKE : fatal error U1077: 'C:\MSVSEE\VC\bin\nmake.exe' : リターン コード '0x2'
Stop.
EUCJPMSの場合は
NMAKE : fatal error U1077: 'C:\MSVSEE\VC\bin\cl.EXE' : リターン コード '0x80'
Stop.
このようになり、Makefileからmakeできませんでした。
ほかにインストールする方法はないものでしょうか。
0047デフォルトの名無しさん2006/12/24(日) 17:36:55
「4の倍数」や「4で割り切れる」という条件は、どのように表したらよいのでしょうか?
0048デフォルトの名無しさん2006/12/24(日) 17:51:58
>>47
if ($num % 4 == 0)
0049デフォルトの名無しさん2006/12/24(日) 18:18:20
>>46
ppm install
0050462006/12/24(日) 19:14:23
すいません自己解決しました。
vcのincludeやlibへのパスがうまく通っていなかったようです。
設定しなおしたらmakeできました。

>>49
ppmでやろうと思ったらそんなもんねーよとppmに怒られてしまいました。
0051472006/12/24(日) 20:06:57
2で割り切れても50で割り切れない
上記のようなものはどう表示すればよいのでしょうか?
0052デフォルトの名無しさん2006/12/24(日) 20:14:04
これはひどい
0053472006/12/24(日) 20:25:26
事故解決しました
0054デフォルトの名無しさん2006/12/24(日) 20:27:39
>>51
if(2で割り切れる? = はい){
 if(50で割り切れる? = いいえ){
  print "2で割り切れるけど、50で割り切れないよ。";
 }
}
0055デフォルトの名無しさん2006/12/24(日) 20:35:28
>>50
解決して何より。
だけどppmはリポジトリを追加するともっと強力になるよん。
Encodeの最新版はTheoryx5リポジトリにある。
Encode-EUCJPMSは検索したらパッケージを作ってる人がいました。
ttp://asakura.g.hatena.ne.jp/asakura-t/20061102/1162451401
0056デフォルトの名無しさん2006/12/24(日) 21:02:59
>>50
ppm では
search hoge* してからにすべし

Foo::bar というモジュール名は
経験上、ppm では install Foo-Bar の名称で指定することが多し。

<ちらしの裏>
追記すると、最新の ActivePerl (Win32) では
ppm だと GUIウインドウが開く。
ppm-shell だと、従来通りのコマンドライン版が起動する。
</ちらしの裏>
0057デフォルトの名無しさん2006/12/24(日) 23:13:43
perlって何を造るための言語なんだ?
結局はWeb関連だったらツマランわ
0058デフォルトの名無しさん2006/12/24(日) 23:17:02
聖夜釣ですか
0059デフォルトの名無しさん2006/12/24(日) 23:35:41
Spreadsheet::WriteExcelでは既存のファイルを開けないことが判明orz
VBAコードを仕込んでおきたかったんだけど、なんかうまい方法はないでしょうか。
Linuxサーバ上でやりたいため、WIn32::OLEという解は使えません…。
0060デフォルトの名無しさん2006/12/25(月) 13:28:50
>>57
Perl is a programming language for getting your job done.
0061デフォルトの名無しさん2006/12/25(月) 18:56:23
すみません。どなたか教えてくださいませ。
コード値を文字にしたいのですが、日本語はどのようにしたらよろしいのでしょうか?
chrは2バイト文字はだめってのはわかったんですが。
ちなみにシフトJISのコードを変換したいです。
例 0x82A0 → あ
0062デフォルトの名無しさん2006/12/25(月) 19:17:21
$str = pack("H*","82A0");
0063612006/12/25(月) 19:22:37
>62
ありがとうございます!
packの奥は深いっすね〜
もっと勉強します!
0064デフォルトの名無しさん2006/12/25(月) 21:15:28
>>60
ワロタ
0065デフォルトの名無しさん2006/12/26(火) 01:22:43
今日からオライリーのPerlの本で勉強始めます。
来月から仕事で使いそうなんで・・・
0066デフォルトの名無しさん2006/12/26(火) 01:33:16
ここは俺の日記帳だからお前は日記を書くな
0067デフォルトの名無しさん2006/12/26(火) 01:39:30
chomp
0068デフォルトの名無しさん2006/12/26(火) 03:21:37
質問

文字化けする理由を教えてください。

スクリプト
-------------------
$str="あー";
print $str;
print "\n";
$tmp="−";
$str =~ s/$tmp//g;
print $str;
--------------------

実行結果
--------------------
あー
あ[
--------------------
0069682006/12/26(火) 03:24:04
追記
環境Windowsで.plファイルのエンコードはShift-JISです。
実行結果はコマンドプロンプトでの実行結果です。
0070デフォルトの名無しさん2006/12/26(火) 03:58:22
− = 81 7c
| = 7c
より、$str =~ s/$tmp//g;は
$str =~ s/(文字コード81)|//g;とPerlに解釈されています。
つまり、$str内の文字コード81か、空文字にマッチングしそれが削除されます。
あー = 82 a0 81 5b内の81を削除すると82 a0 5bとなり
これをShift_JISで表示すると[ = 5bよりあ[となります。
0071682006/12/26(火) 04:50:18
>>70
丁寧な解説ありがとうございました。

$tmp="−";
$str =~ s/$tmp//g;
を
$str =~ s/\x81\x7c//g;
とすることによって解決できました。
0072デフォルトの名無しさん2006/12/26(火) 10:26:52
そうくるかw
0073デフォルトの名無しさん2006/12/26(火) 11:46:16
Perl4時代の息吹を感じました。
0074デフォルトの名無しさん2006/12/26(火) 16:00:24
すみません、CPANにあるHTML::TableExtractについての質問です。
http://search.cpan.org/dist/HTML-TableExtract/lib/HTML/TableExtract.pm
↑のREGULAR METHODSにあるdepths()メソッドの文字を変数に代入したいんです。。
然るべき手順を踏んで、
print $te->depths();
するときちんとdepths()メソッドの文字が表示されるのですが、
my $test = $te->depths();
print $test;
すると"Use of uninitialized value in print"というエラーが出てしまいます。。
全く訳が分からず打ち間違えを確認したりして同じ事を何回も繰り返したりしたのですが、
訳が分からないです。。どなたがご助言お願いいたします _ _
0075デフォルトの名無しさん2006/12/26(火) 16:03:36
>>66
      r;ァ'N;:::::::::::::,ィ/      >::::::::::ヽ
.      〃  ヽル1'´        ∠:::::::::::::::::i
       i′  ___, - ,. = -一   ̄l:::::::::::::::l
.      ! , -==、´r'          l::::::/,ニ.ヽ
      l        _,, -‐''二ゝ  l::::l f゙ヽ |、
        レー-- 、ヽヾニ-ァ,ニ;=、_   !:::l ) } ト
       ヾ¨'7"ry、`   ー゙='ニ,,,`    }::ヽ(ノ  2ちゃんはみんなの日記帳だから
:ーゝヽ、     !´ " ̄ 'l,;;;;,,,.、       ,i:::::::ミ
::::::::::::::::ヽ.-‐ ト、 r'_{   __)`ニゝ、  ,,iリ::::::::ミ    
::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ ,  な!
:::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::///
:::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /
0076742006/12/26(火) 16:04:22
ごめんなさい。配列型で返ってきてました。。
0077デフォルトの名無しさん2006/12/26(火) 16:26:50
>>73
use utf8を使えば文字を直接置換できるかな?
0078デフォルトの名無しさん2006/12/26(火) 16:43:49
>>68
http://pc8.2ch.net/test/read.cgi/php/1164519503/498-512
0079デフォルトの名無しさん2006/12/27(水) 02:04:44
パール無図杉
0080デフォルトの名無しさん2006/12/27(水) 23:00:18
すみません、質問があります。
WindowsのActive Perl v5.5.8です。
UTF16の日本語ファイルを開いて処理させようとすると
処理結果のテキストが文字化けしてしまいます。
Shift JISとUTF8形式だと問題なく処理できるのですが…。
UTF16でうまく処理できる方法はないでしょうか?
0081デフォルトの名無しさん2006/12/28(木) 01:01:06
>>80
シフトJISのファイルを扱うとき、
binmode STDOUT, ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";
binmode STDIN, ":encoding(cp932)";
use open IO => ":encoding(cp932)";
とか書かなかった?
cp932 を例えば、UTF-16LE に変えれば済むことと思われるが。
0082デフォルトの名無しさん2006/12/28(木) 01:12:53
>>80
前スレがまだ残っているので、前スレ 694 からの流れを参照。
対策としては、前スレ 703 のリンク先にある方法が無難だと思う。
0083デフォルトの名無しさん2006/12/28(木) 01:24:39
>>81さん
シフトJISのときは何も指定せずにいけました。
>>82さん
ありがとうございます。
明日頑張ってみます。
0084デフォルトの名無しさん2006/12/28(木) 11:31:19
Activeperl でタイムアウトを指定してホスト名を逆引き(gethostbyaddr)
するプログラムを書いています。タイムアウトした場合にはIPアドレスを
返そうと思います。そこで以下のようなサブルーチンを書いたのですが、
タイムアウトしません。古いActiveperlではalarmがないとの情報があった
のですが、sleep行で確認した所、5.8.8では問題ないようです。
お知恵を拝借頂ければ幸いです。

sub resolv_host {
my ($ip)=@_; my $timeout=2; my $host;
$SIG{ALRM} = sub { die 'TIMED OUT' };
eval {
alarm($timeout);
# ホスト名を逆引きする。
#sleep 5;
$host = gethostbyaddr(pack("C4", split(/\./, $ip)), 2);
alarm(0);
};
alarm(0);
if ( $@ =~ /TIMED OUT/ ){ $host = $ip;}
return ($host);
}

※実行環境は以下の通りです。

Windows XP SP2
Activeperl 5.8.8
0085 ◆TWARamEjuA NGNG?BRZ(6677)
Net::DNS を利用するのはいかがかしら?
0086デフォルトの名無しさん2006/12/28(木) 17:31:04
他所様のサーバの混雑具合を調べるプログラムを書こうとしています。

use IO::Socket;
my $sock = IO::Socket::INET->new(
 PeerAddr => $ip,
 PeerPort => $port,
 Proto => 'tcp',
 Timeout => $TIMEOUT,
);
if ($sock) {
 #接続成功
} else {
 #タイムアウト
}

今現在のコードがこんな感じでして、繋がる繋がらないは分かるのですが、
接続に要する時間を調べたいもののその方法がわかりません。
SOCKETを触るのが今回初めてでして、
そもそもにおいて根本的な過ちを犯してる場合はそちらも併せて、
何かよい方法がありましたら、ご教授いただけると幸いです。
0087デフォルトの名無しさん2006/12/28(木) 17:43:14
普通に前後で現在時間を求めて引き算すればいいのでは?
0088デフォルトの名無しさん2006/12/28(木) 17:58:48
>>85
ありがとうございました。

sub resolv_host {
use Net::DNS;
my ($ip)=@_; my $timeout=2; my $host;
my $res = Net::DNS::Resolver->new(
tcp_timeout => $timeout, udp_timeout => $timeout
);

my $query = $res->query("$ip");
if ($query) {
foreach my $rr ($query->answer) {
next if $rr->type ne "PTR";
$host=$rr->ptrdname;
}
}
else { $host=$ip; }
return ($host);
}
0089名無しさん@Linuxザウルス2006/12/28(木) 18:54:03
任意の文字列からhttpで始まる単語(区切りはスペース)を切り取るにはどうしたらいいでしょうか
$str = aaaa bbbb ccc http://ddd.vv.vv hhhh rrrr http://ff.ff.mm
という文字列から「http://ddd.vv.vv」「http://ff.ff.mm」を切り出す方法です
0090デフォルトの名無しさん2006/12/28(木) 18:59:42
@a = grep /^http/, split / /, $str;
0091デフォルトの名無しさん2006/12/28(木) 19:05:18
@a = $str =~ /(?:^| )(http.*?)(?: |$)/g;
0092デフォルトの名無しさん2006/12/28(木) 19:53:46
>>55
>>56
遅くなりましたが、ありがとうございました。
レポジトリを追加したらだいぶ便利になりました。
パッケージをダウンロードしてきてそのまま追加することもできるようになりました。
0093名無しさん@Linuxザウルス2006/12/28(木) 20:04:48
>>90,91
サンクス
0094デフォルトの名無しさん2006/12/28(木) 20:45:12
「後ろにtringが続かないs」を「z」に置換する方法は次の2つ以外にありますか?

s/s$/z/;
s/s([^t])/z$1/g;
s/st([^r])/zt$1/g;
s/str([^i])/ztr$1/g;
...

s/string/(あり得なさそうな文字列)/g;
s/s/z/g;
s/(あり得なさそうな文字列)/string/g;
0095デフォルトの名無しさん2006/12/28(木) 20:48:34
>>94
先読み否定。色々仲間があるので詳細はperlre参照。
s/s(?!tring)/z/g;
0096デフォルトの名無しさん2006/12/28(木) 21:14:01
任意の精度の数値演算したいんですけど、
どうすればいいでしょうか?
0097デフォルトの名無しさん2006/12/28(木) 21:16:21
あ、Math::BigFloat モジュールってのがありました
すいません m(__)m
0098デフォルトの名無しさん2006/12/28(木) 21:17:16
>>95
ありがとうございました。
0099デフォルトの名無しさん2006/12/29(金) 05:18:57
FTPプロトコルでリモートにファイル転送するスクリプトを作ってるのですが
ローカルとリモートで同名だけどリモートの方がファイルサイズ小さい場合
差分のみ転送にしたいのですがレジュームはどうやればできますでしょうか?
perldoc Net::FTP
でresumeをキーに検索したのですが見当たりませんでした。
よろしくお願いします。
0100992006/12/29(金) 08:20:07
自己レス

FTP resume perlをキーにググッたら下記の情報見つけた
http://www.garayed.com/perl/215162-net-ftp-resume-file-transfer.html

perldoc Net::FTPでWHEREを見ろって書いてあったので見たら
ダウンロードはgetメソッドの第3引数でオフセット値が指定できるみたいだけど
アップロードはrestartってメソッドでオフセット値をセットしてから
putメソッドで転送すればいいのかな。

しかしputメソッドは第3引数でオフセット値を指定できないんだ???
0101デフォルトの名無しさん2006/12/29(金) 08:59:14
どこまできちんと届いているかは、クライアントしか知らないから、
レジュームって普通クライアントから要求するようになってると思うよ。
■ このスレッドは過去ログ倉庫に格納されています