2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん: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

2 :デフォルトの名無しさん: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/

3 :デフォルトの名無しさん: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

4 :デフォルトの名無しさん: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/

5 :デフォルトの名無しさん:2006/12/21(木) 22:38:30
>>1 乙でし

6 : ◆TWARamEjuA :2006/12/21(木) 22:56:34 ?BRZ(6677)
(´-`).。oO(「埋め」やっているやつは石器時代の人間か?)

7 :デフォルトの名無しさん:2006/12/21(木) 23:05:10
>>6
現代人なら何するの?

8 :デフォルトの名無しさん: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のほうが大きくなるようにすると言う意味。

9 :デフォルトの名無しさん:2006/12/21(木) 23:29:13
>>7
1000まで無駄なく使う、ってわざわざ言わなきゃわからないのか?

10 :デフォルトの名無しさん:2006/12/21(木) 23:38:48
スレ隔てると中途半端になりそうな気もするがね。


11 :デフォルトの名無しさん:2006/12/21(木) 23:42:00
C/C++も、Javaも、Rubyも、Pythonも宿題スレがあるんだな。
だから空気の読めない初心者が混ざるのか。

12 :デフォルトの名無しさん:2006/12/22(金) 00:03:24
ちゃんと問題そのものを載せてくれるとまだ良いんだけどな

13 :デフォルトの名無しさん:2006/12/22(金) 01:30:06
>>11
質問箱なんだから初心者が来るのは構わないんだけど結局>>12の言うとおりじゃない?

14 :デフォルトの名無しさん:2006/12/22(金) 01:58:54
問題そのものを載せないのもそうだが
コードが動かないときに自分の思いこみでコードの一部分だけ切り出して貼ったり
途中までやったけど分かりませんって書いて コードは一行もなかったり

15 :GOLFer名無しさん: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";

16 :デフォルトの名無しさん: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" ;


17 :デフォルトの名無しさん:2006/12/22(金) 12:42:52
>>14
なんかエラーがでます。







そのエラーを貼れよ!!

18 :デフォルトの名無しさん:2006/12/22(金) 22:16:57
○○ if △△ の形の条件分岐とかって使ってる? 俺は使ってないんだが。

19 :デフォルトの名無しさん:2006/12/22(金) 22:20:55
next ifとreturn ifは使う

20 :デフォルトの名無しさん:2006/12/23(土) 00:05:34
elseを伴わない場合で処理が1行ならほぼ間違いなく使う。

21 :デフォルトの名無しさん: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. でも引数が多いのは嫌ですね。

22 :デフォルトの名無しさん:2006/12/23(土) 00:19:52
そもそも、バイト列の並びから文字コードを確実に判定する方法なんてないですよ。

23 :デフォルトの名無しさん:2006/12/23(土) 01:01:47
だよね
可能なら自動判定は避けるべき
漢字一文字だと一部の漢字は自動判定できないし
cgiの場合なら入力時の漢字コードは決まっていると思うので、元の漢字コードを指定しましょう

24 :18:2006/12/23(土) 01:44:44
結構みんなバラバラなのね。うちの周りだと使ってる人がほぼゼロだった。
純粋なPGがいないからかもしれないが。

25 :デフォルトの名無しさん:2006/12/23(土) 01:51:22
関係ないですが

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

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

・・・・余談でつ。

26 :デフォルトの名無しさん: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;
とか

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

perlstyleに言及があるとおり、場面に合わせて読みやすいであろう方を選択だよね。

28 :デフォルトの名無しさん:2006/12/23(土) 08:33:59
ソースのインデント増やしたくないから積極的に
利用する(ある意味 next とかの積極利用なんだけど )

29 :デフォルトの名無しさん:2006/12/23(土) 08:54:26
PBPに
while ( <> ){
 next if !/^(\S+)\s+(\S+)$/ ;
 #ここで$1, $2 の処理をする
}
みたく書いてあったときはある意味衝撃だったw
ええ知らなかっただけですともorz...

30 :デフォルトの名無しさん:2006/12/23(土) 10:12:42
\ を一々 \ に変えてる奴って頭おかしいの?

31 :デフォルトの名無しさん:2006/12/23(土) 10:21:08
>>30
Safari厨だと思われ。

32 :デフォルトの名無しさん:2006/12/23(土) 12:21:42
Vistaになればみんなそうなるのかな?

33 :デフォルトの名無しさん:2006/12/23(土) 13:43:42
>>32
ならない。

34 :デフォルトの名無しさん:2006/12/23(土) 16:33:52
useしたモジュールで発生する"Use of uninitialized value"エラーを出力させたくないのですが、
どのようにしたらよろしいでしょうか?
モジュールには手を加えたくないのですが。。

35 :デフォルトの名無しさん:2006/12/23(土) 16:59:53
perl -w を使わずに use warnings すればいいんじゃね?

36 :34:2006/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."
というエラーの出力を止めたいのです。。

37 :デフォルトの名無しさん:2006/12/23(土) 17:52:44
>>36
つまり何か。hogehogeモジュールがその中でwarningsプラグマを有効にしているにも拘らず、
正常な処理の範囲内でundefinedな値のチェックを怠っていて、しかも、
他の人が作ったモジュールだから触るわけには行かない。とそういう状況なわけか。

38 :34:2006/12/23(土) 18:01:53
>>37
Yes!まさにその通りです!

39 :デフォルトの名無しさん: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'); }

40 :デフォルトの名無しさん: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');

試してないからわからん。

41 :デフォルトの名無しさん: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.

42 :34:2006/12/23(土) 23:26:18
>>39-41
ありがとうございます _ _
>>39さんの1の方法を使わせていただきました。
>>40
no useは地の文での解釈となってしまうようでした。

43 :デフォルトの名無しさん:2006/12/24(日) 12:18:30
perl で PDFからテキストコンバータしたいんだけど、そんなモジュールってある?

44 :デフォルトの名無しさん:2006/12/24(日) 12:34:08
http://search.cpan.org/search?query=pdf+extract+text&mode=module
たくさんあるんじゃね?

45 :デフォルトの名無しさん:2006/12/24(日) 12:36:07
CPANでそうやってけんさくするのか。
 ありがとう。

46 :デフォルトの名無しさん: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できませんでした。
ほかにインストールする方法はないものでしょうか。

47 :デフォルトの名無しさん:2006/12/24(日) 17:36:55
「4の倍数」や「4で割り切れる」という条件は、どのように表したらよいのでしょうか?


48 :デフォルトの名無しさん:2006/12/24(日) 17:51:58
>>47
if ($num % 4 == 0)

49 :デフォルトの名無しさん:2006/12/24(日) 18:18:20
>>46
ppm install

50 :46:2006/12/24(日) 19:14:23
すいません自己解決しました。
vcのincludeやlibへのパスがうまく通っていなかったようです。
設定しなおしたらmakeできました。

>>49
ppmでやろうと思ったらそんなもんねーよとppmに怒られてしまいました。

51 :47:2006/12/24(日) 20:06:57
2で割り切れても50で割り切れない
上記のようなものはどう表示すればよいのでしょうか?

52 :デフォルトの名無しさん:2006/12/24(日) 20:14:04
これはひどい

53 :47:2006/12/24(日) 20:25:26
事故解決しました

54 :デフォルトの名無しさん:2006/12/24(日) 20:27:39
>>51
if(2で割り切れる? = はい){
 if(50で割り切れる? = いいえ){
  print "2で割り切れるけど、50で割り切れないよ。";
 }
}

55 :デフォルトの名無しさん:2006/12/24(日) 20:35:28
>>50
解決して何より。
だけどppmはリポジトリを追加するともっと強力になるよん。
Encodeの最新版はTheoryx5リポジトリにある。
Encode-EUCJPMSは検索したらパッケージを作ってる人がいました。
ttp://asakura.g.hatena.ne.jp/asakura-t/20061102/1162451401

56 :デフォルトの名無しさん:2006/12/24(日) 21:02:59
>>50
ppm では
search hoge* してからにすべし

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

<ちらしの裏>
追記すると、最新の ActivePerl (Win32) では
ppm だと GUIウインドウが開く。
ppm-shell だと、従来通りのコマンドライン版が起動する。
</ちらしの裏>


57 :デフォルトの名無しさん:2006/12/24(日) 23:13:43
perlって何を造るための言語なんだ?
結局はWeb関連だったらツマランわ

58 :デフォルトの名無しさん:2006/12/24(日) 23:17:02
聖夜釣ですか

59 :デフォルトの名無しさん:2006/12/24(日) 23:35:41
Spreadsheet::WriteExcelでは既存のファイルを開けないことが判明orz
VBAコードを仕込んでおきたかったんだけど、なんかうまい方法はないでしょうか。
Linuxサーバ上でやりたいため、WIn32::OLEという解は使えません…。

60 :デフォルトの名無しさん:2006/12/25(月) 13:28:50
>>57
Perl is a programming language for getting your job done.

61 :デフォルトの名無しさん:2006/12/25(月) 18:56:23
すみません。どなたか教えてくださいませ。
コード値を文字にしたいのですが、日本語はどのようにしたらよろしいのでしょうか?
chrは2バイト文字はだめってのはわかったんですが。
ちなみにシフトJISのコードを変換したいです。
例 0x82A0 → あ

62 :デフォルトの名無しさん:2006/12/25(月) 19:17:21
$str = pack("H*","82A0");

63 :61:2006/12/25(月) 19:22:37
>62
ありがとうございます!
packの奥は深いっすね〜
もっと勉強します!


64 :デフォルトの名無しさん:2006/12/25(月) 21:15:28
>>60
ワロタ


65 :デフォルトの名無しさん:2006/12/26(火) 01:22:43
今日からオライリーのPerlの本で勉強始めます。
来月から仕事で使いそうなんで・・・

66 :デフォルトの名無しさん:2006/12/26(火) 01:33:16
ここは俺の日記帳だからお前は日記を書くな

67 :デフォルトの名無しさん:2006/12/26(火) 01:39:30
chomp

68 :デフォルトの名無しさん:2006/12/26(火) 03:21:37
質問

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

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

実行結果
--------------------
あー
あ[
--------------------

69 :68:2006/12/26(火) 03:24:04
追記
環境Windowsで.plファイルのエンコードはShift-JISです。
実行結果はコマンドプロンプトでの実行結果です。

70 :デフォルトの名無しさん: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よりあ[となります。

71 :68:2006/12/26(火) 04:50:18
>>70
丁寧な解説ありがとうございました。

$tmp="−";
$str =~ s/$tmp//g;

$str =~ s/\x81\x7c//g;
とすることによって解決できました。

72 :デフォルトの名無しさん:2006/12/26(火) 10:26:52
そうくるかw

73 :デフォルトの名無しさん:2006/12/26(火) 11:46:16
Perl4時代の息吹を感じました。

74 :デフォルトの名無しさん: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"というエラーが出てしまいます。。
全く訳が分からず打ち間違えを確認したりして同じ事を何回も繰り返したりしたのですが、
訳が分からないです。。どなたがご助言お願いいたします _ _

75 :デフォルトの名無しさん: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 ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /

76 :74:2006/12/26(火) 16:04:22
ごめんなさい。配列型で返ってきてました。。

77 :デフォルトの名無しさん:2006/12/26(火) 16:26:50
>>73
use utf8を使えば文字を直接置換できるかな?

78 :デフォルトの名無しさん:2006/12/26(火) 16:43:49
>>68
http://pc8.2ch.net/test/read.cgi/php/1164519503/498-512

79 :デフォルトの名無しさん:2006/12/27(水) 02:04:44
パール無図杉

80 :デフォルトの名無しさん:2006/12/27(水) 23:00:18
すみません、質問があります。
WindowsのActive Perl v5.5.8です。
UTF16の日本語ファイルを開いて処理させようとすると
処理結果のテキストが文字化けしてしまいます。
Shift JISとUTF8形式だと問題なく処理できるのですが…。
UTF16でうまく処理できる方法はないでしょうか?

81 :デフォルトの名無しさん: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 に変えれば済むことと思われるが。


82 :デフォルトの名無しさん:2006/12/28(木) 01:12:53
>>80
前スレがまだ残っているので、前スレ 694 からの流れを参照。
対策としては、前スレ 703 のリンク先にある方法が無難だと思う。

83 :デフォルトの名無しさん:2006/12/28(木) 01:24:39
>>81さん
シフトJISのときは何も指定せずにいけました。
>>82さん
ありがとうございます。
明日頑張ってみます。

84 :デフォルトの名無しさん: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

85 : ◆TWARamEjuA :2006/12/28(木) 13:23:20 ?BRZ(6677)
Net::DNS を利用するのはいかがかしら?

86 :デフォルトの名無しさん: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を触るのが今回初めてでして、
そもそもにおいて根本的な過ちを犯してる場合はそちらも併せて、
何かよい方法がありましたら、ご教授いただけると幸いです。

87 :デフォルトの名無しさん:2006/12/28(木) 17:43:14
普通に前後で現在時間を求めて引き算すればいいのでは?

88 :デフォルトの名無しさん: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);
}

89 :名無しさん@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」を切り出す方法です

90 :デフォルトの名無しさん:2006/12/28(木) 18:59:42
@a = grep /^http/, split / /, $str;

91 :デフォルトの名無しさん:2006/12/28(木) 19:05:18
@a = $str =~ /(?:^| )(http.*?)(?: |$)/g;

92 :デフォルトの名無しさん:2006/12/28(木) 19:53:46
>>55
>>56
遅くなりましたが、ありがとうございました。
レポジトリを追加したらだいぶ便利になりました。
パッケージをダウンロードしてきてそのまま追加することもできるようになりました。

93 :名無しさん@Linuxザウルス:2006/12/28(木) 20:04:48
>>90,91
サンクス

94 :デフォルトの名無しさん: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;

95 :デフォルトの名無しさん:2006/12/28(木) 20:48:34
>>94
先読み否定。色々仲間があるので詳細はperlre参照。
s/s(?!tring)/z/g;

96 :デフォルトの名無しさん:2006/12/28(木) 21:14:01
任意の精度の数値演算したいんですけど、
どうすればいいでしょうか?


97 :デフォルトの名無しさん:2006/12/28(木) 21:16:21
あ、Math::BigFloat モジュールってのがありました
すいません m(__)m

98 :デフォルトの名無しさん:2006/12/28(木) 21:17:16
>>95
ありがとうございました。

99 :デフォルトの名無しさん:2006/12/29(金) 05:18:57
FTPプロトコルでリモートにファイル転送するスクリプトを作ってるのですが
ローカルとリモートで同名だけどリモートの方がファイルサイズ小さい場合
差分のみ転送にしたいのですがレジュームはどうやればできますでしょうか?
perldoc Net::FTP
でresumeをキーに検索したのですが見当たりませんでした。
よろしくお願いします。

100 :99:2006/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引数でオフセット値を指定できないんだ???

101 :デフォルトの名無しさん:2006/12/29(金) 08:59:14
どこまできちんと届いているかは、クライアントしか知らないから、
レジュームって普通クライアントから要求するようになってると思うよ。

102 :デフォルトの名無しさん:2006/12/29(金) 09:29:59
>>100
Net::FTPだったらputじゃなくてappendにしないと上書きされちゃうよ

>>101
99は具体的なやり方聞いてるのにそんな回答しても意味ネェだろw

103 :デフォルトの名無しさん:2006/12/29(金) 12:03:50
Perllこついての質問箱?

104 :デフォルトの名無しさん:2006/12/29(金) 12:08:27
Jcode::CP932
Encode::EUCJPMS
をインストールした後
use Jcode::CP932とするとエラーになってしまいます。

エラー内容
Jcode::CP932 is not an object at (eval 2) line 234
Jcode::AUTOLOAD('Jcode::CP932', 'sjis', 'cp932', 'euc', 'cp51932', 'jis', 'cp50221', 'iso_2022_jp', 'cp50220', ...) called at c:/usr/local/site/lib/Jcode/CP932.pm line 39
main::BEGIN() called at c:/usr/local/site/lib/Jcode/CP932.pm line 0
eval {...} called at c:/usr/local/site/lib/Jcode/CP932.pm line 0

Jcode.pmのAUTOLOADでconfessしてるっぽいんですが、何故動かないのでしょうか?
ちなみにWinXP、ActivePerl 5.8.7.813です

105 :SONY:2006/12/29(金) 15:18:48
>>104
仕様です

106 :デフォルトの名無しさん:2006/12/29(金) 16:12:31
GK涙目wwwwwwwwwwwww

107 :デフォルトの名無しさん:2006/12/29(金) 17:03:26
-----------------
これhttp://www.example.com/1.txt とttp://www2.example.com/2.txt これ
-----------------

この上の文を下の文に変換する"スマートな"方法としてはどのようなやり方がありますでしょうか?

-----------------
これ<a href="http://www.example.com/1.txt">http://www.example.com/1.txt</a> と<a href="http://www2.example.com/2.txt">ttp://www2.example.com/2.txt</a> これ
-----------------

仕様としましては

(1)http://またはhttps://またはttp://またはttps://で始まる場所をURL先頭とする
(2)半角空白または全角空白の登場、または文の末尾でURLの最後判定をする
(3)一行に複数のhttp://〜やttp://〜があっても全てにAタグを付ける
(4)Aタグをつけること以外の文章の加工をしない

です。
100stepくらい使えば書けないことはないと思うのですが、
スマートな方法は全く思いつきませんorz

108 :デフォルトの名無しさん:2006/12/29(金) 17:17:46
なあ、次スレからテンプレートにこれを追加しない?
実は、オレもJperl から Active Perl に移行するとき、
これが解るまでかなり時間がかかった覚えがあるんだけど。

---------------------------------------------------------
#  【Perl 日本語処理の基礎の基礎】
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま(シフトJIS形式の)ソースファイルに保存して下さい。
# 入出力ともシフトJIS形式のファイルまたはDOS窓を想定しています。
# 文字コードの条件が異なる場合には編集が必要です。
# 編集の仕方はご自分で勉強するか、このスレで質問して下さい。
# まず、以下の行を先頭に入れて下さい。
use encoding "cp932";
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
# 次に、あなたが実行したい処理の内容を入れて下さい。
print "やあ!\n";
sleep(1);


109 :デフォルトの名無しさん:2006/12/29(金) 17:24:21
use encodingは弊害がでかすぎるかと…。


110 :デフォルトの名無しさん:2006/12/29(金) 17:26:35
>>107
要するにhttp urlの正規表現が解ればいいわけね。
http://www.din.or.jp/~ohzaki/perl.htm#httpURL

111 :デフォルトの名無しさん:2006/12/29(金) 17:31:39
>>110
>要するにhttp urlの正規表現が解ればいいわけね。
違うッスorz

(1)(2)だけなら $line =~ /(h?)(ttps?:\/\/[^ |^ ]+)/ で。。。

112 :デフォルトの名無しさん:2006/12/29(金) 17:34:07
>107

use strict;
use warnings;

while (<DATA>) {
s{(h?ttps?://([^\s ]+))}{<a href="http://$2">$1</a>}g;
print $_;
}

__DATA__
これhttp://www.example.com/1.txt とttp://www2.example.com/2.txt これ

URLのパターンマッチはこれだと甘いけど。

>108
use encodingはきちんと理解して使わないとバグの元にしかならないから反対。

113 :デフォルトの名無しさん:2006/12/29(金) 17:35:35
s{(h?(ttps?://[^\s ]+))}{<a href="h$2">$1</a>}g;
ごめん、間違えた。

114 :デフォルトの名無しさん:2006/12/29(金) 17:37:13
全角空白って文字クラスにそのまま放り込んで大丈夫なんかいな

115 :108:2006/12/29(金) 17:43:36
>>109 >>112
確かにね。
これから始める人なら、ソースはUTF-8に統一して
もらったほうがいいかもね。これでいいかな?
---------------------------------------------------------
#  【Perl 日本語処理の基礎の基礎】
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。
# 入出力ともシフトJIS形式のファイルまたはDOS窓を想定しています。
# 文字コードの条件が異なる場合には編集が必要です。
# 編集の仕方はご自分で勉強するか、このスレで質問して下さい。
# まず、以下の行を先頭に入れて下さい。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
# 次に、あなたが実行したい処理の内容を入れて下さい。
print "やあ!\n";
sleep(1);


116 :109:2006/12/29(金) 18:24:42
>>108=115

乙!
WindowsのActivePerl初心者による
似たようなQ&Aの再生産を回避するために
テンプレートを設置しようというのはとてもすばらしいッス!
でも、

 ・テキストモードとバイナリモード
 ・ASCIIとマルチバイトコード
 ・日本でのマルチバイトコードは複数の種類が存在すること
 ・UTF-8以外でのマルチバイトコードの扱い

を理解してないと結局はすぐにつまづくと思う。
でも、これを丁寧に説明してるとテンプレートで紙面が足りないから
結局「http://〜を読んで」、「binmode, Encodeでググると吉」
ってなっちゃうんだよね。。。

次ぎスレに115のテンプレを追加して様子を見るのがいいのかな。


117 :デフォルトの名無しさん:2006/12/29(金) 18:40:57
両方うぜーよwebprogでやれ

118 :109:2006/12/29(金) 21:07:36
>>117 うぜぇのは同意だけど、ウェブはかんけぇねだろバーカw

119 :デフォルトの名無しさん:2006/12/29(金) 21:10:13
レベル的に物凄く関係ありまふ

120 :デフォルトの名無しさん:2006/12/29(金) 21:15:52
くだすれPerlだな

121 :デフォルトの名無しさん:2006/12/29(金) 21:24:28
117のスルー力たんないからスレが荒れたな。
スルー力身につくまでおまえがROMるかwebprog行ってろ

122 :デフォルトの名無しさん:2006/12/29(金) 22:30:03
>>104
Jcode.pmにパッチあててなくね?


123 :デフォルトの名無しさん:2006/12/29(金) 22:46:19
するーかって何だよ
スルメイカかよ

124 :デフォルトの名無しさん:2006/12/29(金) 23:08:30
>>123
どうも「スルーする力(ちから)」という意味みたいだな。
それより、>>117にぴったりのスレがあるぞ。こっちで活躍したらどうだ

【Perl上級者コーナーPart01】
http://pc8.2ch.net/test/read.cgi/php/1024741312/l50


125 :デフォルトの名無しさん:2006/12/29(金) 23:24:05
ゾーキャスラー力を思い出す流れだが、まぁ通じないだろう。

126 :107:2006/12/30(土) 00:21:53
>>112,113

できました!ありがとうございましたm(_ _)m

38 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)