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

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

レス数が1000を超えています。これ以上書き込みはできません。
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
どこまできちんと届いているかは、クライアントしか知らないから、
レジュームって普通クライアントから要求するようになってると思うよ。
0102デフォルトの名無しさん2006/12/29(金) 09:29:59
>>100
Net::FTPだったらputじゃなくてappendにしないと上書きされちゃうよ

>>101
99は具体的なやり方聞いてるのにそんな回答しても意味ネェだろw
0103デフォルトの名無しさん2006/12/29(金) 12:03:50
Perllこついての質問箱?
0104デフォルトの名無しさん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です
0105SONY2006/12/29(金) 15:18:48
>>104
仕様です
0106デフォルトの名無しさん2006/12/29(金) 16:12:31
GK涙目wwwwwwwwwwwww
0107デフォルトの名無しさん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
0108デフォルトの名無しさん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);
0109デフォルトの名無しさん2006/12/29(金) 17:24:21
use encodingは弊害がでかすぎるかと…。
0110デフォルトの名無しさん2006/12/29(金) 17:26:35
>>107
要するにhttp urlの正規表現が解ればいいわけね。
http://www.din.or.jp/~ohzaki/perl.htm#httpURL
0111デフォルトの名無しさん2006/12/29(金) 17:31:39
>>110
>要するにhttp urlの正規表現が解ればいいわけね。
違うッスorz

(1)(2)だけなら $line =~ /(h?)(ttps?:\/\/[^ |^ ]+)/ で。。。
0112デフォルトの名無しさん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はきちんと理解して使わないとバグの元にしかならないから反対。
0113デフォルトの名無しさん2006/12/29(金) 17:35:35
s{(h?(ttps?://[^\s ]+))}{<a href="h$2">$1</a>}g;
ごめん、間違えた。
0114デフォルトの名無しさん2006/12/29(金) 17:37:13
全角空白って文字クラスにそのまま放り込んで大丈夫なんかいな
01151082006/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);
01161092006/12/29(金) 18:24:42
>>108=115

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

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

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

次ぎスレに115のテンプレを追加して様子を見るのがいいのかな。
0117デフォルトの名無しさん2006/12/29(金) 18:40:57
両方うぜーよwebprogでやれ
01181092006/12/29(金) 21:07:36
>>117 うぜぇのは同意だけど、ウェブはかんけぇねだろバーカw
0119デフォルトの名無しさん2006/12/29(金) 21:10:13
レベル的に物凄く関係ありまふ
0120デフォルトの名無しさん2006/12/29(金) 21:15:52
くだすれPerlだな
0121デフォルトの名無しさん2006/12/29(金) 21:24:28
117のスルー力たんないからスレが荒れたな。
スルー力身につくまでおまえがROMるかwebprog行ってろ
0122デフォルトの名無しさん2006/12/29(金) 22:30:03
>>104
Jcode.pmにパッチあててなくね?
0123デフォルトの名無しさん2006/12/29(金) 22:46:19
するーかって何だよ
スルメイカかよ
0124デフォルトの名無しさん2006/12/29(金) 23:08:30
>>123
どうも「スルーする力(ちから)」という意味みたいだな。
それより、>>117にぴったりのスレがあるぞ。こっちで活躍したらどうだ

【Perl上級者コーナーPart01】
http://pc8.2ch.net/test/read.cgi/php/1024741312/l50
0125デフォルトの名無しさん2006/12/29(金) 23:24:05
ゾーキャスラー力を思い出す流れだが、まぁ通じないだろう。
01261072006/12/30(土) 00:21:53
>>112,113

できました!ありがとうございましたm(_ _)m
0127デフォルトの名無しさん2006/12/30(土) 09:48:58
http://www.google.co.jp/search?hl=ja&rlz=1B2GGGL_jaJP177&q=%E3%82%B9%E3%83%AB%E3%83%BC%E3%82%AB&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
スルーカ の検索結果 約 173,000 件中 1 - 10 件目 (0.03 秒)
0128デフォルトの名無しさん2006/12/30(土) 09:53:09
Срука
0129デフォルトの名無しさん2007/01/01(月) 03:05:23
kent-web の sunbbs.cgi を改造しまくって使っています。
記事番号が奇数番号のときと偶数番号のときとで、
交互に違う情報を入れたいと思っているのですが、
perl で偶数と奇数を判別するのってどうやればいいんでしょうか?
0130デフォルトの名無しさん2007/01/01(月) 03:07:15
%2
0131デフォルトの名無しさん2007/01/01(月) 03:14:40
?
0132デフォルトの名無しさん2007/01/01(月) 03:22:34
>>129
2で割った余りが0なら偶数、1なら奇数と判定すればOK
0133デフォルトの名無しさん2007/01/01(月) 07:26:19
1 と and とって1ビット目が 0 か 1 かで判断してもおk
0134デフォルトの名無しさん2007/01/01(月) 15:02:29
>>132-133
例文でお願いしますです。orz
0135デフォルトの名無しさん2007/01/01(月) 15:12:55
>>134
この程度のこともわからないのに
>kent-web の sunbbs.cgi を改造しまくって使っています。
なのか
0136デフォルトの名無しさん2007/01/01(月) 15:22:34
>>134

%2
0137デフォルトの名無しさん2007/01/01(月) 18:38:54
巨大な数字ってどういうビット構造なんかな?

$a = 234;

if ( $a & 1) { print "奇数" }
else { print "偶数" }
0138デフォルトの名無しさん2007/01/02(火) 00:43:33
詳解 正規表現
をかったんだよお年玉で
0139デフォルトの名無しさん2007/01/03(水) 10:43:45
WINDOWSの鯖でファイルが書き込み可能かどうかを判断するにはどうしたらいいんですか?
WINDOWS鯖の場合だと
if (-w $write_file_path) { print "書き込み可能\n"; }というプログラムがが使えないんです
0140デフォルトの名無しさん2007/01/03(水) 11:06:17
>>139 == http://pc10.2ch.net/test/read.cgi/php/1164519503/635

マルチなので放置しましょう
0141デフォルトの名無しさん2007/01/03(水) 11:20:32
>>109
>use encodingは弊害がでかすぎるかと…。

kwsk.

 今まで、Jcode->new($hogehoge)->sjis; でちまちま変換していた者としては
 use encoding という技は新味ですyo.
0142デフォルトの名無しさん2007/01/03(水) 14:25:47
うるう年かどうかを判別するプログラムが課題で出ているのですが

$y=1900;

if($y %4==0){
print "$y is a leap year.\n";
}elsif(($y %4==0) && ($y %100==0)){
print "$y is a common year.\n";
}elsif(($y %100==0) && ($y %400==0)){
print "$y is a leap year.\n";
}else{
print "$y is a common year.\n";
}

これで1900を$yに入れても、うるう年になってしまいます。
1900をcommon year.にするには、どうすればよいのでしょうか?
0143デフォルトの名無しさん2007/01/03(水) 14:35:27
>>142
そういうのは400,100,4の順番に判定するんだよ
0144デフォルトの名無しさん2007/01/03(水) 14:45:24
なんてほのぼのする質問だろう
0145デフォルトの名無しさん2007/01/03(水) 14:52:27
正直に課題って言ったのも好感w
0146デフォルトの名無しさん2007/01/03(水) 15:09:31
>>142
最初の条件 $y %4==0 が、「4で割り切れたら」だから、4で割り切れる数字は、
全てここで引っかかっちゃうよ。
0147デフォルトの名無しさん2007/01/03(水) 17:45:10
(´・ω・)ヤサシス
0148デフォルトの名無しさん2007/01/03(水) 20:54:19
なんでうるう年は4年に一回なのに400と100も判定にいれるの?
0149デフォルトの名無しさん2007/01/03(水) 20:55:00
>>148
それは冗談で言っているんだよな。
0150デフォルトの名無しさん2007/01/03(水) 21:13:58
愉快なスレだな
0151デフォルトの名無しさん2007/01/03(水) 21:22:42
use DateTime;
my $y = 1900;

if (DateTime->new(year => $y)->is_leap_year) {
  print "$y is a leap year.\n";
} else {
  print "$y is a common year.\n";
}

こうですか? よくわかりません><
0152デフォルトの名無しさん2007/01/03(水) 21:25:31
アッー!
0153デフォルトの名無しさん2007/01/03(水) 21:27:16
>>151
反則です
0154デフォルトの名無しさん2007/01/03(水) 21:31:37
しかし >>142 にはモジュールを使ってはいけないなんて一言も(ry


まあ冗談だろうけど、実際に閏年の判定を書くとしたら >>151 なんだよなぁ・・・。
0155デフォルトの名無しさん2007/01/03(水) 21:41:17
>>149
まあ、今後 90年以上は >>148 が正しいわけだが。
0156デフォルトの名無しさん2007/01/03(水) 21:41:24
でもデフォルトで入ってたっけ?
0157デフォルトの名無しさん2007/01/03(水) 21:50:31
最新のactiveperlには入ってた。
0158デフォルトの名無しさん2007/01/03(水) 22:00:08
>>142の心温まる条件式を眺めてると、質問者に>>151を見て欲しくない気持ちになってきた。
0159デフォルトの名無しさん2007/01/03(水) 22:20:40
4000年で割り切れる年も入れないとね。
0160デフォルトの名無しさん2007/01/03(水) 22:34:26
>>159
どんだけ先の話やねん
0161デフォルトの名無しさん2007/01/03(水) 22:51:30
つ 「このように広く普及するのであれば、もっとちゃんとした設計を施すべきだった」
0162デフォルトの名無しさん2007/01/03(水) 22:59:36
そんなに長いこと使われないだろうと思って作ったソフトが2000年問題とかの原因になったんだよな
1993年使われ続けることも考慮しとくべきだな
0163デフォルトの名無しさん2007/01/03(水) 23:02:58
sub is_leap_year {
    $j = shift() + 660;
    unless ($j % 4) {
        unless (($j - 660) % 100) {
            return 0 unless ((($j - 660) / 100) % 4);
        }
        return 1;
    }
    return 0;
}

どぞ。
0164デフォルトの名無しさん2007/01/03(水) 23:04:31
だが、心配のしすぎではないか。
0165デフォルトの名無しさん2007/01/03(水) 23:08:42
もうまもなく4000年になろうとしているのに4000で割り切れる年を閏年にすべきか否かは未だ意見の分かれるところだね。
地球の自転が遅くなるからとか言うが。小賢しい。
0166デフォルトの名無しさん2007/01/03(水) 23:10:06
そういってy2kが問題になってたんじゃないか。
だいたい時間を1970/01/01 00:00からの32bit整数であらわすのも心配だな。やっぱり64bitはほしいところだ。
0167デフォルトの名無しさん2007/01/03(水) 23:20:41
符号付 64ビット整数で紀元からのピコ秒数で数えることにすると紀元の前後300年弱しか表せない。
0168デフォルトの名無しさん2007/01/03(水) 23:26:13
perl -e "print scalar(localtime(0xffffffff/2));"
だと「Tue Jan 19 12:14:07 2038」って出るが

perl -e "print scalar(localtime(0xffffffff/2+1));"
だと何も表示されないな

perlは普通にでかい値扱えるから
localtime関数も符号付32bitの上限超えても平気かと思ってたがだめなのか
0169デフォルトの名無しさん2007/01/04(木) 00:32:15
じゃあ紀元から符号付で128bitあれば足りるかな。
0170 ◆TWARamEjuA NGNG?BRZ(6700)
コンパイル時に指定してあげれば、、、@64bits
0171デフォルトの名無しさん2007/01/04(木) 09:43:47
ピコ秒って光が30cmしか飛べないんだぜ。
原子時計の精度が1ピコ秒なんだぜ。
どうやって計るんだぜ?
0172デフォルトの名無しさん2007/01/04(木) 13:46:03
>>168
表示はされたけど1901年だったわさ
0173デフォルトの名無しさん2007/01/04(木) 19:54:07
>>171
10E-16sオーダの時間の計測に成功したっていうニュースなら見た気がするが。
0174デフォルトの名無しさん2007/01/04(木) 20:23:27
不確定性原理からいくと、最小の時間単位は何だっけ?
0175デフォルトの名無しさん2007/01/04(木) 20:34:09
プランク時間か?
0176デフォルトの名無しさん2007/01/04(木) 23:41:55
当方perl初心者です。
全角スペースを半角スペースに置き換えたく、
~s/\xA1\xA1/\x20/g
としています。スペースの置き換え動作自体はするんですが、「ァー」や「ぁ!」などの文字列が文字化けするようになりました。
文字コードはEUCです。

コードを調べてみると「ぁ!」は
A4 A1 A1 AA となっており、全角スペースと誤認してしまうようでした。
どのように解決したら良いのでしょうか、教えてください。
0177デフォルトの名無しさん2007/01/04(木) 23:49:59
require 5.8.1;
use encoding 'euc-jp';
0178デフォルトの名無しさん2007/01/04(木) 23:50:19
http://www.din.or.jp/~ohzaki/perl.htm
01791762007/01/05(金) 00:12:36
解決しました。ありがとうございます。
0180デフォルトの名無しさん2007/01/05(金) 13:30:32
さんざんキシュツかもしれませんが、見つからなかったので質問。

Windows XP ActivePerl の環境で、system コマンドで呼び出したプログラムをバック グラウンド で動かしたい。どうすればよい? 例えば、スクリプトはこんな感じ。

---

my $IE = "c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";
system ($IE, "http://www.hotmail.com";);

---

例えば、上記を test.pl としてセーブし、これを DOS 窓から呼びだすと、こんな感じでとまり、別プロセスとして実行してない。

---
C:\Documents and Settings\takasaks>perl e:/work/0my/scripts/test.pl
_

---

別プロセスで動かしたい、どうれすればよいのでしょうか?
0181デフォルトの名無しさん2007/01/05(金) 13:41:21
system(1, ...);

ActivePerl限定だった希ガス
0182デフォルトの名無しさん2007/01/05(金) 13:45:21
日本語が得意なフランス人みたいな日本語だな。
01831802007/01/05(金) 14:54:17
すげー。うまくいった。ありがとう。m(_ _)m

>>182
確かに今読み直すと変だね。
0184デフォルトの名無しさん2007/01/05(金) 21:25:20
以前、(スクリプトが)短い掲示板がどっかに貼ってあったのですが検索しても見つかりません。
突然もう1度見たいのですが、どなたか知っている方居ませんか?

1行に出来るんだから行数関係ないっていわれそうですが6行くらいで、掲示板として機能していたPerlのプログラムでした。
2chのどこで見たんだったかなぁ、、
0185デフォルトの名無しさん2007/01/05(金) 21:26:55
七行プログラミング part5
http://pc10.2ch.net/test/read.cgi/tech/1142467359/
0186デフォルトの名無しさん2007/01/05(金) 21:32:38
七行プログラミング
http://pc10.2ch.net/test/read.cgi/php/1036141603/
0187デフォルトの名無しさん2007/01/05(金) 22:38:22
>>185-186
それっぽいです。
ありがとうございました。
0188デフォルトの名無しさん2007/01/06(土) 02:56:25
ダイス用のモジュールってありませんか?
$s に 3d20+10 のような文字が入ってたら、20面ダイスを3回振って結果に10を足す、ような。

$s に複数入っててもちゃんと計算してくれるのが良いです。更に言うと 1d6+5-4 のように加算減算も複数扱えると尚良いです。
自作しようかと思ったら結構フクザツで・・・。
0189デフォルトの名無しさん2007/01/06(土) 03:32:00
http://search.cpan.org/~rjbs/Games-Dice-0.99_01/lib/Games/Dice.pm
こんなんあったよ。
あとはsplitしたり調整したりするラッピングするだけで実装できるんじゃない?

そんなマニアックなものあるかよ!と思ったらあったw
恐るべしCPAN
0190デフォルトの名無しさん2007/01/06(土) 03:37:50
置換 + evalで出来るよと言おうとしたけどCPANに真面目なのがあったか。
CPANスゲー
01911882007/01/06(土) 04:23:08
おおー、CPANにあるんですね!
最近 Perl と離れてたんですが、やっぱり便利だ!

ありがとうございました。
0192デフォルトの名無しさん2007/01/06(土) 21:10:42
正規表現で()を後方参照としてではなく、ただの括弧としてマッチさせたい場合どう書けばいいんでしょうか
0193デフォルトの名無しさん2007/01/06(土) 21:13:44
(?:re)
0194デフォルトの名無しさん2007/01/06(土) 21:14:04
(?:pattern)

つperlre
0195デフォルトの名無しさん2007/01/06(土) 21:34:41
おおぅ、それグループ化のみだと思ってました
ありがとうございます
0196デフォルトの名無しさん2007/01/06(土) 21:39:55
\( ではないのか
0197デフォルトの名無しさん2007/01/06(土) 21:48:35
括弧としてマッチさせるには \( が正しいみたいです
お騒がせしてすみません
>>196 ありがとうございます
0198デフォルトの名無しさん2007/01/06(土) 22:19:53
すいません、ちょっと質問ですが、
Perl モジュールをCPANに登録して公開するときって、
GPLライセンスでいいんですか?
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%BB%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9
それとも、この Artistic License ですか?
0199デフォルトの名無しさん2007/01/06(土) 22:26:32
Module::License::Reportなんてのがあるくらいだし
Apache Licenseとかも混じってるし
http://www.google.co.jp/search?num=50&q=site%3Acpan.org+license

なんでもいいんじゃない?
0200デフォルトの名無しさん2007/01/06(土) 23:42:21
>>198
GNUプロジェクトによれば、首尾一貫性と均一性のためにperlと同じライセンス
(GPLとArtistic Licenseのデュアルライセンス)を適用することを推奨されている。

<blockquote cite="http://www.gnu.org/licenses/license-list.ja.html";>
Perl のライセンス
このライセンスでは、Artistic ライセンス とGNU GPLのどちらかを選択できるとしています。
言い換えれば、あなたはこれらの2ライセンスのどちらかから選べるということです。
フリーソフトウェアのライセンスに要求される条件は満たしますが、本物のコピーレフトとは言えないかも知れません。
選択肢の一つとして GNU GPLがありますので、GNU GPLとは矛盾しません。

Perl 4 や Perl 5 用のパッケージを書く場合には、Perl プログラミングの世界における首尾一貫性と均一性を促進するために、
このライセンスを適用されることをお勧めします。Perl 以外の分野では、単に GNU GPL を使う方が好ましいので、
このライセンスを使わないよう強くお勧めします。
</blockquote>

が、好きなライセンスにすりゃ良いんじゃない?

ついでにperlmodstyleには
<blockquote>
Licensing
Make sure that your module has a license, and that the full text of it is included in the distribution
(unless it's a common one and the terms of the license don't require you to include it).

If you don't know what license to use, dual licensing under the GPL and Artistic licenses
(the same as Perl itself) is a good idea. See perlgpl and perlartistic.
</blockquote>
とある
0201デフォルトの名無しさん2007/01/07(日) 02:04:43
修正BSDとかMITとかもあるけど。やっぱりGPL/Artisticのデュアルライセンスにしとくのがいいかな。
0202デフォルトの名無しさん2007/01/07(日) 05:25:31
[1-9.]のみで構成される文字列を表示したいのですが

if ( $text =~ "[1-9.]" ) {
 print "$text \n";
}

だとうまくいきません。
どのように修正すればいいですか?
0203デフォルトの名無しさん2007/01/07(日) 05:25:42
(?: って変数に入れないようにするやつでしょ?
0204デフォルトの名無しさん2007/01/07(日) 05:28:07
print "$&\n" if $text =~/[1-9.]/;
0205デフォルトの名無しさん2007/01/07(日) 05:32:00
文字列だった。すまん
一つだけなら
/[1-9.]+/
すべてなら
print(join(',', /[1-9.]+/g));
0206デフォルトの名無しさん2007/01/07(日) 06:01:09
#!c:\usr/bin/perl ←だとアクセスできますが、
#!usr/bin/perl ←だとアクセ500のエラーがでます。
3時間探しましたが答えが見つかりませんでした。
よろしくお願いします。

os:win2000
webserver:apache 2.059
active perl


0207デフォルトの名無しさん2007/01/07(日) 06:04:39
>>206
#!/usr/bin/perl
0208デフォルトの名無しさん2007/01/07(日) 06:05:19
スラッシュ一個たんなくね?

×#!usr/bin/perl
○#!/usr/bin/perl
0209デフォルトの名無しさん2007/01/07(日) 06:09:07
>>207-208
いろいろやっていくうちに"/"が消えてました。
やっとゴールにたどり着きました。ありがとうございました。
0210デフォルトの名無しさん2007/01/07(日) 06:25:02
>>205
説明不足ですみません。

$text = "12:24" なら $textの表示そのものをしない
$text = "3.142" なら表示する

というような不要な文字が1つでもあれば
無視するといった感じのものが作りたかったのです。
よろしくお願いします。
0211デフォルトの名無しさん2007/01/07(日) 06:30:58
$text =~/^[1-9.]+$/ and print "$&\n";
0212デフォルトの名無しさん2007/01/07(日) 06:32:14
printのとこ、$textじゃなくてわざわざ$&で出力する意味あるの?
0213デフォルトの名無しさん2007/01/07(日) 06:35:49
短縮。
0214デフォルトの名無しさん2007/01/07(日) 06:40:16
>>211
無事作成できました。ありがとうございました。
0215デフォルトの名無しさん2007/01/07(日) 07:26:19
2chのdatファイルを、差分で取得したいのですが、どのようにしたらよいのでしょうか?
0216デフォルトの名無しさん2007/01/07(日) 08:09:31
If-Modified-Since と Range をつけて叩いて 206|304|416 のどれかをもらうようにする
0217デフォルトの名無しさん2007/01/07(日) 14:11:53
package の中で、

sub func(\[$@]) {
 my $class = shift;
 my $arg = shift;
}

として、$arg に配列もしくはスカラのリファレンスを受け取りたいのですが、
$arg にはスカラしか入ってくれません。

どう書くのが正解でしょうか?
0218デフォルトの名無しさん2007/01/07(日) 15:06:23
>>202
\. じゃなくてええの?
0219デフォルトの名無しさん2007/01/07(日) 15:44:04
>>218
自分でちょっと試せばいいだろ

print "Matchn" if 'ABC' =~ /[.]/;
0220デフォルトの名無しさん2007/01/07(日) 17:38:56
>>218
文字クラスの中だから
0221デフォルトの名無しさん2007/01/07(日) 20:45:01
>>217
prototypeに頼らないのが正解。
そのprototype、第一引数について書かれてないけど。
0222デフォルトの名無しさん2007/01/07(日) 22:45:16
ppmをつかってモジュールを持ってくるときに、zipで圧縮されてると展開方法を知らんとエラーが出てしまうのですが、
どうすればこのエラーが出なくなるんでしょう。
0223デフォルトの名無しさん2007/01/07(日) 23:28:08
Archive::Zip入ってる?
0224デフォルトの名無しさん2007/01/08(月) 00:48:56
>>223
入ってます。
0225デフォルトの名無しさん2007/01/08(月) 01:27:07
手元だとzipアーカイブでもインストールできるなぁ。どこのリポジトリの何で発現してる?
0226デフォルトの名無しさん2007/01/08(月) 01:49:50
>>225
ためしに再インストールしようとしたArchive::Zipで出てます。。。
何処のレポジトリかはどうやってわかるんでしょうか。
0227デフォルトの名無しさん2007/01/08(月) 08:59:59
csvの一行目を検索して、二行目をprintするだけなんですが
「ー」を含む言葉だと検索結果で出力されません
「。」「・(半角)」「・(全角)」とか色々やったんですが、どうやら「ー」だけのようです
解決方法をよろしくお願いします

open(IN,"$file");
while(1) {
$line = <IN>;
@data = split(/,/ ,$line);
if ( $line eq "" ) { last;}

if ( $data[0] =~ /$in{'test'}/ ) {
print "$data[1]\n";
}

}
close(IN);
0228デフォルトの名無しさん2007/01/08(月) 11:44:40
>>227
CSVファイルを扱うならば、Text::CSV をお使いください。
(Text::CSV_XS かもしれない、手元にソースがない)
0229デフォルトの名無しさん2007/01/08(月) 12:25:03
>>228
返信ありがとうございます
Text::CSVモジュールを使わないと対処できないということでしょうか?
フリーのwebスペースを利用したいので、モジュールはインストール出来ないです

Text::CSV自体は優れものみたいですね
0230デフォルトの名無しさん2007/01/08(月) 12:27:20
>226
えっと、ppmシェルで、

search Archive-Zip

って入力して。

Searching in Active Repositories
1. Archive-Zip [1.18] Archive-Zip

こんな感じに出てくると思う。仮に1番なら

desc 1

って入力したときなんて表示されてる?
0231デフォルトの名無しさん2007/01/08(月) 13:21:02
>>227
つShift_JISの罠
/\Q$in{'test'}\E/

Text::CSVはマルチバイト文字通ったっけ?
Text::CSV_XSでbinaryオプションを与えない駄目だったような記憶が
0232デフォルトの名無しさん2007/01/08(月) 14:02:13
Text::CSVは0x09(Tab)と0x20(Space)から0x7e(Tilde)の範囲しか使えないね。
Text::CSV_XSでbinaryオプションつけないとダメだ。
0233デフォルトの名無しさん2007/01/08(月) 14:07:57
>>231
返信ありがとうございます。おかげで解決することができました
ただ、「\Q」が「\Eまでのメタ文字をリテラルとして判断する」のは別ったのですが
「/$in{'test'}/」←これのどこにメタ文字があるのかが分らないです
解決はしたけど理解出来てない…
0234デフォルトの名無しさん2007/01/08(月) 14:25:47
>>233
「ー」はShiftJISで0x81 0x5Bと表される。この2バイト目が'[' = 0x5B
他にもソ('\')とか+('{')とか色々。

文字コードの割り当て参考資料
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html

ASCIIコード表
ttp://adlib.rsch.tuis.ac.jp/~akira/lect/softa/ascii.html
0235デフォルトの名無しさん2007/01/08(月) 14:31:01
>>233
「$in{'test'}」自体がメタ文字を含むってことじゃなくて、
実行時に変数$in{'test'}にメタ文字を含むShiftJIS文字が入る可能性があるってこと。
0236デフォルトの名無しさん2007/01/08(月) 14:51:17
>>234-235
かなり見当違いな考えをしてたみたいですね
「ー」以外にも注意しなければいけない文字が結構ありますね
ご丁寧にありがとうございました
0237デフォルトの名無しさん2007/01/08(月) 16:52:09
>>230
1: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz <[email protected]>
Provide: Archive::Zip version 1.18
Require: File-Which
Require: PathTools
Repo: trouchelle
CPAN: http://search.cpan.org/dist/Archive-Zip-1.18/
Installed: 1.18 (perl)
2: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Adam Kennedy ([email protected])
Provide: Archive::Zip version 1.18
Provide: Archive::Zip::BufferedFileHandle
Provide: Archive::Zip::MemberRead
Provide: Archive::Zip::MockFileHandle
Require: File-Which
Repo: ActiveState Package Repository
CPAN: http://search.cpan.org/dist/Archive-Zip-1.18/
Installed: 1.18 (perl)
3: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz ([email protected])
Require: Compress-Zlib
Repo: bribes
CPAN: http://search.cpan.org/dist/Archive-Zip-1.18/
Installed: 1.18 (perl)
こんな感じです。
0238デフォルトの名無しさん2007/01/08(月) 17:32:10
>>227
おもったが、他の文字コードに変換してsplitするのはどうよ。
いちばんお手軽。

open(IN,"$file");
while(1) {
$line = <IN>;
$line=Jcode->new($line)->euc;
@data = split(/,/ ,$line);
if ( $line eq "" ) { last;}

if ( $data[0] =~ /$in{'test'}/ ) {
print Jcode->new("$data[1]\n")->sjis;
}

}
close(IN);
0239デフォルトの名無しさん2007/01/08(月) 17:41:21
たまに思うのだが、単なる文字列のスカラを
"$file" とかって、ダブルクォートで括って書くの無駄だよね。
全く同じ内容の、新しい文字列を生成してる訳でしょ?
だったら単に $file って書いた方が効率良いのに。

KENTとか、どっかのサンプルでわざわざ括るようになってるのかな。
こういう書き方してる人が、どこで習ってくるのか知りたい。
0240デフォルトの名無しさん2007/01/08(月) 17:51:09
>>238
$in{'test'}が正規表現の場合の話か。

EUCにするくらいなら、変換に多少コストが掛かるがUTF-8にして処理したほうがいいと思う。
今度は>>176こういう問題が発生する。SJISでも率は低いが起こるけれどね。

ってもしかして元質問も正規表現を入力する質問だったんだろか…
indexの代わりにマッチングを行ってるだけかと思って\Q\Eで答えちゃったけれども

>>239
最近は見ないけれど
print "@hoge";
とやっておいてなんか表示が変だと質問してくる人までいるから困る。

ついでにperlfaq
ttp://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#What_s_wrong_with_always_quoting
0241デフォルトの名無しさん2007/01/09(火) 00:43:01
>>239
あ、それ昔やってた。
なんかprint = ダブルクォート括らないと不安、みたいな気がしてたような。
0242デフォルトの名無しさん2007/01/09(火) 00:46:26
#俺にも
print $a, $b; #とすればいいところを
print $a . %b; #としていた時代や
print "$a$b"; #としていた時代があったなあ
0243デフォルトの名無しさん2007/01/09(火) 01:05:55
カンマは直接に文字連結の意味じゃないから余り好きじゃないなぁ。。
そっちの方が速いんだけどね。
0244デフォルトの名無しさん2007/01/09(火) 01:39:08
強制的に文字列コンテキストに変えたいときとか。
オブジェクトじゃなくてその文字列表現だけ保持したい場合とかあるでしょ。
02452442007/01/09(火) 01:46:32
ちゃんと読んでなかった。スマソ
0246デフォルトの名無しさん2007/01/09(火) 12:09:24
>>243
散々既出だが、一応突っ込んどく。カンマの方が遲い

use Benchmark ;
my ( $hoge, $moge ) = ( 'hoge', 'moge' ) ;
sub dot { print STDERR $hoge . $moge . "\n" ; }
sub dq { print STDERR "$hoge$moge\n" ; }
sub comma{ print STDERR $hoge , $moge , "\n" ; }
timethese ( 1000000, { op1 => 'dot', op2 => 'dq', op3 => 'comma' } ) ;

$ perl Bench.pl 2> /dev/null
Benchmark: timing 1000000 iterations of op1, op2, op3...
  op1: 15 wallclock secs ( 7.67 usr + 4.81 sys = 12.48 CPU) @ 80128.21/s (n=1000000)
  op2: 12 wallclock secs ( 7.37 usr + 4.67 sys = 12.04 CPU) @ 83056.48/s (n=1000000)
  op3: 22 wallclock secs ( 9.13 usr + 11.23 sys = 20.36 CPU) @ 49115.91/s (n=1000000)
02472432007/01/09(火) 13:10:54
>>246
初心者でゴメン。Windowsだから、nulに出力して実行してみた。
(Windows XP SP2 ActivePerl5.8)
Benchmark: timing 10000000 iterations of op1, op2, op3...
op1: 12 wallclock secs (11.02 usr + -0.02 sys = 11.00 CPU) @ 909173.56/s
(n=10000000)
op2: 12 wallclock secs (10.87 usr + 0.00 sys = 10.87 CPU) @ 919540.23/s
(n=10000000)
op3: 8 wallclock secs ( 7.02 usr + 0.00 sys = 7.02 CPU) @ 1425516.75/s
(n=10000000)
あれ?最初自分の考えでは関数を二回使ってるカンマの方が遅いと思ってたんだけど、
ベンチしたらドットの方が速いんで>>243を書いた。
なんで結果違くなっちゃうのか誰か教えて〜。
02482432007/01/09(火) 13:29:23
あー、わかった。Perlでの出力処理はcommaの方が速いけど、
systemのIOでのオーバーヘッドで結果的にdotの方が速いという寸法か。>>246
Windowsで実際にファイルに出力して計測してみると大体同じ(わずかにcommaが速い)になった。
ここらへんはLinuxとWindowsで違うんだろうね。
0249デフォルトの名無しさん2007/01/09(火) 14:06:58
>>246
うんにゃ。

8Bのメモリ確保なら大してコストかからんからサンプルとして不十分じゃないか?。
$hogeが十キロの単位になってくるとカンマが追い抜くんじゃないだろうか。
0250デフォルトの名無しさん2007/01/10(水) 01:42:28
>>248
いや、>>246はSTDERRに出力してるからカンマ区切りが遅くなっているだけ。

STDERRはperl内部でも特別扱いされていて、カンマで区切られた要素毎に fflush される。
なので、STDERRへ出力する場合はカンマ区切りの方が(fflushの増える分だけ)遅くなる。
他のハンドルだと($|=1でも)、普通はカンマ区切りの方が速くなる。
0251デフォルトの名無しさん2007/01/10(水) 04:22:12
えっちだから遅いんだね。
0252デフォルトの名無しさん2007/01/10(水) 15:25:22
フリーウェアのソースを眺めてると、一つのファイルにやたらと機能を詰め込んでるのが
多いように感じるんだけど、これってどうなんだろう。
掲示板だったら、表示.cgi 書込み.cgi とか分けた方が保守しやすいのでは、と。
意見求みまする。
0253デフォルトの名無しさん2007/01/10(水) 15:43:02
>>252
インスコするファイルがたくさんあるとお子様が混乱してしょうもない
質問で邪魔してくるので、ソースメンテする手間はかかるけどトータル
では得らしい。
0254デフォルトの名無しさん2007/01/10(水) 15:51:55
コーディング外の質問です。
今、plファイルのwindows向けのアイコンを何となく作っていますが、
真珠っぽいのがファイルについたアイコンか、らくだの絵のアイコンかどちらがふさわしいと思いますか?
0255デフォルトの名無しさん2007/01/10(水) 16:07:31
当然らくだ
0256デフォルトの名無しさん2007/01/10(水) 16:18:38
PARのparl.exe
0257デフォルトの名無しさん2007/01/10(水) 16:25:41
>>256
0258デフォルトの名無しさん2007/01/10(水) 20:00:56
初めて書き込みさせて頂きました。

現在、perl(HPUX)とNet-Telnet-3.03を利用してtelnet接続しているのですが、
telnet中にESCキーを入力させる事は可能なのでしょうか?

perl:v5.8.0 built for PA-RISC1.1-thread-multi
telnet:Net-Telnet-3.03

対話式なプログラムを実行していき、途中で
どうしてもESCキーが必要になりました。

$telnet->print("\x1B");
こんな感じで文字コード入力でもダメでした。。
0259韋駄天はふと考えた2007/01/10(水) 23:02:23
あなた達も↓のような経験が一度や二度あるでしょう。私はわずか4年の間に
2回もパソコンをウイルスによって不調になり使えなくなりました。
私達はパソコン製造業者及び修理業者とパソコン関連で商売をしている業者を
あまりにも野放にしすぎました。
その結果が自作自演ウイルスバラ撒きの悪徳商法です。

703 :韋駄天はふと考えた :2007/01/10(水) 22:11:17 ID:ZKnpXOph
ノートンがウイルスを検出しました。
あなたのパソコンを60日間に渡り78250個ものウイルスから守ってきました。
もうすぐ無料期間が終わりますので、ウイルス対策有料ソフトを購入してください。

はぁ????なにいってんの?なんで、たった60日間で78250個ものウイルスが進入してくんだよ?
明らかに自作自演目的の業者の仕業じゃねえか?

犯人はおまえらだろが!この犯罪者かぶれの集団が!!

あちこちのサイトを開く度にコンピューターウイルスがパソコンにバンバン進入してくる。

おまえらな!自分で作ったサイトにコンピューターウイルスを混ぜて、他人の
何十万台ものパソコンを不調にさせたり故障させて、ウイルス対策ソフトを
高額で売りつけてまで儲けたいのかよ?

自転車屋が地域の自転車をパンクさせて回ったり、消防士が管轄地域で放火して
回るのと同じ犯罪をおまえらがやっているんだよ!

てめえらで新たなコンピューターウイルスを次々に作ってはバラ撒いては、ウイルス対策ソフトを
高値で売りつける自作自演商売しやがって!

この腐れ外道共が!    恥知らずの犯罪者共めが!
0260デフォルトの名無しさん2007/01/10(水) 23:06:09
>254
でっかく「PL」とか「Perl」の文字が入ってるアイコンとか……。(聞いてない)
0261デフォルトの名無しさん2007/01/11(木) 00:08:30
>>255
公式のらくだの絵をちょっと使って作ってみました。
>>256
あれはそのままでも結構かっこいいのですが、ちょっと抵抗があったので。。
>>260
一応Perlの文字を入れました。

どうもでした。
0262デフォルトの名無しさん2007/01/11(木) 01:01:46
ファイルを最終行から順にさかのぼって読む方法ないですか?
seek , getc等で1文字単位で読むしかないかな?
0263デフォルトの名無しさん2007/01/11(木) 01:09:57
>>262
つFile::ReadBackwards
0264デフォルトの名無しさん2007/01/11(木) 01:15:30
>>263
ありがとうございます。
0265デフォルトの名無しさん2007/01/11(木) 17:03:13
課題で
aを1文字の文字列、$bを数字とし、上の行から$aを$b回と表示していき、3角形を描くプログラム。
というのが出ています。

print "a? ";
chomp($a=<stdin>);
print "b? ";
chomp($b=<stdin>);

でaに+をいれ、bに5といれると

+
++
+++
++++
+++++

こんな感じで表示させたいです。
for文の入れ子でやると思うのですが、表記がわかりません。
ヒントだけでもいただけないでしょうか?
0266デフォルトの名無しさん2007/01/11(木) 17:09:13
bに1を足してaをb個並べてプリントしたら改行を繰り返す
0267デフォルトの名無しさん2007/01/11(木) 17:19:33
forの入れ子でやるとかいうと、もしかしたらこういう
おぞましいコードを期待してるかもしれないんだけど
for (my $line=1; $line <= $b; ++$line) {
for (my $num=1; $num <= $line; ++$num) {
print $a;
}
print "\n";
}

こういう風に簡潔にかける。
for my $num (1..$b) {
print $a x $num, "\n";
}
0268デフォルトの名無しさん2007/01/11(木) 17:21:58
あと $a と $b は sort とかで使われるから使うなといっとけ
02692652007/01/11(木) 17:33:51
>>267
できました。ありがとうございます。
入れ子でわけわからない長いプログラムを作っていた自分がアホらしくなりましたw

もし入れ子でやるとしたら
入れ子の方の後半部分の
print $a;
}
print "\n";
}
はどういうことでしょうか?
0270デフォルトの名無しさん2007/01/11(木) 17:34:37
すぐ答え出す奴ってなんなの・・・
0271デフォルトの名無しさん2007/01/11(木) 17:54:51
漁師さん
0272デフォルトの名無しさん2007/01/11(木) 18:12:08
こういう場合は普通、for文を使わずにトリッキーなコードを書いてあげるのが
お決まりなんだけどね。
0273デフォルトの名無しさん2007/01/11(木) 18:21:32
print map { $a x $_ . "\n" } 1..$b;

0274デフォルトの名無しさん2007/01/11(木) 18:58:59
チューニングした答え書いて分かるかよ。
いっそのことCPANで(笑
02752672007/01/11(木) 19:02:50
$a='+';$b=5;$t=0;
(${a}x(($b*$b+$b)/2))=~m{((??{++$t;".{$t}"}))(?{print"$^N\n"})}g;

こうですか?わかりません><
0276デフォルトの名無しさん2007/01/11(木) 19:17:38
$^Nなんて使ってるのはじめてみた(笑)
0277デフォルトの名無しさん2007/01/11(木) 19:26:01
(笑)なんて使ってるのはじめてみた(笑)
0278デフォルトの名無しさん2007/01/11(木) 20:25:30
確かにな(藁
0279デフォルトの名無しさん2007/01/11(木) 20:27:11
まぁ、ありえない
0280デフォルトの名無しさん2007/01/12(金) 02:12:36
print map "$_¥n", unpack +( join '', map "A${_}X${_}", 1..$b ), $a x $b ;
不毛だ…
0281デフォルトの名無しさん2007/01/12(金) 02:31:38
$_が半角文字"@"(0x40)を含むときのみデータを取得したいのですが、
以下のコードだと、$_が"病院"(0x95,0x61,0x89,0x40)とかの場合でも
データを取得してしまいます。
このような2バイト文字を取得しないようにするには
どの様に修正すればいいですか?

if ( $_ =~ "@" ) {
 $data[$i++] = $_;
}
0282デフォルトの名無しさん2007/01/12(金) 03:56:45
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz

CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。

具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。

渡されてきたURLを「http://www.xxx.com/index.php?%A5%AC%A5」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。
0283デフォルトの名無しさん2007/01/12(金) 04:00:48
>1に全てが隠されているんじゃないだろうか。
0284デフォルトの名無しさん2007/01/12(金) 04:08:40
>>283
orz
CGIはスレ違いだったんですね。本当にごめんなさい。
一日考え続けてて疲れてたのか、>>1を確認するのを失念してました。
向こうの初心者質問スレで質問してくる事にします。
スレ汚し失礼しました。
0285デフォルトの名無しさん2007/01/12(金) 04:14:03
プログラム板から誘導されて来ました。
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz

CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。

具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。

渡されてきたURLを「http://www.xxx.com/index.php?%A5%AC%A5」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。
0286デフォルトの名無しさん2007/01/12(金) 04:20:09
ぎゃー!!!
ありえない誤爆・・・。

ほんっとうにごめんなさい・・・。
0287デフォルトの名無しさん2007/01/12(金) 04:23:33
>1に全てが隠されているんじゃないだろうか。
02882812007/01/12(金) 04:29:08
自己解決しました。
おさわがせしました。
0289デフォルトの名無しさん2007/01/13(土) 00:44:28
>>281見てて、ふと、半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
うーんうーん悩んでいた時のことを思い出した。
そういや、半角英字を全角英字に置換することってできるの?
0290デフォルトの名無しさん2007/01/13(土) 00:53:02
use utf8やるとか。
0291デフォルトの名無しさん2007/01/13(土) 01:42:35
EncodeもあるしUnicode::Japaneseもあるし。
0292デフォルトの名無しさん2007/01/13(土) 22:09:16
WebProg板に書いたけど、こっちの方がふさわしそうなので
こちらでお聞きします。

キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、
C言語でいうところの、getch() に相当する関数はないでしょうか?
0293デフォルトの名無しさん2007/01/13(土) 22:10:05
4年前ぐらいまでPG兼SEをしていたのだが、
そのころと比べるとかなりPerlは寂れた?
0294デフォルトの名無しさん2007/01/13(土) 22:34:22
>>292
Term::Getch
0295デフォルトの名無しさん2007/01/14(日) 00:42:13
こんな配列 @result=("E:15000", "S:20000", "W:15000", "N:50000")を作りまして
ここから、1位=N、2位=S、3位=E、4位=W、という結果を出したいと思っています。
得点が同点の場合、E→S→W→Nの順で優先となります。

とりあえず、$rank{E}='15000',$rank{S}='20000',,,として、
if(($rank{E}>=$rank{S})&&($rank{E}>=$rank{W})&&($rank{E}>=$rank{N})){
#E=1位
#SとWとNで2位以下の判別
  #何かと何かで3位と4位の判別
} elsif (($rank{S}>=$rank{W})&&.......
#S=1位
#EとWとNで2位以下の判別
  #何かと何かで3位と4位の判別
}elsif(..
と、やり始めましたが、とてつもない作業になりそうです。
何か、よい解決法がございましたらご示唆お願いします。

0296デフォルトの名無しさん2007/01/14(日) 00:49:18
普通にソートすりゃいいやん

@result= sort {(split/:/,$b)[1]<=>(split/:/,$a)[1]} @result;
0297 ◆TWARamEjuA NGNG?BRZ(6701)
とん・なん・しゃー・ぺー♪
0298デフォルトの名無しさん2007/01/14(日) 01:06:36
use strict;
# こんな配列
my @results = ("E:15000", "S:20000", "W:15000", "N:50000");

# 得点が同点の場合の順
my %prio_of = (
E => 0, S => 1, W => 2, N => 3,
);

my @s_results = map { $_->[0] }
sort { $b->[2] <=> $a->[2] || $prio_of{$a->[1]} <=> $prio_of{$b->[1]} }
map { [ $_, (split/:/=>$_)] } @results;
0299デフォルトの名無しさん2007/01/14(日) 01:23:07
数値として使う予定の変数を、文字列で宣言するのって確か非効率だよね。

随分長い間Perlから離れてるので間違ってるかも知れないけど
$foo = '2000';
と文字列にしておいて、その後で $foo を数値として使った場合、
スカラ変数の構造体は、
文字列型のものから、数値も文字列も両方入る奴に切り替わる。
構造体切り替えの手間もあるし、構造体のサイズも大きくなるから非効率

…だったような気がする。
03002952007/01/14(日) 01:43:35
すばやいご提示、ありがとうございます。
>>296 様
すみません、説明が不足していました(ということに気づくのに、いただいた式を
眺めながらかなり時間がかかりました・・・)。実は、EやSが変数の中に出てくる
順番は毎回変わる可能性がありました。申し訳ありません。
>>298 様
欲しい結果が出せました。ただ、内容の理解には私にはまだまだ時間がかかりそうです・・
なんとか少しずつ、吟味していきたいと思います。
>>297 様
わかりましたか。そのとおりです。

皆様、すばらしいご教授、どうもありがとうございました。
0301デフォルトの名無しさん2007/01/14(日) 01:59:22
>>299
perl は型はなしでしょ。
$foo = '2000';
も
$foo = 2000;
は同じでしょ。
0302デフォルトの名無しさん2007/01/14(日) 02:13:38
>>301
つ [perlguts]
つ [Devel::Peek]
0303デフォルトの名無しさん2007/01/14(日) 02:45:43
>>302
もちっと教えてくれんかのう。
perldataには
「あるスカラー変数が、“文字列”型、“数値”型、“ファイルハンドル”型、
あるいはその他の型であるように宣言する方法はありません。」
とあるかんだけど、それとは違うレベルで何かあるのか?
0304デフォルトの名無しさん2007/01/14(日) 03:03:20
提示されている情報ぐらい見なさい。
> Double-Typed SVs
> スカラー変数は通常、整数、倍精度、ポインタ、リファレンスのうちの いずれか一つの型をとります。Perl は実際のデータに対して、
> 蓄積されている型から要求されている型へ、自動的に変換を行ないます。
03052652007/01/14(日) 03:39:50
>>275 を提出したんですが、授業後
せんせから呼び出し受けました。
03063032007/01/14(日) 03:57:55
>>304
どうもありがとう。
文脈によってperl内部で数値と評価されたり文字列として評価されたりすることは分かっています。
しかし、シンタックス上
$foo = '2000';
と
$foo = 2000;
に違いがあるとは読み取れませんでした。

#$foo = '2000' . '';
#と
#$foo = 2000 + 0;
#が違うのはわかりますよ。
03073032007/01/14(日) 04:24:03
試してみれば良いんだね。
$foo = 2000;
の場合数値コンテキストになるんだ。(そりゃそうか)
0308デフォルトの名無しさん2007/01/14(日) 13:40:27
>>305
ワロタ
なんていわれたの?w
0309デフォルトの名無しさん2007/01/14(日) 14:38:20
先生が読めなかったか
先生がこのスレを見ていたか

どっちかな
0310デフォルトの名無しさん2007/01/14(日) 14:54:53
>>289
>半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
>うーんうーん悩んでいた時のことを思い出した。
>そういや、半角英字を全角英字に置換することってできるの?

次スレのテンプレ予定の>>115に忠実に従えば、
tr/a-zA-Z/a-zA-Z/
でできる。
0311デフォルトの名無しさん2007/01/14(日) 14:58:44
print "@{[1+1]}", "${\(1+1)}";

こういうテクニック(?)を思い出したんですけど、どこに書かれていたものでしょうか。
0312デフォルトの名無しさん2007/01/14(日) 15:01:00
>>306
use Devel::Peek;
$foo1 = '2000';
Dump $foo1;
$foo2 = 2000;
Dump $foo2;
↓
SV = PV(0x363bc) at 0x18aef9c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x3dc2c "2000"\0
CUR = 4
LEN = 8
SV = IV(0x18a68b8) at 0x18af02c
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2000
03132992007/01/14(日) 20:42:44
やっぱりPVIVになった。どうやら >>299 に書いた記憶通りだったみたい。

use Devel::Peek;
$foo = '2000';
Dump $foo;
$foo += 1;
Dump $foo;

SV = PV(0x1801660) at 0x180b5a8
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x300c70 "2000"¥0
CUR = 4
LEN = 5
SV = PVIV(0x1801a20) at 0x180b5a8
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2001
PV = 0x300c70 "2000"¥0
CUR = 4
LEN = 5

この状態でFLAGSをC側からいじると、
文字列として表示した時と、数値として使った時で別の値を出すスカラ
とか作れちゃうんだよね。
0314デフォルトの名無しさん2007/01/14(日) 22:35:50
>>313
実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。
ttp://search.cpan.org/~dconway/Contextual-Return-v0.1.0/lib/Contextual/Return.pm
use Contextual::Return;

$contextual = NUM { 10 } STR { 'abc' };
print $contextual . '';
print $contextual + 0;
03153142007/01/14(日) 22:43:39
ああ、失敗。よく考えたら流石に代入は無理だな。…Tie使ったら或いは出来たりしそうな気もしないでもない。
313はスカラを作ると言うことで代入した別の値を保持まで出来たりするのかな
0316デフォルトの名無しさん2007/01/14(日) 23:55:02
Scalar::Utils の dualvar は?
0317デフォルトの名無しさん2007/01/14(日) 23:56:11
ごめん、Scalar::Util だった。
ttp://search.cpan.org/~gbarr/Scalar-List-Utils-1.19/lib/Scalar/Util.pm
0318デフォルトの名無しさん2007/01/14(日) 23:59:37
>実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。
スルーしてた。xs を使って実現したのが Scalar::Util の dualvar ってことっすね。
0319デフォルトの名無しさん2007/01/15(月) 00:09:24
dualvar でスカラ作ってみたけど、
作った後で代入し直したら、片方だけ(数値だけ or 文字列だけ)になっちゃった。

ということは、xsでフラグいじって IOK, POK 両方立てても
代入したら片方になっちゃうということか。
オブジェクトにして代入まで見張れば良いんだろうけど。
0320デフォルトの名無しさん2007/01/15(月) 01:57:29
webサーバをan httpdからapacheに変更したところ文字化けする部分が出てきました。
method=getで受けとった部分が文字化けしてしまいます。method=postは大丈夫でした。
よろしくお願いします。
↓の一番下の部分も参考にしましたが直りませんでした。
http://tech.bayashi.net/pdmemo/chara2.html
apache perlは↓のサイトを参考に構築してあります。
http://www.y-kit.jp/saba/
------------------------------
環境
Apache/2.0.59 (Win32) PHP/5.1.4
------------------------------
コード例
require './jcode.pl';
#GET用
$myindata=$ENV{'QUERY_STRING'};
#POST用
#read( STDIN, $myindata, $ENV{ 'CONTENT_LENGTH' } );
#$myindata =~ tr/+/ /;
#$myindata =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;
&jcode'convert( *value, 'sjis' );
print "Content-type: text/html\n\n";
print $myindata;
------------------------------
getデータ
http://localhost/bbsmt/write.cgi?name=a&mail=&message=あいうえお&a=11
表示データ
name=a&mail=&message=???¢???|?¨&ip=&a=11
0321デフォルトの名無しさん2007/01/15(月) 02:03:07
>1に全てが隠されているんじゃないだろうか。
0322デフォルトの名無しさん2007/01/15(月) 12:39:35
以前使っていたサーバでdbmファイルを使っていたのですが、
そのまま別のサーバに移動したら読み込めなくなりました。
dbmファイルは.dirと.pagの2つじゃない方(1つのファイル)です。
古いサーバはもう使えません。新しいサーバでdbmファイル
を読む方法はないでしょうか…。
0323デフォルトの名無しさん2007/01/15(月) 14:43:05
>>322
質問する時はまず環境を説明しろ!
(古い方と新しい方それぞれのOSの種類とバージョン,Perlのバージョン)

あと、読めなくなったってのはどんなエラーメッセージが来てるのかも報告汁
0324デフォルトの名無しさん2007/01/15(月) 19:18:22
>>322
ヒントになるかわからんが
NDBM_File
DB_File
GDBM_File
SDBM_File
ODBM_File
03253202007/01/15(月) 20:46:35
別のとこで質問してきます。
03263222007/01/15(月) 20:58:26
読めなかったと思ったら読めました。お騒がせしました。
dbmファイルはテキストなどに書き出しておかないとバイナリでサーバを移しても
読めないのだと思っていました。dbmopen()で読み書きしていたので、どの
形式のDBMかわからなかったのです。
0327デフォルトの名無しさん2007/01/16(火) 05:56:00
perlerのエロイ人教えて!ワッフルワッフル

指定されたディレクトリのディレクトリハンドルを開いて
ディレクトリ内のファイル名を取得するスクリプトを書いたのですが
名前が長いファイルがあるとそのファイルと、それ以降のエントリが
ディレクトリハンドルから取得できないんだけど
なんで?これどうすれば回避できる?

環境: Windows XP + ActivePerl5.8.8 build819
0328デフォルトの名無しさん2007/01/16(火) 07:04:48
esperのエロイ人が来て
お前の書いたスクリプトを透視した上で回答してくれるのを待つことだ
03293272007/01/16(火) 10:55:47
>>328
再現スクリプトを下記に示します。
DirHandle以外にopendirでディレクトリハンドル開いたり、
globを使ってみたけど結果はおんなじでした。

----
#!/usr/local/bin/perl
use strict;
use utf8;
use warnings;
use FindBin;
use DirHandle;
use Data::Dumper;
my $dh = DirHandle->new($FindBin::Bin) or die $!;
my @entries = $dh->read;
print Dumper(\@entries);

__END__
----
0330デフォルトの名無しさん2007/01/16(火) 10:58:29
名前が長いファイルの例は何ですか?
0331デフォルトの名無しさん2007/01/16(火) 11:02:27
質問します。

foreach( sort(glob("*")) ){
if(-d){
@local_dir = (@local_dir,$_) ;
}elsif(-f){
@local_file = (@local_dir,$_) ;
}else{
print "Not Support Format -> $_\n" ;
}
}

ファイルとディレクトリに分けたいのですが、
ローカルだと上記のようにできますが、(他にスマートなやり方があるかもしれませんが。。)
ftp上のファイルを区別する方法はありますでしょうか。
以下ではどちらも同じファイルを取得してしまいます。

use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
foreach( $ftp->ls("./") ){
print "$_\n" ;
}
foreach( $ftp->dir("./") ){
print "$_\n" ;
}
$ftp->quit;
03323272007/01/16(火) 11:19:46
>>330
全角数字0から9を繰り返すのを160文字 + .txt
のファイル名を用意したら再現しました。
全角数字100文字の場合はファイル名が取得できました。
パスは
D:\test
で実験しました。
95系は絶対パスで255byte以下、
NT系は絶対パスで255文字以下と認識してるのですが
このへんの絡みですかね?
03333272007/01/16(火) 11:26:39
>>331
Net::FTP::Fileにisfileとisdirってメソッドあるよ。
インスコするかインスコできないならCPANでソース閲覧して参考にすればいけるのでは
03343272007/01/16(火) 12:18:54
似たケースを見つけた。
ActivePerlのバグ?
http://www.namazu.org/ml/namazu-win32-users-ja/msg01954.html
0335デフォルトの名無しさん2007/01/16(火) 12:31:39
バグではなく仕様。
WinAPIでも使っとけ。
03363312007/01/16(火) 13:23:32
>>333
出来ましたー。
最初ソース見て作ろうと思いましたが
面倒臭くなって結局インスコしましたw
ありがとうございます。
03373272007/01/16(火) 13:44:46
>>336
もめでとう! こっちはいまだにはまり中 orz

>>335
バグじゃなくて仕様なの?
ちなみにWin32::APIを使ってみたけどなぜか取得できない。。。
03383272007/01/16(火) 13:51:26
Win32::APIを使った再現スクリプト

----
#!/usr/local/bin/perl
use strict; use utf8; use warnings;
use Data::Dumper; use Encode; use File::Spec; use FindBin; use Win32::API;
Win32::API::Struct->typedef('FILETIME', qw(
DWORD dwLowDateTime; DWORD dwHighDateTime;)) or die $!;
Win32::API::Struct->typedef('WIN32_FIND_DATA', qw(
DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow;
DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[260];
TCHAR cAlternateFileName[14];)) or die $!;
my $FindFirstFile = Win32::API->new('kernel32', 'FindFirstFile', 'PS', 'N') or die $!;
my $FindNextFile = Win32::API->new('kernel32', 'FindNextFile', 'NS', 'I') or die $!;
my $FindClose = Win32::API->new('kernel32', 'FindClose', 'N', 'I') or die $!;
my $path = File::Spec->catdir($FindBin::Bin, '*');
my $FindData = Win32::API::Struct->new('WIN32_FIND_DATA') or die $!;
my $hFind = $FindFirstFile->Call($path, $FindData);
$hFind == -1 and die $!;
my @list = ($FindData->{cFileName});
push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData;
$FindClose->Call($hFind);
print Dumper(\@list);
__END__
03393272007/01/16(火) 13:56:10
書込み時に改行多いって怒られたから改行を削ってたら
FindNextFileの閉じ括弧までまちがえて削っちゃった orz
>>338のソースは

×push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData;
○push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData);

でお願いします。 m(_ _)m
0340デフォルトの名無しさん2007/01/16(火) 13:56:31
この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。
この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、
パスの前に "\\?\" という接頭辞を追加してください。
詳細については、MSDN ライブラリの「File Name Conventions」(ファイル名の規則)を参照してください。
03413272007/01/16(火) 14:45:03
>>340
どもです、自分もおんなじ情報に行き当たりました ;p
http://mag.autumn.org/Content.modf?id=20050930181032

Find(?:First|Next)FileじゃなくてFind(?:First|Next)FileWを使えってことなんですね。。。
ディレクトリのファイル一覧を取得する部分だけで苦労するな。。。
0342デフォルトの名無しさん2007/01/16(火) 14:51:49
>>327
http://msdn2.microsoft.com/en-us/library/aa365740.aspx
typedef struct _WIN32_FIND_DATA {
...
TCHAR cFileName[MAX_PATH];
0343デフォルトの名無しさん2007/01/16(火) 23:00:35
作ってもらった

    __
    |   |
    |   |   ___                  ___
    |   | .  /     |  __    _____   / _  \
    |   |  /  /|  |  /  /   / ____/  / /  >  l
    |   |. /  / .|  |. /  /   / /..   _    /   ̄  /
    |   |/  /  |  |/  /   /   ̄ ̄_/   /      \
    |       /.   |     /   / / ̄ ̄ __   /  / ̄ ̄>  |
    |    /   |___/  ./   ̄ ̄ ̄ /  /    ̄ ̄  /
     ̄ ̄ ̄             ̄ ̄ ̄ ̄ ̄     ̄ ̄ ̄ ̄ ̄     _____      ___ ___    ___
    ______                             /__  __/ [][] _| |_| |__ _| |_
     |  ___  \                               / /     |    _  | |_  レ'~ ̄|
     |  |    \  l                              |  |_      ̄|  | / / /   /| |
     |  |____/  /                             \__|      |  |  ̄ /_  /.  | |_
     |  ____/ ___  __    __/ヽ                    |_|.     |__|.   \/
     |  |     /`、_/_/ / _ ヽ  / _  /
     |  |     ヽ  /   | l   l l  | l   l l
     |  |       | l     ヽ  ̄ /  ,ヽ  ̄ /
      ̄          ̄      ̄ ̄  / __ ヽ
                        | l     l l
                        ヽ  ̄ ̄ /
                         ~ ̄ ̄~
0344デフォルトの名無しさん2007/01/16(火) 23:04:28
ちょっとでかいな
03453272007/01/17(水) 01:05:42
ActivePerlではうまくいかないみたい。。。
http://aspn.activestate.com/ASPN/Mail/Message/libwin32-perl/2995279
03463272007/01/17(水) 06:15:16
http://aspn.activestate.com/ASPN/Mail/Message/2996684
こちらのやり方で取得出来ました。

何度も自己レスすみませんでした m(_ _)m
0347デフォルトの名無しさん2007/01/17(水) 18:25:14
Perl 覚えたらこんなもの作れるようになりました。


 █   █   █      █          █▀▀▀▅
 ▀▅ ▅▀▅ ▅▀ ▅▅▅  █▅▅▅       █   █ ▅ ▅  ▅▅▅   ▅▅▅▅
  █ █ █ █ █▅▅▅█ █   █      █▀▀▀  █▀  █   █ █▅▅█
  ▀▅▀ ▀▅▀ █   ▅ █   █      █     █   █   █ █▅▅▅
   ▀   ▀   ▀▀▀  ▀▀▀▀       ▀     ▀    ▀▀▀  ▀▅▅▅▀

     ▅▅▅▅▅▅   ▅    ▅      █
 ▀▀▀▀ ▅▀  ▅   █ ▅▅▅█▅▅  ▀▀█▀▅▀▀▀▅
     █  █ ▀ ▀▀▀█      █  ▅█▀    █
     █         █   ▅▅▅▀ ▅▀█     █
     ▀▅         █       ▀ █     █ ▅
       ▀▀▀      ▀         ▀      ▀
0348デフォルトの名無しさん2007/01/17(水) 19:19:36
http://perldoc.jp/docs/perl/5.6.1/perlfaq5.podの
どうすればファイルハンドルをサブルーチンに局所化できますか?〜
の項目にあるサンプルコードの
local $_; # ← とても重要
の意味は一体なんでしょうか。
0349デフォルトの名無しさん2007/01/17(水) 19:31:19
sub owata {
  # local $_;
  $_ = "\(^o^)/";
}

$_ = "/(^o^)\";
owata;
print;


local $_; の行をコメントアウト/インして実行してみよう!
0350デフォルトの名無しさん2007/01/17(水) 19:48:51
ありがとうございます。でも余計にわからなくなったorz
実はこんなコード書いて試してみたんですがlocal $_;あっても無くても同じように動くんですよね

# lstはファイル名のリスト
open (FH, '< lst') or die;
while (<FH>) { print; &localtest }
close FH;

sub localtest
{
local *FH;
open (FH, $_) or die;
#local $_;
while (<FH>) { print }
}

何が違うのかも教えていただけたらうれしいです。
0351デフォルトの名無しさん2007/01/17(水) 19:58:12
$_はグローバルだから他で使われてるかもしれない。特に
左辺値でないもののaliasだったりすると値を書き換えることも
できないしな。

foreachのときは暗黙にlocalにしてくれるけど。
0352デフォルトの名無しさん2007/01/17(水) 21:12:34
>>350
localtest 呼び出しの後 $_ は書き換わってるけど、
すぐに次のループに入るので問題がないだけ。

while (<FH>) { print "begin: $_"; &localtest; print "end: $_" }

とかやってみると、違いがわかると思うよ。
03533502007/01/17(水) 23:02:32
ありがとうございます。ようやく理解できました
しかし350のコードはアホですね…何をやっているんだか
この分じゃ他にもいろいろ勘違いしていることありそうで怖いです。
とりあえずほとんど理解せず使ってる型グロブをもうちょっと調べてみよう…
0354デフォルトの名無しさん2007/01/18(木) 00:01:12
間接的なファイルハンドル使おうよ
open my $fh, '<', 'filename' or die;
0355デフォルトの名無しさん2007/01/18(木) 02:29:27
FileHandleやIO::Fileって使わないの?
03563312007/01/18(木) 09:36:42
331で質問したモノです。
また壁にぶち当たりました。
ftpしたあとのファイル、ディレクトリの日付、サイズを取得したいので調べてましたが
use Net::FTP::File;のNet::FTP::fstatは作りかけのようで使用出来ませんでした。
$ftp->dir(./)で拾って日付を抜こうと思いましたが、日本語環境と英語環境で
表示が異なるので断念しました。
何か取得方法はないでしょうか。

use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
0357デフォルトの名無しさん2007/01/18(木) 09:45:05
>>356
> 何か取得方法はないでしょうか。

マニュアルを見ると分かるんじゃないでしょうか
0358デフォルトの名無しさん2007/01/18(木) 12:07:32
Perlで文字列にunicodeが含まれているかどうかを判断するにはどうすればいいですか?
0359デフォルトの名無しさん2007/01/18(木) 12:20:56
「文字列にunicodeが含まれている」という言い方があいまい杉。

あるバイト列の文字コードがunicode由来のものであることを知りたいのか
(エンコーディングの仕方が何通りもあるので)

→ Encode::Guess。ただし完全な判定は無理。

UTF-8フラグが立った文字列であることを知りたいのか

→Encode::is_utf8(あるいはutf8::is_utf8)

それともぜんぜん別のことなのか
0360デフォルトの名無しさん2007/01/18(木) 12:45:35
>>359
unicode由来のもであるかどうかです
それと環境はPerl5.0でJcode.plです
03613562007/01/18(木) 13:54:08
調べていたらNet::FTPのmdtmが使えそうだったので
書いてみましたがエラーが出ました。
使い方が間違えているのでしょうか。

$host = "***" ;
$user = "***" ;
$pass = "***" ;

use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
foreach($ftp->ls()){
$aaa = $ftp->mdtm($_) ;
print "$aaa\n" ;
}
0362デフォルトの名無しさん2007/01/18(木) 16:20:51
>>361
Net::FTPの使い方としては間違ってないよ。
エラーってnot a plain fileのことか?
とりあえずエラーの理由知りたけりゃDebug=>1設定しなさい。
0363デフォルトの名無しさん2007/01/18(木) 16:24:58
>>360
jcode.pl は Unicodeには対応していないはず。
Perl 5.0 なんて時代遅れなもの使うのやめたら?
0364デフォルトの名無しさん2007/01/18(木) 16:29:49
時代は6だな
03653612007/01/18(木) 16:36:17
---------------------------------------------------------------------------
#!/usr/local/bin/perl -w -- # -*-Perl-*-
use strict;
use warnings;
use Net::FTP;

my $host = "txfs02" ;
my $user = "g-fan" ;
my $pass = "fan" ;
my $aaa ;

my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
foreach($ftp->ls()){
$aaa = $ftp->mdtm($_) ;
print "$aaa\n" ;
}
---------------------------------------------------------------------------

↑これを実行すると一つのファイルにつき↓このメッセージが出ます。
色々試してはいますが詰まっていますorz

Use of uninitialized value in concatenation (.) or string at bbb.pl line 15.
0366デフォルトの名無しさん2007/01/18(木) 16:47:09
>>365
>Use of uninitialized value in concatenation ...
何も無いものをprintしようとしたからwarningsが出たわけ
print "$aaa\n";
を
print "$aaa\n" if $aaa;
で
03673612007/01/18(木) 16:52:50
>>366
そうなんです。
全てのファイルのmdtmがundefになってるんですよね。
だいたい”foreach($ftp->ls()){”でファイルを拾っているので
ファイル名を間違えているとかそういうのは無いはずなんですが。
0368デフォルトの名無しさん2007/01/18(木) 17:03:16
Debug=>1にすると俺の環境では

ディレクトリはエラーでnot a plain fileを返してる(undef)
ファイルはtimeを返してる

0369デフォルトの名無しさん2007/01/18(木) 17:07:02
>>367
> ファイル名を間違えているとかそういうのは無いはずなんですが。

「はず」じゃなく確認しる。

とはいえ、手元で動かしてみたところ、同じエラーが出て失敗したり
成功したりする。なんじゃらほい。
0370デフォルトの名無しさん2007/01/18(木) 17:15:03
>>369
> とはいえ、手元で動かしてみたところ、同じエラーが出て失敗したり
> 成功したりする。なんじゃらほい。

急いで捕捉すると、テストに使った対象ftpサーバが、複数個をラウンドロビン
していたようた。要するに、ftpサーバソフトウェアによって成功したり
失敗したりしていたようだ。


03713612007/01/18(木) 17:17:49
>>368
すみません。
Debug=>1の意味が理解できていませんでした。
今調べてDebug=>1で流したらこんなメッセージになっています。

Net::FTP=GLOB(0x15ecd4)>>> MDTM xxx.log
Net::FTP=GLOB(0x15ecd4)<<< 500 'MDTM xxx.log': command not understood.
Use of uninitialized value in concatenation (.) or string at bbb.pl line 16.

MDTMというコマンドがないみたいですが↓このファイル見たら_MDTMならあるけど
MDTMはありませんでした。
/usr/local/lib/perl5/5.8.6/Net/FTP.pm

>>369
調べましたがちゃんと見れていました。
0372デフォルトの名無しさん2007/01/18(木) 17:36:30
>>371
> Net::FTP=GLOB(0x15ecd4)>>> MDTM xxx.log
> Net::FTP=GLOB(0x15ecd4)<<< 500 'MDTM xxx.log': command not understood.
> Use of uninitialized value in concatenation (.) or string at bbb.pl line 16.

これはひどい(笑) MDTMコマンドが実装されていないのだろうか。

手元でやった例だと
失敗例
Net::FTP=GLOB(0x8212d38)>>> MDTM pub
Net::FTP=GLOB(0x8212d38)<<< 550 Could not get file modification time.

成功例
Net::FTP=GLOB(0x8212d38)>>> MDTM pub
Net::FTP=GLOB(0x8212d38)<<< 212 20060419172149

となります。
0373デフォルトの名無しさん2007/01/18(木) 17:45:44
今ぐぐってみたら
MDTMはFTPの拡張仕様だから対応してない鯖が多いみたいだ
MDTM対応してない鯖は気合でLISTの結果を解析するしかなさそうな感じ
0374デフォルトの名無しさん2007/01/18(木) 18:02:46
LISTのフォーマットもまちまちだから、本当に「気合」が必要だなw
0375デフォルトの名無しさん2007/01/18(木) 18:56:34
普通のftpクライアントはどうやってリスト作成しているんだろうね・・・

#暇なときにffftpのソース眺めてみよう
0376デフォルトの名無しさん2007/01/18(木) 19:01:19
IEもLISTを解析してるらしい
ttp://support.microsoft.com/kb/834577/ja
かなり大変そうだな・・・
0377デフォルトの名無しさん2007/01/18(木) 19:37:54
CPANを漁ったらこんなのがあった。使い物になるかな
ttp://search.cpan.org/~gaas/libwww-perl-5.805/lib/File/Listing.pm
0378デフォルトの名無しさん2007/01/18(木) 20:47:53
>>375
悲惨なものよ
0379デフォルトの名無しさん2007/01/19(金) 00:21:38
ファイル交換ソフトの利用履歴を調査するソフト「Winny特別調査員」
ttp://internet.watch.impress.co.jp/cda/news/2007/01/17/14478.html
>Winny特別調査員は、フォレンジック技術を応用した検査により、Winnyなどのファイル交換ソフトを利用した最終日時を調査するソフト。

これ、デモ版とはいえPerl(PAR)で書かれている珍しい製品
exeの拡張子をzipにして解凍すればソースを取り出すことが可能。


このソースを見てフォレンジック技術と"売り物"のクォリティを感じろ、おまいら
0380デフォルトの名無しさん2007/01/19(金) 00:33:42
>>379
@KINTAMA_STRとかあってワロス
03813612007/01/19(金) 09:54:34
>>373
拡張なんですね。。
>>372->>380
$ftp->dir("./")で取得するとサーバによってこんな風になるんですよね。
表示が英語か日本語だけならまだ対応出来るんですが
日本語で去年のファイルになると時間が年表記になって
時間が取り出せないorz

drwxrwxr-x 2 user group 1024 Dec 5 00:03 dir_name

drwxr-xr-x 5 user group 512 3月 29日 2006年 dir_name

何か他に日付とサイズ取得できるのないかな。
0382デフォルトの名無しさん2007/01/19(金) 10:18:31
>>381
> 日本語で去年のファイルになると時間が年表記になって
> 時間が取り出せないorz

いや、UNIXのlsコマンドの詳細表示は、半年以上過ぎるとそういう表示になる
仕様だというだけ。それを反映しているのでしょう。英語でもそうなるはず。
っていうか、そうなるのがある、か。
0383デフォルトの名無しさん2007/01/19(金) 13:16:05
>>379
これぐらいの物ならPerlで作らなかった方が良かったのにね。。
コメントとテストコードが残っている事以外に関して言えば
別に酷いコードじゃないと思うけど、フォレンジック技術について言えば;;
文字連結が好きだって事は分かった。
0384デフォルトの名無しさん2007/01/19(金) 14:01:44
> 別に酷いコードじゃないと思うけど、
マジで?
0385デフォルトの名無しさん2007/01/19(金) 14:07:39
112 :番組の途中ですが名無しです [sage] :2007/01/17(水) 15:23:40 ID:p3fP2iOG0
sub pf_check_p2p{
if ($_[0]=~/winny\.exe/i){add_ctime($_[0],$WINNY,"WINNY");}
if ($_[0]=~/winnyp\.exe/i){add_ctime($_[0],$WINNYP,"WINNYP");}
if ($_[0]=~/Share\.exe/i){add_ctime($_[0],$SHARE,"SHARE");}
if ($_[0]=~/PERFECT DARK\.EXE/i){add_ctime($_[0],$PD,"PD");}
if ($_[0]=~/cabos\.exe/i){add_ctime($_[0],$CABOS,"CABOS");}
if ($_[0]=~/limewire\.exe/i){add_ctime($_[0],$LIMEWIRE,"LIMEWIRE");}
if ($_[0]=~/BITTORRENT\.EXE/i){add_ctime($_[0],$BIT,"BIT");}
if ($_[0]=~/BITCOMET\.EXE/i){add_ctime($_[0],$BIT,"BIT");}
}

(;^ω^)


139 :番組の途中ですが名無しです [sage] :2007/01/17(水) 15:35:19 ID:p3fP2iOG0
なんか製品版も同じな気がする…
だってp2ptest.plの30行辺り見ると…

my $kin="\x5b\x90\x6d\x8b\x60\x82\xc8\x82\xab\x83\x4c\x83\x93\x83\x5e\x83\x7d\x5d";

ついでにこれってShift_JISで見ると [仁義なきキンタマ] なんだよね
03863832007/01/19(金) 14:20:43
>>384
苦なく読めるという点で。改良点を挙げようとすればそりゃ出てくるがな。
0387デフォルトの名無しさん2007/01/19(金) 15:04:42
>>385
これだけ見ても何が面白いのかワカランだろ。まぁ、十分ヘタクソなコードだけど。
これが商用のソフトのファイル共有ソフトの検出処理だってのが凄い。
http://72.14.253.104/search?q=cache:82TAp8C1ZsUJ:news20.2ch.net/test/read.cgi/news/1169012146/+pf_check_p2p&hl=ja&ie=UTF-8
0388デフォルトの名無しさん2007/01/19(金) 15:15:48
Prefetchに気づいてる香具師が一人しかいないそのスレも大分痛い
0389デフォルトの名無しさん2007/01/19(金) 15:37:59
>>388
ニュー速だぞ?w
0390デフォルトの名無しさん2007/01/19(金) 16:29:43
>>379
調査員が、PC操作してる俺の隣に座って
監視するわけじゃないのか。 じゃイラネ。
0391デフォルトの名無しさん2007/01/19(金) 16:41:48
人件費が馬鹿にならんだろそれじゃ
0392デフォルトの名無しさん2007/01/19(金) 17:08:45
マwジwレwwスwww
0393デフォルトの名無しさん2007/01/19(金) 17:12:31
391に突っ込むって
どんだけ2ch初心者なんだよ
0394デフォルトの名無しさん2007/01/19(金) 17:19:27
2chw初w心ww者www
0395デフォルトの名無しさん2007/01/19(金) 17:56:46
はいはい
vipに帰りな
0396デフォルトの名無しさん2007/01/19(金) 18:00:16
はwいwwはwwwいwwwww
いい加減自演疲れただろうパトラッシュ
0397デフォルトの名無しさん2007/01/19(金) 19:04:24
>>393
熟練の方ですか?wwww
0398デフォルトの名無しさん2007/01/19(金) 19:05:06
          ばばばばばばっ
    w      w  _  _   w   w
        w   ヽ(・ω・)ノ   w    w
         w .(( ノ(  )ヽ )) w
wwwwwwwww..............┛┗...........wwwwwwwww
0399デフォルトの名無しさん2007/01/19(金) 20:11:44
言い負けてからが長い
0400デフォルトの名無しさん2007/01/20(土) 00:53:18
2chViewer ●にログインして、過去ログをひたすら(ウェイトは挟みつつ)取得するスクリプトを書いたのですが、
●ログインは出来るものの、肝心の過去ログが取得できません。gzip圧縮された「-ERR もう つかえません」と言うメッセージが取得されるだけです。
●アカウントそのものは既成の専用ブラウザ(OpenJane 0.1.12.6b)で生きていることを確認しています。
コーディングの問題なのか、2chの●過去ログ取得の仕様にあっていないための不都合なのか、自分では切り分けが出来ませんでした。

ソースはこれです。 http://sub.jetabbs.org/upload2/upload/upz043.zip (コメント・メッセージがキモくてごめんなさい)
スレ違いでしたら誘導をお願いします。
0401デフォルトの名無しさん2007/01/20(土) 15:39:22
>>400
ソースは読んでいないけど、
それって、Perlの問題というより、2ちゃんねるの認証の問題だね。
専用ブラウザ以外のソフトで過去ログを取得しようとすると、拒否する
ように設定していると聞いた覚えがある。
あとは、こちらのスレで聞いたほうがいいよ ↓

monazilla Part 5
http://pc10.2ch.net/test/read.cgi/tech/1057329161/l50
0402デフォルトの名無しさん2007/01/20(土) 15:51:03
専用ブラウザでのやりとりをキャプチャして同じリクエスト投げるようにすればいいんじゃね?
暗号化されてたらシラネ
04034012007/01/20(土) 15:51:23
>>400
あと、Snifferというソフトを使って、専用ブラウザが出しているIPパケットと、
自作のスクリプトが出しているIPパケットとを比べれば解決するかもしれないよ。
0404デフォルトの名無しさん2007/01/20(土) 22:02:59

use threads;
use threads::shared;

# 終了の合図
my $kill:shared = 0;

# スレッド作成
my $thread = threads->new(\&loop);

処理...

$kill = 1;
$thread->join;

sub loop {
  while (!$kill) {

    処理...

    sleep(60);
  }
}

少し長くてすみません…。
マルチスレッドでwaitを挟みつつ処理を行い
任意のタイミングで終了させるプログラムを組んでいるのですが、
このコードだと終了用の変数をセットしてから処理が戻るまで60秒もかかってしまいます。
何かいい方法はないでしょうか
よろしくお願いします。
0405デフォルトの名無しさん2007/01/20(土) 22:24:10
>>400
UAをMonazilla/1.00にするとか
0406デフォルトの名無しさん2007/01/20(土) 22:47:00
>>404
threads::sharedにcond_ナントカというのがいくつかあるので
よく説明読め。たぶんお前が求めているものはそれだ。
0407デフォルトの名無しさん2007/01/20(土) 22:55:23
>>406
ありがとうございます
調べてみます
0408デフォルトの名無しさん2007/01/20(土) 23:33:03
Perl Hacks
ttp://www.amazon.co.jp/dp/4873113148/

これ今日発売だけど買った奴居る?
中身どうですか?
0409デフォルトの名無しさん2007/01/20(土) 23:57:59
そんな本が出るこそさえ知らなかったわさ
0410デフォルトの名無しさん2007/01/21(日) 00:14:29
>>406
cond_timedwait
cond_signal
を併用する事でできました
昨日からずっと悩んでいたので助かりました
ありがとうございました
0411デフォルトの名無しさん2007/01/21(日) 00:19:55
>408
O'Reillyで目次見れるから、だいたい判断つくんじゃない?
俺は英語版持ってるから買わないけど。
ttp://www.oreilly.co.jp/books/9784873113142/toc.html
0412デフォルトの名無しさん2007/01/21(日) 00:54:41
第1章の1項ってテクニック?
0413デフォルトの名無しさん2007/01/21(日) 01:23:23
1章2章はツールの話だろ
0414デフォルトの名無しさん2007/01/21(日) 01:24:15
「firefoxから簡単にCPAN検索できるようにする」だからテクニックといえばテクニックだろ。
俺はsleipnirもfirefoxもCPAN検索できるようにしてある。
あとはローカルにppmリポジトリを立てればすごく便利。
0415デフォルトの名無しさん2007/01/21(日) 05:57:20
>>408
買った買った。ペラペラとめくってからほぼ衝動買い。
お前も買え。
0416デフォルトの名無しさん2007/01/21(日) 12:10:31
すみません

@week = ("Sun","Mon","Tue","Wed","Thr","Fri","Sat");
$i = 0;

for($i=0; $i <= 7; $i++){
print $week[${i}];
}

このソースで-wオプション付けて実行すると
Use of uninitialized value in print at ./hairetu.pl line 7.
と警告が出るのですが何故でしょうか?
見たところ変数はきちんと初期化していると思うのです。
0417デフォルトの名無しさん2007/01/21(日) 12:12:55
わかりました
7じゃなくて6ですた…
自己解決染ました
0418デフォルトの名無しさん2007/01/21(日) 12:41:03
>>417
> 7じゃなくて6ですた…

植木算のミスといいます。そして Perl では「必要がなければ添え字を扱わない」ことで、このリスクを回避できます。

foreach my $wday (@week) {
    print $wday;
}

あるいは、

print for @week;
0419デフォルトの名無しさん2007/01/21(日) 13:30:56
すごい省略できるんですね…
0420デフォルトの名無しさん2007/01/21(日) 16:25:18
Perlの省略記法は、芸術ですから。
いろいろ言われるところもあるけど、ラリー・ウォール先生もPGは傲慢であれとおっしゃっていることだし。
うん。大丈夫。半年前に書いたスクリプトがさっぱり分からなくても大丈夫。泣くことなんて無いよ。
0421デフォルトの名無しさん2007/01/21(日) 16:39:35
> foreach my $wday (@week) {
> print $wday;
> }

"my" なんて入れる必要ないだろ
0422デフォルトの名無しさん2007/01/21(日) 16:45:32
PBP6.9に入れた方がいいと書いてあるだろ
0423デフォルトの名無しさん2007/01/21(日) 18:36:44
自分のフォルダのtextファイル(1000行〜1500行)を

ひとつの変数に入れる方法を教えてください


open(IN,"< foo.txt");
foreach(IN){ ・・・
}

のように一行づつ処理ではなく、全部の行をまとめて処理したいのです。
(正規表現で複数の行に渡って処理したいため)

何かいい方法はないでしょうか?
よろしくお願いします
0424デフォルトの名無しさん2007/01/21(日) 18:40:53
read関数
0425デフォルトの名無しさん2007/01/21(日) 18:47:46
my $txt = join('', (<IN>)[999 .. 1499]);
04264232007/01/21(日) 18:49:16
>>424
>>425
ありがとうございます。
無事解決できました
0427デフォルトの名無しさん2007/01/21(日) 19:00:13
いいのかおい
0428デフォルトの名無しさん2007/01/22(月) 23:22:29
正規表現の量指定子{}に変数は使えますか?
0429デフォルトの名無しさん2007/01/22(月) 23:25:53
すいません、自己解決しました
てか自分で試せばよかった・・・
0430デフォルトの名無しさん2007/01/23(火) 17:27:38
すみません。
教えてください。

my @aaa = () ;
my @bbb = () ;
for(my $i=0;$i<5;$i++) {
@aaa = ($i,$i+1) ;
@bbb = (@bbb,\@aaa) ;
}
foreach(@bbb){
print "$_\n" ;
}
foreach(@bbb){
foreach(@$_){
print "$_\n" ;
}
}

上を実行すると下の結果になります。

ARRAY(0x13c93c)
ARRAY(0x13c93c)
ARRAY(0x13c93c)
ARRAY(0x13c93c)
ARRAY(0x13c93c)
4 5
4 5
4 5
4 5
4 5

>>↓に続く
04314302007/01/23(火) 17:28:11
>>↑の続き

出力させたい結果は以下なのですがどうも
リファレンスの中がARRAY(0x13c93c)で全て同じになってしまっているようです。
(同じ@aaaという配列名をリファレンスしているせい?)
ループさせてリファレンスを増やしていきたいのですが
どのようにしたら下記のような出力結果に出来ますでしょうか。

0 1
1 2
2 3
3 4
4 5
0432デフォルトの名無しさん2007/01/23(火) 17:40:06
レキシカルスコープ
0433デフォルトの名無しさん2007/01/23(火) 17:41:40
>>430-431
ループのなかでmyするようにする。
my @aaa = ($i,$i+1) ;

若しくは無名配列のコンストラクタを使う。
@bbb = (@bbb,[@aaa]) ;

ループの外では@aaaを使っていないのだから、
スコープをループ内に縛る前者をお勧めする。
0434デフォルトの名無しさん2007/01/23(火) 17:48:50
質問です。

テキストファイルから顔文字を除去しようと考えていますが、いい方法がみつかりません。
正規表現でうまく除去する方法というのはないでしょうか?


現在考えていますのが、括弧の中に記号あると顔文字であると判断するとしています(例=(゜Д゜) (ノ∀`*) など。
この正規表現を書く場合全ての記号を書かないといけないでしょうか?

質問が2つとなりましたが、よろしくお願いします
0435デフォルトの名無しさん2007/01/23(火) 17:52:37
>>434
まず正規表現を勉強しろ。

顔文字のリスト作ってそれと比較するのが単純で速いと思うが。
0436デフォルトの名無しさん2007/01/23(火) 17:55:52
(゜o゜)これはおk?
(TへT)これもおkだね
04374342007/01/23(火) 17:57:28
>>435
リスト作ったほうが早いですか。

その場合、リストにない顔文字は一致しませんけど、しょうがないか…
全部の顔文字をうまく除去するなんて、難しいですよね
0438デフォルトの名無しさん2007/01/23(火) 18:01:19
上手く作ったとしても
 テンプレート・ツールキット(TT)
なんて文脈じゃ誤判定は避けられないな
0439デフォルトの名無しさん2007/01/23(火) 18:04:54
>>437
"ヽ(`Д´)ノ"
とかが、"ヽノ"になってもいいのかってこったわな。
結局は、顔文字の辞書ファイルを保守するしかないだろ。
04404342007/01/23(火) 18:18:05
"ヽ(`Д´)ノ"の場合は前後が記号ならそれも弾くとか考えてたんですよね

まぁ、ノのほうが記号じゃないんで、残りますが。

顔文字の辞書作ってるけど。結構メンドクセ
04414302007/01/23(火) 18:21:54
>>433
解決しました。
ありがとうございました。

>>432
こういうのをレキシカルスコープって言うんですね。
ありがとうございます。
0442デフォルトの名無しさん2007/01/24(水) 01:40:36
文字の置換の際に、「マッチした文字列になんらかの処理をする」ということは可能でしょうか?

$str = "ABCDEF";
$str =~ s/(B)/&conv($1)/;

のように、マッチした文字列を、関数を使って、返り値で置換したいのですが・・・
(ちなみの、このコードだと、
A&conv(B)CDEF
という文字列になってしまいました。。。)
0443デフォルトの名無しさん2007/01/24(水) 02:25:10
e
0444デフォルトの名無しさん2007/01/24(水) 04:16:24
v
0445デフォルトの名無しさん2007/01/24(水) 06:30:30
>>442
Windowsならコマンドプロンプト開いて
perldoc perlre
でperlの正規表現のドキュメント読めるよ。
ドキュメントにざっと目を通してれば人に質問するような内容じゃないぞ。
044644422007/01/24(水) 07:16:24
>443
>445
ありがとうございます。 /e で、できました。

ドキュメントを確認せずに質問してしまって
済みませんでした。
プログラミングPerlにも、 /e が載ってました・・・
0447デフォルトの名無しさん2007/01/24(水) 14:10:56
CGI作るつもりでperl始めたんだけど、テンプレにあるようなCGIとは無関係な使い方ってどんな使い方するの?
例えばどんな仕事でどう使うとか教えてほしい
0448デフォルトの名無しさん2007/01/24(水) 14:14:36
>>447
スクリプトとして使えるじゃん。 バッチ処理とかさ。
0449デフォルトの名無しさん2007/01/24(水) 14:26:58
>>447
CGIと関係なく、データベースとのやりとりとか。
0450デフォルトの名無しさん2007/01/24(水) 14:27:35
>>447
えーと、えーと
0451デフォルトの名無しさん2007/01/24(水) 14:29:52
こんな質問するやつに教えても理解できないと思うよ
0452デフォルトの名無しさん2007/01/24(水) 14:31:22
エロ画像エロ動画収集に決まってるだろ
0453デフォルトの名無しさん2007/01/24(水) 14:32:40
分類したエロ画像ファイルをリネームする
0454デフォルトの名無しさん2007/01/24(水) 15:02:24
CUIだから単純で且つ面倒くさい処理やらせてる。すぐ書けるしね
>>452
漏れ以外にPerlをエロ収集に使おうと考える奴がいるとは・・・
0455デフォルトの名無しさん2007/01/24(水) 16:01:07
>452-454
あれ、俺が何人もいる…
0456デフォルトの名無しさん2007/01/24(水) 17:03:32
たしかにエロ収集に便利、というよりエロ収集してる時が一番はかどるな。
0457デフォルトの名無しさん2007/01/24(水) 17:06:36
組みたくなってきた・・・
エロパワーは絶大だな
0458デフォルトの名無しさん2007/01/24(水) 17:31:07
 ▀▄    ▀▄      ▄█    ▄█  ▀▀▀▀█
   ▀▄    ▀▄   ▄▀█   ▄▀█     ▄▀
    ▄▀    ▄▀ ▄▀ █  ▄▀ █     █
  ▄▀    ▄▀   ▀▀▀█▀ ▀▀▀█▀   █
 ▀     ▀        ▀     ▀    ▀

   █ ▄▄▄   █    ▀▀▀▀    ▄      ▄█ █
  █  █▄▄ █ █  ▄▄▄▄▄▄▄   █  ▄▄▄▄█▄▄
 ▀█ ▄█ █ █ █      ▄▀    █      █
  █ ▀ █▀ █ █    ▄▀▀▄    █   ▄▄▄█
  █  ▄▀    █  ▄▀   █    █  █   █▀▄
  ▀  ▀    ▀▀ ▀      ▀▀▀ ▀   ▀▀▀

こんなスレアラシに使える。
0459デフォルトの名無しさん2007/01/24(水) 18:27:19
正規表現が使いやすいからPerlで組んだ
でもCUIなのがなぁ
0460デフォルトの名無しさん2007/01/24(水) 18:34:47
Perlでは、ワンライナーか数行程度のスクリプトでテキストをいじったりとか
しかしてないが
Unicode対応がボミョウなので、たまに困ったことになる

use encoding('cp932')とかって、-n/-pスイッチとかと一緒に使うと
うまく動かなくね?つか、これって基本的に非推奨なんだべ?

Unicode文字列のリテラルや正規表現を直接記述できないので、
use encoding()しないとなると途端にウザい事態になるわPerlは
0461デフォルトの名無しさん2007/01/24(水) 18:39:55
スクリプトをutf8で書けばuse encodingいらないし特に問題ないけどね。
04624602007/01/24(水) 18:43:07
>>461
それはスクリプトも入力もUTF-8を仮定できるときだけだべ?
少なくともWindows環境でそれは仮定できないなぁ
UTF-8なファイル名でファイル開いたりできないし
0463デフォルトの名無しさん2007/01/24(水) 19:11:42
>>115
0464デフォルトの名無しさん2007/01/24(水) 21:44:41
>462
ttp://aspn.activestate.com/ASPN/Mail/Message/2996684
04654602007/01/24(水) 23:34:35
>>463
-pスイッチや-nスイッチを使わない場合はそれで上手く行くようです。
そもそも毎度毎度こんなに長いのではワンライナーは書けませんし、
簡単な仕事を簡単にやっつけられないのなら、Perlとしての魅力は
激減ですが。

やっつけ仕事によく使う-pスイッチや-nスイッチと
use utf8を共存させる方法はありますか。
#!/usr/bin/perl -pi.bak
なスクリプトで>>115の方法を試すと全くおかしなことになります。

>>464
なるほど、便利なモジュールがあるのですね。
0466デフォルトの名無しさん2007/01/25(木) 00:31:18
間違いなく合ってない。
煽りとかではなく。
別の言語にしたほうが幸せになれるとおもうよ。
0467デフォルトの名無しさん2007/01/25(木) 01:21:17
Perl/Tk で GUI でエロ画像を集めてるよ。
0468デフォルトの名無しさん2007/01/25(木) 02:46:48
エロのエネルギーはおよそ12kW/hです。
0469デフォルトの名無しさん2007/01/25(木) 09:55:07
質問
use strict; warn $c;
だとstrictが効くのに
use strict; warn $a;
だとstrictが効かないのはなぜ?
$bも効かない
0470デフォルトの名無しさん2007/01/25(木) 10:04:09
sort() で使われるから例外扱い
perlvar嫁
0471デフォルトの名無しさん2007/01/25(木) 10:16:32
質問します。

for(my $i=0;$i<=$#aaa;$i++){
$out = $aaa[$i] ;
if( $aaa[$i+1] ){
while($aaa[$i+1] =~ /^\+/){
$i++ ;
$out = "$out $aaa[$i]" ;
}
}
print "$out\n" ;
}

これのforをforeachで書いたらどんな記述でかけますでしょうか。
やりたいことは、ある要素のアタマに"+"があれば
その要素は一つ前の要素とつなげようとしています。
foreachで回している最中に強制的に次の要素にアクセスすることは出来るのでしょうか。
0472デフォルトの名無しさん2007/01/25(木) 10:18:14
from>>469 to>>470

perldoc perlvar
$a
$b Special package variables when using sort(), see "sort" in perlfunc. Because of this specialness $a and $b don’t need to
be declared (using use vars, or our()) even when using the "strict ’vars’" pragma. Don’t lexicalize them with "my $a" or
"my $b" if you want to be able to use them in the sort() comparison block or function.

thx!
0473デフォルトの名無しさん2007/01/25(木) 10:27:06
>>foreachで回している最中に強制的に次の要素にアクセスすることは出来るのでしょうか。

foreachでは今アクセスしている要素が何番目かを知ることはできない。
もちろん、中で別に変数を$i++とかすりゃ別。

俺ならこんな感じに書く。

foreach (@aaa) {
if (/^\+/) {
$out[-1] .= " $_";
} else {
push @out, $_;
}
}
0474デフォルトの名無しさん2007/01/25(木) 10:34:48
すまん、なぜかソラ目でprintがpushに見えていた。

printだとこうかな。printが2つあるのがいまいち気に入らないが...

my $buf = undef;
foreach (@aaa) {
if (/^\+/) {
$buf .= " $_";
} else {
print $buf, "\n" if defined $buf;
$buf = $_;
}
}
print $buf, "\n" if defined $buf;
0475デフォルトの名無しさん2007/01/25(木) 10:38:17
>>473 の後
print map { "$_\n" } @out; でもすりゃいいんだから別にいいんじゃ
0476デフォルトの名無しさん2007/01/25(木) 15:20:56
print "$_\n" for @out;
このほうが短い。
0477デフォルトの名無しさん2007/01/25(木) 15:30:03
print join "\n", @out;
の方がわかり安い
0478デフォルトの名無しさん2007/01/25(木) 15:49:57
どれが速いんですかね^^
0479デフォルトの名無しさん2007/01/25(木) 16:05:03
>>477
ダウト。それだと最後の要素の後に改行が出ない。
04804712007/01/25(木) 16:31:27
>>473
できました!!
すっきりしてわかりやすくなりました。
ありがとうございます。
0481デフォルトの名無しさん2007/01/25(木) 16:40:25
>>479
そういう細かい部分ってすっごい大事だよね
後で泣き見たりする
しかし「ダウト」って使う人はあんまり見たことが無い
0482デフォルトの名無しさん2007/01/25(木) 18:24:14
クイズのゲームを作っているのですが、問題を回答したら次ってどんどん進んでいき
正解したら各問ごとに正解数をカウントしていってりうのですちゃんとカウントされません。

perlはテキストでも作ってそれに書き込んでそのあと読み込んでしないと記憶した
変数が消えるのですか・・・?
変な質問ですみません。HSPからperlに乗り換えてみたんですが混乱してしまって
0483デフォルトの名無しさん2007/01/25(木) 18:28:08
>>482
日本語でおk
HSPで作ったほうがいいんじゃね?
0484デフォルトの名無しさん2007/01/25(木) 18:30:01
>>483
perlの勉強をしてみたいと思いましたので・・・

myで定義をしてるんですけど、なんかいろいろと定義の仕方があるみたいですねperlは
0485デフォルトの名無しさん2007/01/25(木) 18:32:17
さっさとソースを見せろ
0486デフォルトの名無しさん2007/01/25(木) 18:45:37
if($tugi eq "Q1"){
if($toi eq "t"){
$sum=$seikai+1;
}
&mon0;
}
if($tugi eq "Q2"){
if($toi eq "t"){
$sum=$seikai+1;
}
&mon1;
}
if($tugi eq "Q3"){
if($toi eq "t"){
$sum=$seikai+1;
}
&goukei;
}

sub goukei{
print "正解は"+$sum+"個";
}
0487デフォルトの名無しさん2007/01/25(木) 18:45:40
次の問題へ進むたびに正解数を my してるんだろうな
0488デフォルトの名無しさん2007/01/25(木) 18:47:08

sub mon0{
print "<P>";
print "<SELECT name='answer' size='3'>";
print "<OPTION value='true'>みかん</OPTION>";
print "<OPTION value='false'>アップル</OPTION>";
print "<OPTION value='false'>ばなな</OPTION>";
print "</SELECT>";
print "</P>";
print "<INPUT type=hidden name=tugi value=Q2>";
print "<P><INPUT type='submit' value='次の問いへ'></P>";
}
sub mon0{
print "<P>";
print "<SELECT name='answer' size='3'>";
print "<OPTION value='false'>インコ</OPTION>";
print "<OPTION value='true'>ふくろう</OPTION>";
print "<OPTION value='false'>鳩</OPTION>";
print "</SELECT>";
print "</P>";
print "<INPUT type=hidden name=tugi value=Q3>";
print "<P><INPUT type='submit' value='次の問いへ'></P>";
}

こんな感じです
0489デフォルトの名無しさん2007/01/25(木) 18:48:04
webprogでやれ
04904872007/01/25(木) 18:49:27
はずした。

> $sum=$seikai+1;
0491デフォルトの名無しさん2007/01/25(木) 18:49:59
$sum=$sum+1
じゃないの?
0492デフォルトの名無しさん2007/01/25(木) 18:53:22
>>491
そこは修正しました。
上のほうで
my $sum;
と定義してるのが問題なんでしょうか?
0493デフォルトの名無しさん2007/01/25(木) 18:57:38
上のほうで、とか言われてもわからないから全部見せろ
0494デフォルトの名無しさん2007/01/25(木) 18:58:39
そもそもCUIなのかCGIなのか
0495デフォルトの名無しさん2007/01/25(木) 18:59:02
↓こっちのがいいんでね?
http://pc10.2ch.net/test/read.cgi/php/1164519503/
0496デフォルトの名無しさん2007/01/25(木) 19:08:30
ttp://www.vipper.net/vip166431.zip.html
ここに書き込むと長いのでアップしてきました
0497デフォルトの名無しさん2007/01/25(木) 19:19:26
htmlなんだろw
0498デフォルトの名無しさん2007/01/25(木) 19:22:30
板違いっぽいですね(−−
0499デフォルトの名無しさん2007/01/26(金) 05:44:42
>>477 は最後の改行もそうだが、メモリ内で一旦展開するから、
効率よくないんでない?
0500デフォルトの名無しさん2007/01/26(金) 07:40:35
さらに、文字列を連結するためにメモリの再割り当てが何度も起きる悪寒
0501デフォルトの名無しさん2007/01/26(金) 11:44:01
UTF8 で並んでいる名前の一覧があるのですが、それをあいうえお別に分類したいのですが
どういう方法が良いでしょうか。

青木 -> @AGyou へ
斉藤 -> @SaGyou へ
という感じにしたいとおもいます。
0502デフォルトの名無しさん2007/01/26(金) 12:04:33
読み仮名付けなきゃ無理だね
0503デフォルトの名無しさん2007/01/26(金) 12:07:36
>>502
お返事ありがとうございます。やっぱり難しいですね orz
別の手段を考えて見ます。
0504デフォルトの名無しさん2007/01/26(金) 12:10:01
>>503
> 別の手段を考えて見ます。

なんで? 読みがなつければいいじゃん。
0505デフォルトの名無しさん2007/01/26(金) 12:13:15
>>504
表現が悪くてすいません。別の手段 → 読み仮名をつけることです。
0506デフォルトの名無しさん2007/01/26(金) 12:32:13
読みがなをつけるモジュールって、あっても良さそうなもんだけどね。
mecabにぶっ込めば一発か?
0507デフォルトの名無しさん2007/01/26(金) 12:35:47
>>506
あ〜それ欲しいですね。
0508デフォルトの名無しさん2007/01/26(金) 13:24:24
不確実すぎるだろ・・・
0509デフォルトの名無しさん2007/01/26(金) 14:09:40
すべて登録されているとは限らないし ――特に名前の方、
読みがアンビなのもあるから、必要なのは、読みがなふり支援ツール
じゃなかんべか。
0510デフォルトの名無しさん2007/01/26(金) 15:48:49
漢字にふり仮名を自動でつけるのは
ある程度は自動化できるが
同じ字で読みが違う場合もあるので(ex.徳沢 => とくさわ,とくざわ etc.)
完全な精度では無理。
0511デフォルトの名無しさん2007/01/26(金) 18:19:13
http://www.alles.or.jp/~tsuyama/name.htm
684万人を調べて、約7万8千種の名字ランキングを公開している人がいるぞ。
そのデータを使うのが手っ取り早いと思われる。
....しかし、ヒマ人だな〜。
0512デフォルトの名無しさん2007/01/26(金) 19:17:30
読みを当てはめるのも結局確率だから
↑のデータ使ってもやっぱ無理っしょ
0513デフォルトの名無しさん2007/01/26(金) 20:45:14
そこでAIの出番なわけだ
0514デフォルトの名無しさん2007/01/26(金) 20:52:49
そこでエスパーの出番なわけだ
0515デフォルトの名無しさん2007/01/26(金) 20:57:04
WindowsXP上でActivePerlを使ってるんですが、USBデバイスをコントロールする方法はありますか?
学習リモコンのクロッサム2+USBとデータをやりとりしたいんですが。
0516デフォルトの名無しさん2007/01/26(金) 21:07:32
>>511のリンク先より引用
----
名字 ふりがな 人数 順位 累積人数  累積比率
鈴木 スズキ 139,627 1  139,627 2.04029%
鈴木 ススギ 25 13,107 6,517,718 95.2398%
鈴木 ススキ 7 27,840 6,723,557 98.2476%
鈴木 スズノキ 3 41,426 6,795,040 99.2922%
鈴木 スズ 2 47,333 6,812,494 99.5472%
鈴木 スズシ 2 47,333 6,812,506 99.5474%
鈴木 スヅキ 2 47,333 6,812,518 99.5476%
鈴木 スス 1 56,150 6,832,142 99.8343%
鈴木 ススヘキ 1 56,150 6,832,147 99.8344%
鈴木 ススリキ 1 56,150 6,832,148 99.8344%
鈴木 スズギ 1 56,150 6,832,151 99.8344%
鈴木 ズスキ 1 56,150 6,832,308 99.8367%
鈴木 ズズキ 1 56,150 6,832,309 99.8367%
鈴木 ヌズキ 1 56,150 6,836,957 99.9047%
----

姓しかわからない状況で確実に読み仮名をつける方法は
>>513のAIじゃなく >>514のエスパーだな。
AIについて無知な>>513はAIと書けばかっこいいと思ってるのか?
0517デフォルトの名無しさん2007/01/26(金) 21:11:14
ヌズキはねーよw どう考えても書き間違いだろwww

あ、ヌズキさん見てたらごめんなさい><
0518ヌズキ2007/01/26(金) 21:24:52
呼んだ?
0519デフォルトの名無しさん2007/01/26(金) 21:26:36
名前の仮名振りは、人間がやってもかなり難しい。
自動化なんてとても無理。 入力補助が限界でしょうね。
0520デフォルトの名無しさん2007/01/26(金) 21:50:28
あと「ズスギ」さんと「ズズギ」さんが入れば
濁点のあるなしの組み合わせがそろうのにな
0521デフォルトの名無しさん2007/01/26(金) 22:00:02
読みが存在しない漢字が存在する
0522デフォルトの名無しさん2007/01/27(土) 00:46:22
たとえば、「東」と書いて「あずま」「ひがし」「とう」と、読み方がいろいろある。
漢字だけからは読み方は判別できない。
そのため、正しい読み方は、本人にしかわからない。
0523デフォルトの名無しさん2007/01/27(土) 00:52:27
同じクラスに五島(ごとう)と五島(ごしま)が居たことあるよ。
0524デフォルトの名無しさん2007/01/27(土) 01:09:35
>>523
おまえ、ひょっとして1年2組の時の近藤(こんどう)か?
おれ隣のクラスの権藤(ごんどう)だよ。おぼえてるか?
0525 ◆TWARamEjuA NGNG?BRZ(6761)
住基ネットワークに問い合わせれば総て解決♪
0526デフォルトの名無しさん2007/01/27(土) 15:01:28
>>515
キミの質問は、2つに切り分けないといけない。
1.クロッサム2のDLLのインターフェースが公開されているかどうか。
2.ActivePerl から DLLを呼び出せるかどうか。

両方とも「YES」だからできるのだが、質問の切り分けができず、
「1」の当否を回答者に調べさせるキミには無理だ。
0527デフォルトの名無しさん2007/01/27(土) 15:20:23
>>525
スーパーハッカーキタ━━━━━━(゚∀゚)━━━━━━ !!
0528デフォルトの名無しさん2007/01/27(土) 16:01:58
あふぉか
姓しかわからないデータと住基ネットのデータをどうリンクするんだよ。
>>525=>>527か?
くだらないネタにみんなスルーしてるわけだが、
自作自演するほど反応してほしかったのか?
0529デフォルトの名無しさん2007/01/27(土) 16:22:13
ネタだと思っているなら何故あふぉとか言ってマジ突っ込みするんだろう。分裂気味?
まぁ大方、真相がネタでもマジでも恥かかないよう工夫したら前後で矛盾が出たってとこか。
0530デフォルトの名無しさん2007/01/27(土) 17:17:34
まぁ未承諾さんだし。
0531デフォルトの名無しさん2007/01/27(土) 18:02:01
>>526
もちろんDLLとかWindowsの約束とかよく分かっておりません。
そのあと、mrccom.dllを見つけてWin32::APIでimportを試すところまで来ましたが、
unknown errorでimport出来ず\(^o^)/。どなたか気が向いたら教えてください。
0532デフォルトの名無しさん2007/01/27(土) 20:09:12
>>528
サブイ
0533デフォルトの名無しさん2007/01/27(土) 22:26:03
>>527,>>529,>>532
ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ
0534デフォルトの名無しさん2007/01/27(土) 22:45:22
>>528=533 別に君以外誰も文句も言ってないし、しきりも頼んでないけど。
頓珍漢レスを>>529に指摘されて逆ギレしてる張本人乙にしかみえないよ?w
0535デフォルトの名無しさん2007/01/27(土) 22:52:37
粘着だが逆ギレだか知らんが、
PerlのスレでPerlの話をしないやつはすべて平等に価値がない
0536デフォルトの名無しさん2007/01/27(土) 23:29:55
ここは批判されると30分以内に逆切れコメントする527を観察スレですか?
0537デフォルトの名無しさん2007/01/28(日) 00:35:56
>>531
>どなたか気が向いたら教えてください。
まず、C++を勉強しろ。C++でDLLを扱えるようになること。
PerlでDLLを扱う話はそれからだ。
0538デフォルトの名無しさん2007/01/28(日) 01:35:42
>>533
ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ
0539デフォルトの名無しさん2007/01/28(日) 02:58:29
    __
    |   |
    |   |   ___                  ___
    |   | .  /     |  __    _____   / _  \
    |   |  /  /|  |  /  /   / ____/  / /  >  l
    |   |. /  / .|  |. /  /   / /..   _    /   ̄  /
    |   |/  /  |  |/  /   /   ̄ ̄_/   /      \
    |       /.   |     /   / / ̄ ̄ __   /  / ̄ ̄>  |
    |    /   |___/  ./   ̄ ̄ ̄ /  /    ̄ ̄  /
     ̄ ̄ ̄             ̄ ̄ ̄ ̄ ̄     ̄ ̄ ̄ ̄ ̄     _____      ___ ___    ___
    ______                             /__  __/ [][] _| |_| |__ _| |_
     |  ___  \                               / /     |    _  | |_  レ'~ ̄|
     |  |    \  l                              |  |_      ̄|  | / / /   /| |
     |  |____/  /                             \__|      |  |  ̄ /_  /.  | |_
     |  ____/ ___  __    __/ヽ                    |_|.     |__|.   \/
     |  |     /`、_/_/ / _ ヽ  / _  /
     |  |     ヽ  /   | l   l l  | l   l l
     |  |       | l     ヽ  ̄ /  ,ヽ  ̄ /
      ̄          ̄      ̄ ̄  / __ ヽ
                        | l     l l
                        ヽ  ̄ ̄ /
                         ~ ̄ ̄~
0540デフォルトの名無しさん2007/01/28(日) 03:41:10
それ、もう少し小さくならんか。
0541デフォルトの名無しさん2007/01/28(日) 04:14:20
  Web
      でやれ
  Prog
0542デフォルトの名無しさん2007/01/28(日) 04:16:24
vv3bpr0gマ”ゃれ
0543デフォルトの名無しさん2007/01/28(日) 21:16:33
Image::Magickで32bit(RGBA)のpngを読み込んで、24bit(RGB)のpngに書き出したいんだけど、
どうやればいいか教えてください。
0544デフォルトの名無しさん2007/01/28(日) 21:39:34
http://mechanics.civil.tohoku.ac.jp/soft/node43.html
convertで24bit Raw RGBで出力して
それを再度pngで出力すればいいんでね?
05455432007/01/29(月) 00:12:46
もう少し調べてみたら、
$im->Set(matte => 0);
で解決できました。スレ汚しごめんなさい。
0546デフォルトの名無しさん2007/01/30(火) 20:26:33
threads::shared なんですが、
例) $var : shared;
と言うのは、文法的にどういう意味なのでしょうか?
threadsだけに許された特殊な文法なのでしょうか?
0547デフォルトの名無しさん2007/01/30(火) 21:18:54
attributes
0548デフォルトの名無しさん2007/01/30(火) 22:02:55
>>547
ありがとうございます
CPANで見ても英語がさっぱりで…
分かり易く解説されているページ等はないでしょうか
はてなのは見ましたがさっぱりです
0549デフォルトの名無しさん2007/01/31(水) 17:01:01
質問です
UNIX系OSやWindowsで
.soや.dllを利用したいのですが、
どうするのが一般的でしょうか?
出来れば日本語の解説ページをお願いします
0550デフォルトの名無しさん2007/01/31(水) 23:53:20
質問です
コマンドラインでカウントダウンってできますか?

C:\>perl hoge.pl
次の処理まで待ち時間: 5秒...

のところ “5”の部分のみが 4 3 2 1... と更新されていくようにしたいのです
いちおー system "cls (もしくは) clear "でスクリーンごと更新とかは なしで

Activeperlですが cpanで解決するなら cpanでも結構です

よろしく〜
0551デフォルトの名無しさん2007/02/01(木) 00:00:31
>>550
¥b
0552デフォルトの名無しさん2007/02/01(木) 00:05:34
>551
うおっ! ありがとうございます!!
さっそくそのキーワードで調べてみます!!
0553デフォルトの名無しさん2007/02/02(金) 13:47:58
perlでISHテキスト←→バイナリ変換するモジュールってある?
一通りCPANしたりぐぐったりしてみたが見つからなかったんだけど。
0554デフォルトの名無しさん2007/02/02(金) 15:02:25
質問です。
項目数(列数)が多いCSVのデータを読み込んで処理するとき、皆さんはどうしてますか?

私は10項目くらいでしたら
my($id, $name, $age, ..) = split /,/;
と、それぞれ変数を用意するのですが、

100項目を超えるような場合、項目名を要素とする配列を用意しておき
@col_name = qw(id name age ..);

連想配列に格納して
my @array = split /,/;
my %hash = ();
for(0..$#col_name) {
  my $key = $col_name[$_];
  my $val = $array[$_];
  $hash{ $key } = $val;
}
$tel = $hash{tel};

今扱ってるCSVはデータの件数(行数)が500件あって、上記の連想配列の格納をその件数分繰り返し行なっています。

05555542007/02/02(金) 15:03:04
「項目名 => 項目番号」の連想配列を用意しておくのがいいのかなとも思うのですが、
%col_no = (
  id => 0,
  name => 1,
  ...,
  );
$tel = $array[ $col_no{tel} ];
↑ちょっと読みづらいかなとも思います。

項目数・項目名が変わる可能性は低いです。
効率よりも読みやすさ重視です。

よろしければ、ご意見お聞かせください。
0556デフォルトの名無しさん2007/02/02(金) 15:07:30
$tel = $array->[$i]->{'col_no'}->{'tel'};
0557デフォルトの名無しさん2007/02/02(金) 15:09:34
$tel = $array->[$i]->{'tel'};
これでいいのか
入れ方は任せる
0558デフォルトの名無しさん2007/02/02(金) 18:22:13
@col_name = qw(id name age); # member

$_ = "1,hiroyuki,30"; # csv
@$record{@col_name} = split /,/;


#
print $$record{id},"\n";
print $$record{name},"\n";
print $$record{age},"\n";
0559デフォルトの名無しさん2007/02/02(金) 21:32:19
利便性の為にハッシュを使わざるを得ないのが気になってるんじゃないの?
配列でやりたいなら、こんなことしちゃったり:

my $r = MyRecord->new(split /,/);
print("$r->name\n");

package MyRecord;
BEGIN {
my $i = 0;
my @col_name = qw(id name age); # カラム名を設定。
for my $n (@col_name) {
eval qq{ sub $n :lvalue { \$_[0][$i] }};
$i++; }}

sub new { bless [@_[1..$#_]], $_[0]; }
0560デフォルトの名無しさん2007/02/02(金) 21:34:18
ミス。
print("$r->name\n")
修正 → print($r->name, "\n")
0561デフォルトの名無しさん2007/02/02(金) 22:02:33
>>559
evalで作るのと、*{...} = sub{}で作るのどっちがスマートなんだろ。
0562デフォルトの名無しさん2007/02/02(金) 22:22:43
evalはパーサが動く分遅くはなりそうだけど
通常の定義と見た目が一貫してるから読みやすいかも。

シンボルテーブル+クロージャだと、クロージャ作る側のレキシカルな環境?も意識しないとならないし、ちょっと嫌。
05635542007/02/03(土) 10:09:16
>>556-562
ご回答ありがとうございます。

いろいろ方法があるのですね。
まだご回答の内容が理解できていないので、勉強してきます。
0564デフォルトの名無しさん2007/02/04(日) 09:24:15
他人が作った、FTPで複数のファイルを受信する為の処理に手を入れなくては
いけないのですが、元のソースにエラー時の処理が全く入っていません。

$ftpcmd = ○○○ #<-ftpコマンドが記述されたテキストファイル
system("ftp -n < $ftpcmd);

対象ファイルは複数あって mget logfile*.* で取って来ています。
ファイルが取って来れなかったり、相手に接続できなかったりといったような
エラーが起きた事を判定するにはどのようにすればいいのでしょうか?
PerlもLynuxも初めてなので、出来るだけ簡単な方法を教えていただけると
ありがたいです。

よろしくお願いします。
0565デフォルトの名無しさん2007/02/04(日) 13:04:46
Net::FTP で書き直したらいいんじゃないかな。
0566デフォルトの名無しさん2007/02/04(日) 15:35:04
>>564
Net::FTPでスクリプト書く例
http://search.cpan.org/~gbarr/libnet-1.20/Net/FTP.pm

モジュールが入ってなかったら「perl CPAN」でググってCPANの使い方覚えていれろ
0567デフォルトの名無しさん2007/02/04(日) 16:26:22
Lynuxはおらも初めてだ
0568デフォルトの名無しさん2007/02/04(日) 17:13:07
>>565-566
そのやり方で書き直してみます。
ありがとうございました。

>>567
Linuxの打ち間違いですね。
0569デフォルトの名無しさん2007/02/05(月) 23:30:35
>>565-566

教えていただいた方法で組んでみたのですが、複数のファイルをワイルドカードで
指定して取って来るにはどうしたらよいのでしょう?

対象のファイル名には出力された日付と時刻が含まれていて、個数も名前も不定
なのです(○○○YYYYMMDDHHMM.logのようなファイル名で、日付部分が
当日のものだけ取って来たいのです)。

何度もすみませんがよろしくお願いします。

0570デフォルトの名無しさん2007/02/06(火) 01:45:03
sub mget {
   my($ftp,$pattern) = @_;
  foreach my $file ($ftp->ls($pattern)) {
     $ftp->get($file) or warn $ftp->message;
  }
}
0571デフォルトの名無しさん2007/02/06(火) 23:22:19
>>570
どうもありがとうございます。
上手く持ってこれました。

0572デフォルトの名無しさん2007/02/07(水) 11:31:08
希望結果を得たいのですが、実行結果の通りになります
以下のソースで実行結果になることは納得できるのですが、
希望結果を得るためにはどうすれば良いのでしょうか?

●ソース
@$data=(
{'name'=>'test1','pay'=>'1000','cancel_flg'=>'0','create_date'=>'20070131','cancel?date'=>''},
{'name'=>'test2','pay'=>'2000','cancel_flg'=>'1','create_date'=>'20070110','cancel_date'=>'20070120'},
{'name'=>'test3','pay'=>'100','cancel_flg'=>'0','create_date'=>'20070201','cancel_date'=>''},
);
foreach(@$data){
push(@lst,$_);
if($_->{cancel_flg}){
$_->{create_date}=$_->{cancel_date};
$_->{pay}="-".$_->{pay};
push(@lst,$_);
}
}
print "$_->{name}\t$_->{pay}\t$_->{create_date}\n" foreach(@lst);

●実結果
test1 1000 20070131
test2 -2000 20070120
test2 -2000 20070120
test3 100 20070201

●希望結果
test1 1000 20070131
test2 2000 20070110
test2 -2000 20070120
test3 100 20070201
0573デフォルトの名無しさん2007/02/07(水) 11:44:59
foreach(@$data){
push(@lst, {%$_});
0574デフォルトの名無しさん2007/02/07(水) 11:55:08
>>573
ありがとうございます
希望どおりの結果を得られました
ハッシュ内のデータを1つずつ別のハッシュに移し替えることで回避していましたが
これからはソースがスマートになりそうですw
私が無知なだけだと言う話かも知れませんが、勉強になりました
0575デフォルトの名無しさん2007/02/07(水) 12:23:24
こういうことだな。
$X = ['A'];
$Y = $X; #リファレンスデータのポインタ(?)だけをコピーして、データそのものはコピーしてない。
$X->[0] = 'B';
print $Y->[0];

結果「B」
0576デフォルトの名無しさん2007/02/07(水) 12:36:30
ちょっとCPANで調べるとStorableのdcloneとか、
Clone(::More/Fast/PP/Any...)とかなんかたくさんあるんだけど
どれを使うのがいいんだよ
0577デフォルトの名無しさん2007/02/07(水) 12:39:19
俺は年寄りなのでcancelないときもコピーすんのもったいないと思ってしまう
0578デフォルトの名無しさん2007/02/07(水) 13:56:18
辞書みたいなものを作っているのですが、見出し語にダブりが多数あります。
こんな感じで。

<midashi>kuki</midashi>
茎とはクキである。・・・・・

<midashi>kuki</midashi>
  茎とはクキである。・・・・・

見出し部分タグ内が同じ場合のみ、一つ残してダブりのぶんは見出しも本文も消す、
という作業を行いたいのですが、perlで出来ますか? 
何を勉強すればよいのか、示唆頂ければありがたいです。
0579デフォルトの名無しさん2007/02/07(水) 14:05:52
xmlなら、専用のエディタ使う方がよっぽど早くて安全だと思うのだが。
0580デフォルトの名無しさん2007/02/07(水) 16:05:05
ファイルのパースさえ出来れば楽勝だろうけどたぶんそこが一番の問題だと思う
機械読み取りを考慮した仕様になってればいいんだが
0581デフォルトの名無しさん2007/02/07(水) 22:15:16
配列を初期化したいのですが、どのようにすればいいのでしょうか?

引き渡したパスにあるファイル名を配列に入れて、そのファイル1つ1つを順繰りに
処理していきたいのですが、1度処理をした後でもう1度処理を行うと、最初に配列
にセットしたファイル名が配列に残ってしまっています。
下のソースだと、「1回目」と「2回目」のところでは同じ内容のファイル名が表示
されます(2回目では何も表示されないで欲しいです)。
どこがおかしいのでしょうか?ご指導を宜しくお願いします。

sub aa{
($path) = @_;
@localfl;
@dir;

opendir(DIR,$path) || return(-1);
@dir = readdir(DIR);
foreach $f (@dir){
if($f =~ /^\.\.?/){ next;}#親&カレントフォルダ(.と..)を除外
$localfl{$f} = $f;
}
foreach $f (sort(keys(%localfl))){
print("1回目 $f\n");
}
undef @localfl;#これでクリア?
@localfl = ();#これでクリア?
foreach $f (sort(keys(%localfl))){
print("2回目 $f\n");
}
}
0582デフォルトの名無しさん2007/02/07(水) 22:20:07
@localfl と %localfl は別物ですよ
0583デフォルトの名無しさん2007/02/07(水) 22:55:59
なぜに Perl4 …
変数全部グローバルだし
0584デフォルトの名無しさん2007/02/07(水) 23:05:43
>>582
@localflには最初から何も入ってなくて、%localflをクリアしてないから
前の中身が残ってるということでしょうか?
%localflの中身をクリアすればOKですか(%localfl=""; とか・・?)

>>583
すみません、まだPerl触り出して1週間のド素人なもので・・。
0585デフォルトの名無しさん2007/02/07(水) 23:30:02
%localfl = ();
05865822007/02/07(水) 23:36:52
とりあえず >>585 の %localfl = (); または undef %localfh; で意図する結果が得られます

バグの温床になるのを防ぐために use strict; と use warnings; をお薦めします
変数を宣言するときは my を使ってください
適当に書き直したらこんな感じでしょうか

use strict;
use warnings;
sub aa {
my ($path) = @_;
opendir(my $dh, $path) or return -1;
my @localfl = sort grep { ! /^\.\.?/ } readdir($dh);
foreach my $f (@localfl) {
print("1回目 $f\n");
}
}
0587デフォルトの名無しさん2007/02/08(木) 00:19:07
>>585
>>586

丁寧に教えていただきありがとうございました。
参考にさせていただきます。
0588デフォルトの名無しさん2007/02/08(木) 20:09:30
Encodeモジュール使い方を勉強中です。
なんとか試行錯誤しながらやってるんですが、
Data::Dumper がやたら文字化けします。
Dumper無しで出力すると化けないので
エンコードの部分は間違ってないと思うのですが。
0589デフォルトの名無しさん2007/02/08(木) 20:16:37
use strict;
use utf8;
use Data::Dumper;
binmode STDOUT,":encoding(cp932)";
my $str="あああ";
print Dumper $str;
print $str;
以上をutf8で書いて実行すると
$VAR1 = "\x{3042}\x{3042}\x{3042}";
あああ
となります
どうにかして日本語をDumperする方法はないでしょうか?
05905782007/02/08(木) 20:17:25
ありがとうございました。
XML エディタ で検索してみましたが、どうもよく分かりませんでした。
ちなみに見出しは全部でaからzまで数十万あります。
ダブり語は多分、数千種類が各2〜7個くらいダブっています。
差し支えなければ、使えそうな専用エディタを教えて頂けないでしょうか?

ファイルのパースさえ出来れば楽勝だろうとおっしゃるのは素晴らしいです。
ちなみに楽勝というのはperl で、ですか? 
機械で読むというのがよく分からないのですが(すみません)、多分txt形式で
50MBくらいのファイルになりそうで、そこまでは出来ます。
0591588=589 2007/02/08(木) 20:19:08
ちなみに環境は WindowsXP sp2 上で、ActivePerl Build 819 使用しています。
0592デフォルトの名無しさん2007/02/09(金) 02:39:44
なんとなくWebProgからきました。取り留めもない質問なんですがお願いします。

WEBの掲示板などでよく、特定のタグだけ書き込み許可してますよね。それを実現するのに
下記のようなコードを書きました。最近、WEBに限らず、テキスト系の処理は何するにも
こんな感じでsplitして再帰する書き方に固執してしまってます。
字ヅラ的には短くて気に入ってるんですが、処理的には効率悪い気がしてならないのです。
もっとうまい方法があるでしょうか。

sub escape_limited {

my %args = (str => '', @_);

$exception = q!</?(?:a|img|blockquote|pre|code|span)(?:\s[^>]*)?>!;

my @scraps = split(/($exception)/im, $args{'str'}, 2);

if ((scalar @scraps) == 3) {

return &escape(%args, str => $scraps[0]). $scraps[1]. &escape_limited(%args, str => $scraps[2]);
}

else {

return &escape($args{'str'});
}
}
0593デフォルトの名無しさん2007/02/09(金) 04:00:04
sub escape_limited {
  my %args = (
    str     => '',
    allowed => qr{a|img|blockquote|pre|code|span},
    @_
  );
  my $text = $args{str};
  $text =~ s{( < (?! /? (?:$args{allowed}) \b ) [^>]* > )}{ escape($1) }iegx;
  return $text;
}

とかでどう?
0594デフォルトの名無しさん2007/02/09(金) 09:53:04

$LT = quotemeta escape("<");
$GT = quotemeta escape(">");

($str = escape($str)) =~s/$LT\/?(a|img|b|blockquote|pre|code|span)\b.*?$GT//ig;

とかねー。多分軽いよ。

タグ内に'<' '>' が無いことを前提にしてるみたいだけど、大丈夫?
属性も調べないと、スタイルシートとかスクリプトとか埋め込まれる可能性もあるし。
0595デフォルトの名無しさん2007/02/09(金) 10:35:31
うおっ、間違えた。正規表現のリテラルのトコ…。
s/$LT(\/?(?:a|img|b|blockquote|pre|code|span))\b(.*?)$GT/<$1$2>/ig

だわな。スマソ
0596デフォルトの名無しさん2007/02/09(金) 13:59:17
試しました。
592(私):スプリット型
593:一発置換型
594:例外事後処理型

マッチングがひとつもない場合
592:速い
593:圧倒的に遅い
594:速い

マッチングがある場合
592:圧倒的に遅い(しかも多重再帰の警告でまくり)
593:少し速い
594:速い

一旦、なりふり構わず置換してから例外を元に戻すってのは、
分かりやすいだけで処理的に気持ち悪いと思ってましたが、
意外と効率いいんですね。
0597デフォルトの名無しさん2007/02/09(金) 14:07:03
お礼を忘れました。みなさんありがとうございます。
ひとつ、事後処理型の場合、対象文字列に最初からエスケープ文字が
含まれてるケースを考慮する必要がありますね。これが一番やっかいかなあ。
0598デフォルトの名無しさん2007/02/09(金) 14:10:29
いや、一旦、二重エスケープになって元に戻るからいいのか。
混乱してきたので仕事に戻ります。
0599デフォルトの名無しさん2007/02/09(金) 15:02:53
>>590
テキスト読み込んで処理はPerlの得意とする分野なので楽勝

タグは<midasi></midasi>だけなのか?その他のタグがあったとして処理する必要はないのか?
複数の同じ見出しに対し残す本文はどれでもいいのか?
本文中にタグや特殊文字があったりした場合は?一意に判別できるエスケープの仕様はある?

あたりの仕様さえ確定できればファイル読み込みのやりかた、正規表現、ハッシュあたり覚えればできるっしょ
ちゃんとしたXML形式になってるなら専用のパーサ使えば楽が出来るが、正規表現でも十分なように思える
0600デフォルトの名無しさん2007/02/09(金) 23:36:51
ちゃんとしたXMLになってなくても、XML::Liberal使えばわりといける。
0601デフォルトの名無しさん2007/02/10(土) 03:35:34
wxperlを使ってGUIのメモ帳を作っています。ファイルを新規に保存するとき
ファイルと同名のフォルダをつくりたいのですがなぜかうまくいきません。
my $filename = $saveasdialog->GetPath;  
$this->{text_ctrl_1}->SaveFile($filename);
mkdir($filename);

このスクリプトで、一行目でwxperl filedialogオブジェクトにより
ファイル名が取得され$filenameに入ります。2行目でsavefileメソッドで
テキストが$filenameの通りに名前がつけられ保存されます。これは正常にいきます。
しかし、3行目のコードではフォルダが作成されません。

wxperl固有というよりもperlのコードの書き方に問題があるような気がするのですが、
アドバイスがあったらお願いします。
0602デフォルトの名無しさん2007/02/10(土) 03:46:04
> ファイルを新規に保存するときファイルと同名のフォルダをつくりたい

なんじゃそりゃ??
0603デフォルトの名無しさん2007/02/10(土) 03:54:30
どの OS でテストしてるんだか知らないけど、ファイルシステム側の問題だろう。
例えば Windows では同名のファイルとフォルダは作れない。
06046012007/02/10(土) 04:31:21
>>603
すみませんでした。windows xp, active perl環境です。
>例えば Windows では同名のファイルとフォルダは作れない。
これは知りませんでした。というか大昔に聞いたことがあるような気がしますが
盲点でした。
mkdir($filename."Folder");
のようにしたら("作成したファイル名"Folder)という名前でフォルダが出来ました。
自分の考えている機能としてはこれで十分先に進めそうです。
ありがとうございました。
0605デフォルトの名無しさん2007/02/10(土) 13:39:41
て言うか、同名のファイルとフォルダを作れるファイルシステムってあったっけ?
0606デフォルトの名無しさん2007/02/10(土) 13:43:46
同名のファイルとフォルダがあるとApacheがまいっちんぐしちゃうよ
0607デフォルトの名無しさん2007/02/10(土) 15:15:31
>>605
むかし、「同名のファイルとディレクトリ作れるんじゃねえ!!」と怒った記憶がある。
0608デフォルトの名無しさん2007/02/10(土) 17:42:01
これも拡張子を非表示にするゆとり教育の弊害か…
0609デフォルトの名無しさん2007/02/10(土) 18:27:55
これもファイル名とディレクトリ名を同じ名前空間に置くという異常なことを
やったUNIXの弊害か……
0610デフォルトの名無しさん2007/02/10(土) 18:44:58
初学ながらリファ本片手にCGIスクリプトを書いています。
下記のような問題にぶつかるもどうにも解決方法がわかりません。
どうすればよいか教えてください。よろしくお願いします。

【やりたいこと】
 投票CGIの改造で、イエスノーの2択の選択肢の投票に応じて、表示されて
いる数字も増減されるようにしたい。 数字の増減はカウンタスクリプトを流用し
ています。

【現在書いているスクリプト(抜粋)】
open(FILE, "+<./count.dat") or die("エラー:カウントファイルが開けません");
eval { flock(FILE, 2); };
$counta = <FILE>;
seek(FILE, 0, 0);
if($item == 1 ){ print FILE $counta+1 } else { print FILE $counta-1 }
close(FILE);

【問題点】
 例えば現在の$countaの値が100で、値が-1される場合、結果は99となって欲しいのに、990と
なって返ってきます。1000から999の場合なども同じです(どうも桁数が減る場合にうまく動作し
てくれない模様)。

【解決したいこと】
 100が99になって欲しい場合、その動作が990とならず希望どおり表示されるようにしたいです。

【その他】
 同じ桁数が変わる場合でも、99→100など、桁数が増える場合は問題が発生しないです。
0611デフォルトの名無しさん2007/02/10(土) 18:45:26
ファイル名とディレクトリ名の名前空間が異なるなんて想像したら
そちらの方が異常だと思うが。

そもそもそいった実装のOSはあるんかえ?
0612デフォルトの名無しさん2007/02/10(土) 18:58:46
>>609
最近それで頭に来てる。百万個を越えるファイルを持つ非常に巨大なファイルツリーを
トラバースするのにリソース食いまくり。
やっぱり分けてあるシステムってあるんだ。
0613デフォルトの名無しさん2007/02/10(土) 19:19:45
>610

use Fcntl qw/:flock/;

open my $fh, '+<', './count.dat' or die $!;
eval { flock $fh, LOCK_EX };
$count = <$fh>;
seek $fh, 0, 0;
print $fh $item == 1 ? $count + 1 : $count -1;
truncate $fh or die $!;
close $fh;
06146102007/02/10(土) 19:27:24
>>613
正直、書かれている内容がさっぱり分からないので、リファ本で読み進めながら
テストしたいと思います。ありがとうございます。
06156102007/02/10(土) 21:14:23
>>613
早速アドバイスを実装したところ、思った通りに動いてくれました。
どうもtruncateがポイントだったようですね。ありがとうございました。
0616デフォルトの名無しさん2007/02/11(日) 04:18:34
正規表現でマッチしたものを任意の変数に入れて(もしくは任意のエイリアスに結びつけて)、
後で取り出すことって出来るのでしょうか?
マッチした順に$1や$2ではなく、(.*?>$name)とかした時、
(.*?)のマッチを$nameで受け取れると非常に嬉しいのですが。。
どなたかアドバイスいただけると嬉しいです。。
0617デフォルトの名無しさん2007/02/11(日) 05:58:10
>>616
マッチした後に代入しておくんじゃなんで駄目なんだ?
if (/(.*?)/) {
$name = $1;
}
0618デフォルトの名無しさん2007/02/11(日) 06:01:14
>>616
マッチしたもののリストが返ってくるのでそれを受け取る
($a, $b) = /^(.)(.)/;
06196162007/02/11(日) 09:49:39
>>617-618
返信ありがとうございます _ _
なぜエイアリアスに結びつけたいかというと
βのウェブサービスのラッパーを作っていて、
正規表現がころころ変わる可能性がある(欲しい文字列が前後する可能性がある)からです。
欲しい文字列が前後してしまうと正規表現だけでなく、
その後の正規表現を受け取るコードも変更しなければならなくなってしまうので。。
# 正規表現を正規表現で自動生成するスクリプトを作っていたら、
# 文字列が前後した場合その部分は自動化できなくなってしまうことに気づき、
# 質問させて頂きました。
0620デフォルトの名無しさん2007/02/11(日) 11:04:20
>>588,599
それは文字化けでなく、エスケープされてるだけ。
Data::Dumper の仕様
0621デフォルトの名無しさん2007/02/11(日) 11:30:06
詳説正規表現第2版 7.8.8 名前つきキャプチャを模倣する
(.*?)(?{ $name = $^N })
06225922007/02/11(日) 15:22:43
タグそのものだけでなく、例えば<pre>の内側はエスケープしない、など、
ちょっと込み入っている場合、例外事後処理だと信じられないほど遅くなりました。
コーディングに問題があったかも知れませんが。
という訳でスプリット型に戻しました・・。もっとうまい方法があるでしょうか。

sub escape_limited {
 
 my %args = (str => '', exception => [], exception_block => [], @_);
 
 my @regexp_array;
 
 (scalar @{$args{'exception_block'}}) and push(@regexp_array, sprintf(q!<(%s)\b.*?>.+?</\2>!, join('|', @{$args{'exception_block'}})));
 (scalar @{$args{'exception'}}) and push(@regexp_array, sprintf(q!</?(?:%s)\b.*?>!, join('|', @{$args{'exception'}})));
 
 return &loop($args{'str'}, join('|', @regexp_array));
 
 sub loop {
  
  if ($_[1]) {
   my @scraps = split(/($_[1])/is, $_[0], 2) ;
   return &escape($scraps[0]). $scraps[1]. &loop(pop(@scraps), $_[1]) if ((scalar @scraps) >= 3);
  }
  
  return &escape($_[0]);
 }
}
0623デフォルトの名無しさん2007/02/11(日) 18:28:22
>>619
たぶんアプローチが根本的に間違ってる。
06246162007/02/11(日) 19:05:54
>>621
ありがとうございます!知らなかったです使わせて頂きます。
http://search.cpan.org/dist/perl/pod/perlre.pod
>>623
良くあるので、今回もそうかもしれないのですが;
http://www.nicovideo.jp/の検索のラッパーとして、
http://www.kiseki.info/niko-per/matome_search.cgiを作りました。
そして、上記ラッパーの正規表現生成に、
http://www.kiseki.info/niko-per/regexNikoniko.txt
というコードを使っていました。(>>621さんのアドバイス未導入コード)
お暇があればアドバイスいただけると幸いです。
0625デフォルトの名無しさん2007/02/11(日) 22:38:26
前から疑問に思ってたんですが、
$input = 'hoge';
$output = $input;
$output =~ s/ho/ha/g;
return $output;
これを$outputを使わずにreturn &func($input, /ho/, 'ha');
みたいに表現することはできないんでしょうか。
0626デフォルトの名無しさん2007/02/11(日) 22:54:33
こんなん?
join('ha', split(/ho/, $input))
0627デフォルトの名無しさん2007/02/11(日) 23:09:34
return str_replace('ho', 'ha', $input);
0628デフォルトの名無しさん2007/02/11(日) 23:11:41
>>627
どこの国のPHPだよ
0629デフォルトの名無しさん2007/02/12(月) 00:06:59
関数的な操作が充実してる割に標準でついてる関数がほとんど破壊的なんだよな
06305922007/02/12(月) 00:10:16
すみません、うそを言いました。594さんのがやっぱり一番速いです。
遅くなったのはバグでした。スレ汚しすみません。
0631デフォルトの名無しさん2007/02/12(月) 02:58:08
パッケージが提供してる関数の一覧って簡単に取得できますか?
06326312007/02/12(月) 03:15:00
ちょっとぐぐったら見つかりました。すみません。
http://search.cpan.org/~mlfisher/pmtools-1.01/pmeth
サブクラスなどにもぐっていく処理もありますが、どうもこの行がミソのようでした。
keys %{ "$module::" }
0633デフォルトの名無しさん2007/02/12(月) 07:44:44
動的に生成された複数のPNG画像データをzip圧縮したいと考えています。

GDモジュールとArchive::Zipモジュールが活用できそう、
と調べたのですが不明点があります。

Archive::ZipモジュールのaddFileメソッドは引数としてファイル名が必要ですが、
GDモジュールのpngメソッドで動的に生成されたPNG画像データをzip圧縮するにはどうしたら良いでしょうか。
生成されたPNGデータをbinmodeを使用して画面表示するサンプルは見かけたのですが・・・

Perlを勉強し始めたばかりで基本事項も良く分からず五里霧中です。
アドバイスのほど、よろしくお願いいたします。
0634デフォルトの名無しさん2007/02/12(月) 09:40:25
addString
0635デフォルトの名無しさん2007/02/12(月) 13:43:39
system() で所定の場所からwgetでファイルを持ってくる処理を作っています。
必ずしもその場所にファイルがあるとは限らないので、ファイルが無かった時と
接続出来ないなどで取ってこれなかった時を判定したいのですが、どうすれば
よいのでしょうか?
0636デフォルトの名無しさん2007/02/12(月) 13:47:37
system関数の戻り値でチェックできないの?
0637デフォルトの名無しさん2007/02/12(月) 14:20:49
>>636
ありがとうございます。
やってみましたが、ファイルが無かった時も接続できなかった時も、戻り値は
256となるので区別がつかないです・・。
0638デフォルトの名無しさん2007/02/12(月) 14:21:07
wgetの複雑な機能をバリバリ使ってるなら別だが、ただファイルとってくる
だけならLWP使う方がその辺のエラー処理は書きやすいと思うけどな。
0639デフォルトの名無しさん2007/02/12(月) 14:39:33
>>638
すみません、wgetを使わないといけないので別の方法で取ってくるというのは
出来ないのです。
0640デフォルトの名無しさん2007/02/12(月) 15:06:35
美しくないがstderr読むしかないだろう
0641デフォルトの名無しさん2007/02/12(月) 15:11:25
接続とファイル存在チェックだけ別ルーチンで作っといて、
それがOKならwgetで取ってくるってのはどうだ?
0642デフォルトの名無しさん2007/02/12(月) 15:59:14
>>640,641
ありがとうございます。>>640さんの方法の方が簡単そうなのでこちらで
いこうと思うのですが、

open(STDERR, ">> errmsg.txt");
$ret = system("wget 〜");
close(STDERR);

とやって、$ret が256 だったらerrmsg.txtを1行づつ読み込んで
[ 404 Notfound ]という文字列が見つかったらファイルなし、無い
ならその他のエラー、という感じでいいのでしょうか?
0643デフォルトの名無しさん2007/02/12(月) 16:27:24
というかwgetはちゃんと終了コード返すけど?

# wget -q http://www.google.com/ && echo ok
ok
# wget -q http://www.google.com/nonexist || echo ng
ng
#
0644デフォルトの名無しさん2007/02/12(月) 16:28:39
あーごめん、404と接続できなかった時とを区別したいのか。早とちりスマソ。
0645デフォルトの名無しさん2007/02/12(月) 20:57:32
気にしてへんからええよ。
書いてくれてありがとな。
0646デフォルトの名無しさん2007/02/13(火) 00:23:46
>>642
perldoc IPC::Open3
0647デフォルトの名無しさん2007/02/14(水) 00:10:02
数字と文字が混在した要素からなる配列があるんですけど、これをsortすると
1〜〜,11〜〜,2〜〜,23〜〜・・・
という風になってしまいます。
これを数字順
1〜〜,2〜〜,11〜〜,23〜〜・・・
にするにはどうすればいいのでしょうか??
0648デフォルトの名無しさん2007/02/14(水) 00:17:12
>>647
@dst = sort { $a <=> $b } @src; # 数値ソート
@dst = sort { $a cmp $b } @src; # 文字列ソート(こっちは略せる)
0649デフォルトの名無しさん2007/02/14(水) 00:39:50
>>648
それ試したんですけど、数字順にならないんです・・orz
0650 ◆TWARamEjuA NGNG?2BP(6811)
@dst = sort { sprintf qq|%02d|,$a cmp sprintf qq|%02d|,$b } @src;
とかとか♪
0651デフォルトの名無しさん2007/02/14(水) 00:53:47
>>650
Sort subroutine didn't return a numeric value
ってエラーがががorz
0652脱帽2007/02/14(水) 00:59:09
ちょうてけとう

@dst = sort { ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } @src;
0653デフォルトの名無しさん2007/02/14(水) 00:59:59
print join qq/, /, sort { $a <=> $b } qw/21d 1aa 11b 2cc 13e 5b/;
1aa, 2cc, 5b, 11b, 13e, 21d

ちゃんとなってるけどなあ
0654デフォルトの名無しさん2007/02/14(水) 01:08:03
>>653
いろいろ試したらできました。
splitを何回か使って要素の中の数列にまで要素を分割して比較したらうまくいきました。
俺なんかに付き合ってくれてありがとうございましたm(_ _m)
0655デフォルトの名無しさん2007/02/14(水) 05:36:07
ひ〜(悲鳴)
0656デフォルトの名無しさん2007/02/14(水) 06:05:37
(悲鳴)
0657デフォルトの名無しさん2007/02/14(水) 06:25:24
 シュー 三(悲鳴)
0658デフォルトの名無しさん2007/02/14(水) 06:31:03
質問〜perlから直接web上のファイルを開く事はできますか?
ソースをテキストで保存したくて

open(IN,"http://****・・・") or die "無理";

ってやってみたら無理でした。
0659デフォルトの名無しさん2007/02/14(水) 06:56:37
startup.plに
print int rand 10;
のようなコードを入れたtest.plをrequireして実行すると
↓↓httpdプロセス番号(実行結果)↓↓
1(3), 2(3), 3(3), 1(5), 2(5), 3,(5), 1(2), 2(2), 3(2)
のように完全でない乱数がある規則で発生してしまいます。
srandを加える、もしくはtest.plを意図的に更新し共有メモリから外すと期待通り全て違う表示がされます。
なぜこのような動作になるのか教えていただけませんでしょうか。
環境はFedora core5、Perl v5.8.8、mod_perl-2.0.2-5.1、httpd-2.2.2-1.2(prefork)です。
0660デフォルトの名無しさん2007/02/14(水) 07:17:33
>>658
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq9.html#how_do_i_fetch_an_html_file

>>659
【激速】mod_perl SpeedyCGI FastCGI【激速】
http://pc10.2ch.net/test/read.cgi/php/1149505269/
0661デフォルトの名無しさん2007/02/14(水) 07:32:33
あ、ありがとうございます!
お陰で心置きなく寝れます。いや、仕事でした。いってきます;;
0662デフォルトの名無しさん2007/02/14(水) 11:51:52
% cat > test.pl
#!/usr/bin/perl
$ID = "id";
$PASS = "pass";
__END__

perlと余り関係ない質問かもしれませんが..
上の様なスクリプトを作った場合ファイルを開くと$PASSの「pass」が丸見えに
なるのですがこの部分を暗号化してわからないようにしてスクリプト実行時に
何らかの処理をして$PASSをpassに戻すような事は可能でしょうか?

0663デフォルトの名無しさん2007/02/14(水) 12:01:30
なんらかの処理をしてpassに戻ったら意味がないだろうが
SHA-1とかでハッシュにしてそれを持ってるとよろし
0664デフォルトの名無しさん2007/02/14(水) 12:05:42
>>663
ありがとうございます
ぐぐってきます..(´・ω・)
0665デフォルトの名無しさん2007/02/14(水) 13:30:21
音声入力でPerlスクリプトを書ける時代はいつになったら来るのかね
ttp://www.youtube.com/watch?v=KyLqUf4cdwc
0666デフォルトの名無しさん2007/02/14(水) 14:08:49
>>665
なんか失敗ばっかりしているように見えるね。
0667デフォルトの名無しさん2007/02/14(水) 14:35:28
>>665
warata
0668デフォルトの名無しさん2007/02/14(水) 14:45:30
>>665
やべえ面白すぎるwww
0669デフォルトの名無しさん2007/02/14(水) 15:29:03
SMTPを使わず/usr/lib/sendmail等から送る場合sendmailをパイプでopenする
手法がよく使われていますがこれらを実現出来るCPANに登録されているスタンダードな
モジュール名を教えていただけませんでしょうか。
0670デフォルトの名無しさん2007/02/14(水) 15:39:30
途中で手入力してるしw
開発部署のあちこちのデスクから、こんなん聞こえてきたらコエー。
0671デフォルトの名無しさん2007/02/14(水) 15:56:45
>>669
search.cpan.orgでsendmailをキーワードに検索すればいくつか出てくるので
適当に好きなのを使えばいいんじゃないか。
0672デフォルトの名無しさん2007/02/14(水) 20:43:09
>>665
この後に、オフィスPCに切れて投げ壊してる外人おっさんの動画を
0673デフォルトの名無しさん2007/02/14(水) 21:31:26
>>665
That was eazy.txt
ワロス
0674デフォルトの名無しさん2007/02/14(水) 21:57:07
Thank you って言ったらそれまで入ってもうて、必死で消してるw
0675デフォルトの名無しさん2007/02/14(水) 22:00:56
Undoできないのかな
0676デフォルトの名無しさん2007/02/14(水) 22:03:04
5分もかかってまだ open ( INFO しか入力できてねぇしw
0677デフォルトの名無しさん2007/02/14(水) 22:12:07
いや、INFO は結局入力できず手で入れてたし。
0678デフォルトの名無しさん2007/02/14(水) 22:39:15
検索結果を表示させるだけのものなんですが、大文字小文字の区別がつきません
297 if ( $line =~ /\Q$in{$form1}\E/ ) {
を   if ( $line =~ i/\Q$in{$form1}\E/ ) {  にするとエラーが出てしまいます

syntax error at test.cgi line 297, near "$in{"
syntax error at test.cgi line 297, near "/ )"
syntax error at test.cgi line 300, near "}"
Execution of test.cgi aborted due to compilation errors.

292 sub umu1 {
293 open(IN,"$file"); #csv読み込み
294 while(1) {
294 $line = <IN>; #csvの行を&lineに代入
295 @data = split( /,/ ,$line ); #@data[0~]にcsv行を個別に代入
296 if ( $line eq "" ) { last; } #無限ループ終了条件
297 if ( $line =~ /\Q$in{$form1}\E/ ) {
298 print "$data[0]$data[1]"."<br>"."\n";
299 }
300 }
301 close(IN);
302 }
06796782007/02/14(水) 23:04:54
自己解決しました。なんともお粗末なミスで・・・
0680デフォルトの名無しさん2007/02/15(木) 00:37:59
WWW::Mechanizeを使用しているのですが、RecIE(http://www.h7.dion.ne.jp/~umiumi/)
のように、IEにhtmlの内容を表示させながらhtml解析する方法ってないでしょうか?
今はcontentで一旦ファイルに保存して、systemでIEを起動させ表示させています。
0681デフォルトの名無しさん2007/02/15(木) 10:04:00
sub foo {
処理
return(@A,@B,@C)
}

としている関数で、
(@A,@B,@C) = &foo()
↑のような感じで返り値を配列個別に受け取りたいんですが、
Perlでは可能なんでしょうか?
0682デフォルトの名無しさん2007/02/15(木) 10:16:08
sub foo {
hoge;
return \(@A, @B, @C);
}

($refA, $refB, $refC) = foo;

こういう感じにリファレンス渡しにしないといけない。
0683デフォルトの名無しさん2007/02/15(木) 11:20:31
>>680
Win32OLE
JavaScriptみたいなタグの分解も一緒にやってくれる
0684デフォルトの名無しさん2007/02/16(金) 04:43:05
Win32::GUIのListviewで行ごとに色を変えるにはどうしたらよいでしょうか?
0685デフォルトの名無しさん2007/02/16(金) 14:44:56
>>684
カスタムドローかオーナードロー
ってかWinAPI使うならCとかC++のが断然楽だぞ?
0686デフォルトの名無しさん2007/02/16(金) 17:14:27
>>685
カスタムロードがいいみたいですね。
Perlのサンプルコードはぜんぜんないようで。。。
困った
0687デフォルトの名無しさん2007/02/16(金) 17:21:16
ドロー
0688デフォルトの名無しさん2007/02/16(金) 17:36:30
>>686
Win32::GUIって自分でウィンドウメッセージ取れないのか?
取れるならC,C++のサンプルコードと同じようにできるが
できないなら知らん
0689デフォルトの名無しさん2007/02/16(金) 19:01:28
http://perl-win32-gui.sourceforge.net/cgi-bin/wiki.cgi?Change_Listview_Item_Color

サンプルコードは一応あるんだが、エラーが出て動かん。
カスタムドローの構造が古いのかな???
バイナリをいろいろ変換してるがよう分からんわ。
0690デフォルトの名無しさん2007/02/17(土) 15:11:52
>>689
substr( $lParam, 48, 8, $clrText);
を
substr(unpack("P56", pack("L",$lParam)), 48, 8, $clrText);
にするとエラーは無くなるが、文字色は変わらない。

要するに、$lParamはNMLVCUSTOMDRAW構造体へのポインタ
cf. http://www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm
であって、この構造体の中身を書き換えればいいように思えるのだが、
Perl でどうすればいいのかわからない。
0691デフォルトの名無しさん2007/02/18(日) 17:54:02
CUIサーバープログラムで裏で1秒ごとにデータファイルを読み込みながら
クライアントにその時々の最新データを返すにはどのようにすればいいのでしょうか?

&readdata
sub readdata{

  after(1000,&readdata);
}
0692デフォルトの名無しさん2007/02/18(日) 17:55:11
Tkで使うafterのようなものがあるのでしょうか?
ということの説明のためにコードを書いていたのですが、途中で投稿してしまいましたorz

0693デフォルトの名無しさん2007/02/18(日) 19:55:10
sleep(1)
0694デフォルトの名無しさん2007/02/18(日) 20:26:34
ある数値が何行にもわたって書いてあるいくつかのテキストを読み込んで
指定した列の数値の平均を割り出すプログラムをperlで作りたいんですが
どのように作ればいいんでしょうか?
入門サイトなどをいくつか見てきましたが
これといったお手本が無く、行き詰まってしまいました。
お願いします。
0695デフォルトの名無しさん2007/02/18(日) 20:47:41
>>694
もちっとデータに具体性を出してほしい
例を上げて
0696デフォルトの名無しさん2007/02/18(日) 20:56:22
>>695
レスありがとうございます。
例というか、実際に使うテキストファイルの最初の5行をそのままコピペしますが

0; 133.44; 3180
1; 134.76; 3180
2; 168.35; 3180
3; 141.58; 3180
4; 157.86; 3180
5; 176.92; 3180

こうなってます。
一番左は列数、二列目が平均値を出したいデータ、三列目は無視してください。
二列目の数値の平均値が出したいのです。
ひとつのテキストファイルに44640行、
こんな感じの数値がずらずらと並んでいるので
二列目の数値を全部足して44640で割る、ということがしたいんです。
0697デフォルトの名無しさん2007/02/18(日) 21:11:30
とりあえず
・ファイルをperlに読み込んで各行をループさせる
・一行の中で、2列目の数値を取り出す
といった操作が必要だけど、
ファイルの読み書きや、正規表現とか、まったく何も分からないの?
0698デフォルトの名無しさん2007/02/18(日) 22:01:45
>>694
ちょうど最近それっぽい記事が出てた。
ttp://codezine.jp/a/article/aid/904.aspx
区切り記号が「,」か「;」の違いがあるとか微妙にちがうけど、
コレが理解できれば希望のスクリプトを書くのも出来るはず。
コピペだけですませようとしてるんなら無理だけど。
0699デフォルトの名無しさん2007/02/18(日) 22:02:02
>>697
一応、基礎的なことはサイトを見て勉強してきたんで
正規表現のことや
ファイルを読み込んでコマンドプロンプトに内容を表示させたり
ファイルの作成、書き込みなどは理解しているつもりです。
ただそれらのことを組み合わせてプログラムを作るとなると
まだよくわからないんです。
もう明日中には完成させなきゃならないんで
できればヒントだけでもお願いしたいです…
0700デフォルトの名無しさん2007/02/18(日) 22:08:59
こんな感じじゃね?試してないけど。

my $sum = 0;
my $i = 0;
for my $file (qw(unko1.txt unko2.txt)) {
 open my $fh, $file or die "開けん";
 while(<$fh>) { $sum += (/;\s*(-?\d\.\d);/)[0]; $i++; }
}
print "阿部怜治:", $sum / $i, $/;
07016942007/02/18(日) 23:30:17
>>698.700
ありがとうございます。
もう少し頑張って明日試してみます。
0702デフォルトの名無しさん2007/02/19(月) 00:43:52
じゃ模範的なperlで
perl -pae "$l++;$s+=$F[1]}{$_=$s/$l" input.txt
0703デフォルトの名無しさん2007/02/19(月) 00:58:40
perl -F";" -lane '$t+=$F[1]; END{print $t/$.}' input.txt
0704デフォルトの名無しさん2007/02/19(月) 04:15:19
>>702
$F[1]}{
の
}{
って何してるの?
0705デフォルトの名無しさん2007/02/19(月) 04:59:09
>>704
$ perl -h
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed

-p は while (<>) { ... print; } で囲まれる。
0706デフォルトの名無しさん2007/02/19(月) 05:26:43
挙動的に同じって意味だと思ってたら、
本当にプリプロセッサのように囲まれるのね
0707デフォルトの名無しさん2007/02/19(月) 18:41:27
if ($a) { print $a; }
この書き方と

print $a if $a;
この書き方では何か違いはあるのでしょうか
0708デフォルトの名無しさん2007/02/19(月) 18:44:48
見た目
0709デフォルトの名無しさん2007/02/19(月) 20:24:07
すいません、質問です。
大体5万行くらいの大きさのテキストファイルから、
重複している行
(連続して重複してるわけでは無く、内容が同じ行が
とびとびに存在してる)を一つのこして、残りは省く
というスクリプトを書く場合、
1)1行目はそのまま書き出す
2)2行目は1行目と比較して、同じだったら書き出さない、違ったら書き出す
3)3行目は1行目と比較して、同じだったら書き出さない、違ったら2行目と比較して、、、
4)以下繰り替えし

このようなスクリプトしか無いのでしょうか?
処理に非常に時間がかかるので、何か良い方法があったら、御教示下さい。
0710デフォルトの名無しさん2007/02/19(月) 20:31:36
>>709
「perl 重複」でぐぐればいろいろテクニックが見つかる
0711デフォルトの名無しさん2007/02/19(月) 20:36:03
>>709
5万行くらいなら全部ハッシュテーブルに詰め込んでも大丈夫そうだが

順序崩していいならソートしてから重複を除くのがいいだろう
0712 ◆TWARamEjuA NGNG?2BP(6811)
1. 1行目の内容をハシュのキーに詰め込む。
while (<$fh>) {
 $hash{$_} = 1;

2. 読み込みが終わったら、keyを書き出す。
 print for keys %hash;


1-1. 読み込んだ順に書き出したい時。
my $line;
while (<$fh>) {
 $hash{$_} = [$_, ++$line];

1-2. 先に読み込んだ方を有効にしたい時。
 $hash{$_} = [$_, ++$line] unless $hash{$_} ;

2-1. 読み込みが終わったら、sortしながらkeyを書き出す。
 print for sort $hash{$a}->[1] <=> $hash{$b}->[1], keys %hash;

脳内妄想なので、補完よろしこ(照)
0713 ◆TWARamEjuA NGNG?2BP(6811)
ん、、、リファレンスにしなくても良かったか(呆)
07147092007/02/19(月) 20:42:52
>>710-712
ありがとうございます。ハッシュテーブルを使う方法は、
全く考えてませんでした(というか今迄使ったことが無かったので)

とりあえず、ハッシュテーブルの使い方を勉強してきます。
0715デフォルトの名無しさん2007/02/19(月) 20:57:05
perl -ne 'print if not $seen{$_}++;'
でいいだろ。

メモリ足りないようならtie()使ってDBMファイルをワークに使えばよし。
0716デフォルトの名無しさん2007/02/19(月) 20:58:32
Perl やっててハッシュを使ったことが無いとな
0717デフォルトの名無しさん2007/02/19(月) 22:07:13
今までperlやってなかったんだろ
0718デフォルトの名無しさん2007/02/19(月) 22:16:49
無名(?)のBLOCKで、
{} ←中身が空だとエラーになるんだけど、素のBLOCKは使ってもいいのか、
使えるが推奨されてないのか、perl的でないのか、どんな感じなんでしょう?
0719デフォルトの名無しさん2007/02/19(月) 22:28:43
WindowsでNMAKEが必要なモジュールのインストールについて質問。
Windows2000では問題がなかったのに、vistaになってDBIとかがインストールに失敗する。
どうすれば回避できる?
0720デフォルトの名無しさん2007/02/19(月) 22:41:06
>>719
そのエラーメッセージで言われてるところを直せばインストールできるんじゃないか
0721デフォルトの名無しさん2007/02/19(月) 22:46:44
>>718
$hoge = {};
何か見えてこないかい?

それからperlrefのMaking Referencesの3番辺りに目を通すといいと良いかと。
…スクリプティング言語資料室さんの訳、そこの所間違ってるかな
> 一方、ハッシュではなくBLOCKへのリファレンスを返すのであれば、
07227182007/02/19(月) 23:08:43
>>721
おー、ありがとう。丁度良い書き方が見つかりました。

{}だけ書いて中身は後で書きたいときに、エラーになるのが気持ち悪かったのですが、
{;}という方法があったか!
0723デフォルトの名無しさん2007/02/20(火) 16:33:08
最近対策済みのスパムに漏れて書き込みが散見されるので
if ($comment !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) {&er_("cannot write!","1");}

ここを変えたいと思います。
ここをひらがなの「あ」〜「ん」が含まれていなければ、という意味にしたいのですが、

「あ」は 82A0
「ん」は 82F1 です。

(\x82[\x9F-\xF2])|(\x83[\x40-\x96])
これをどう治せばいいのでしょうか?

↑正規表現とマッチングを理解していないので、
これのはっきりとした意味がわかっていません。
たぶんカタカナまで含まれていると思うのですが・・。
0724デフォルトの名無しさん2007/02/20(火) 16:51:19
>>723
sjisか。
| の左側がひらがなで、右側がカタカナでしょ。
ひらがなだけよけたいなら、

$comment !~ /\x82[\x9F-\xF1]/

でいいんじゃね?
07257232007/02/20(火) 17:04:41
>>724
ありがとうございます。
ひらがなのみのフィルタで無事動きました。
0726中の人2007/02/21(水) 00:01:39
>>721
すまん確認した。
どこをどうすればこういう勘違いをするんだかわれながら不思議だ。

つーことで今週末までをめどに修正しておきます。
0727デフォルトの名無しさん2007/02/21(水) 21:57:48
なるほどねぇ
07286882007/02/21(水) 22:09:52
>>690
自己解決しました。

my $CopyMemory=new Win32::API("kernel32", "RtlMoveMemory", "NPI", "V");
defined $CopyMemory or die "Cant find CopyMemory";

$CopyMemory->Call($lParam+48, $clrText, 8);
0729デフォルトの名無しさん2007/02/21(水) 22:18:46
>>728
訂正688→686
0730デフォルトの名無しさん2007/02/21(水) 23:31:13
>>728
substr( $lParam, 48, 8, $clrText);
を
$object->TextColor( (unpack('II',$clrText))[1] );
$object->TextBkColor( (unpack('II',$clrText))[0] );
にする方が楽だと思うけど、自己解決おめでと。
07316862007/02/22(木) 00:45:28
>>730
それじゃ、Selectすると全部色変わっちまうぜよ。
07326902007/02/22(木) 01:35:07
>>728
自己解決おめでとう。
>>689 の
substr( $lParam, 48, 8, $clrText);
の意味について考え直したのだが、以前のバージョンのActivePerl では
「裏仕様」として、「$lParam がポインタと考えられる場合は、間接指定
されたアドレスの文字列(バイト列)を操作し、そうでなければ$lParam
そのものを操作する」というのがあったのではないだろうか。
>>689 のソースを読む限り、そうとしか思えない。
 ところが、この「裏仕様」は危険であるし、安全確実な間接アドレス指定方法
が手当てされたから、いつかのバージョンで廃止されたんだろうね。
0733デフォルトの名無しさん2007/02/22(木) 16:07:47
if( $ENV{REMOTE_ADDR} eq ’’ )
ってありえるのでしょうか?
0734デフォルトの名無しさん2007/02/22(木) 16:26:33
>>733
CGIとかで動かしてるなら鯖の仕様次第だし
普通にコマンドラインから実行すれば空になる
0735デフォルトの名無しさん2007/02/22(木) 19:59:42
$comment に http の文字が5つ以上あるとエラーを出したいのですが、
正規表現でのチェックはどうすればいいのでしょうか?

if( $comment /~ (.*http.*http.*http,*http,*http) ) { error(); }

こんな感じでしょうか?orz
0736デフォルトの名無しさん2007/02/22(木) 20:46:31
if ($comment =~ /(.*http){5}/s) { error(); }
0737 ◆TWARamEjuA NGNG?2BP(6811)
print "error" if $comment =~ /http/g > 4;
 だめだった。。。

print "error" if scalar @{[$comment =~ /http/g]} > 4;
 桶だった。。。

詳しい人の解説キボンヌ(照)
0738脱帽2007/02/22(木) 21:26:24
スカラーだと真か偽しか返さないから
0739脱帽2007/02/22(木) 21:27:58
スカラーの場合は真か偽しか返さないからじゃ
0740デフォルトの名無しさん2007/02/22(木) 21:44:26
スカラーコンテキストでマッチした数が返ってくるのは置換の s///g の場合。
なので、もしそういう風に書きたいのなら

print "error" if $comment =~ s/http/http/g > 4;

とか書くといいかも。
0741デフォルトの名無しさん2007/02/22(木) 22:04:23
なるほどねぇ
07427352007/02/22(木) 22:24:08
if($comment =~ s/http/http/g > 4){ &er_('cannot write!');}
これでいけました。

s/hogehoge/fugafuga/gの s と g の意味がわからなかったのですが、
調べて理解できました、ありがとうございます。
0743デフォルトの名無しさん2007/02/23(金) 13:36:53
WindowsXP + ActivePerl 5.8.8 build 820 です
こちらは初めてです、29箱目ということで既出質問だったらすみません

上記環境で モジュール Encode が threads と同時に上手く働きません
perl素人の自分なりに調べた結果、Encode モジュールはスレッドセーフでは
ないのではないかと思い始めたのですが、それで間違いないでしょうか?
それとも私が何か大事なお約束や呪文を忘れているのでしょうか

また、スレッドセーフで無かった場合、各スレッド内で文字コード変換を
行いたい場合、皆さんはどのようにしているでしょうか
0744デフォルトの名無しさん2007/02/23(金) 14:04:52
>>743
適当にぐぐったらこういうのがあった。

ttp://www.nntp.perl.org/group/perl.perl5.porters/2007/02/msg120729.html

確かに試すとたまにおかしな結果になる。ちなみに手元のバージョンは
v5.8.8 built for i486-linux-gnu-thread-multiだった。

マニュアル見てもthread-safeであるとは書いてないし、原則は明記されて
なければunsafeと思えだから間違ってはいないのだろう。

で、俺はスレッドでEncode使った経験はないからなんともいえないのだが、
普通に考えたら適当なshared variableでlockかけてから使うぐらいしか
ないのではないだろうか。
07457432007/02/23(金) 14:22:08
>>744 返信ありがとうございます

確実に再現性のある最小コードを続いて投稿…と思ったのですが上手くいかずorz
自分の考え違いだったかもと思っていたところでした

URL 先のコードを試した結果、私の環境でもおかしな結果を不規則に起こしました

再入しないようにとりあえず自衛していく方向でいってみます
ありがとうございました
07467432007/02/23(金) 16:42:34
他のモジュール内でもEncode使っているのが多くありそうですね

PerlIO layer での :encoding(〜) とか
HTTP::Message の decoded_content とか便利だなーとガシガシ使っていたので
どんどん泥沼のソースになっていきましたorz
0747デフォルトの名無しさん2007/02/23(金) 16:45:17
よく使われる奴はthread safeにして欲しいね
0748デフォルトの名無しさん2007/02/23(金) 22:14:02
小飼氏(メーリングリスト)に投げてみたらいいんじゃないかな。
つーか投げてほしい。
0749デフォルトの名無しさん2007/02/23(金) 22:54:10
blogの感じからするとすごく暇そうなので「直せやおら」とか言うといいんじゃね?>Encode
メーリングリストはJcodeメーリングリストでok
0750デフォルトの名無しさん2007/02/24(土) 02:14:26
あのヒゲモジャのことだからギブミーpatchでかえされるに200ペソ
0751デフォルトの名無しさん2007/02/24(土) 11:03:22
それはひどい>ギブミーpatch
0752デフォルトの名無しさん2007/02/24(土) 13:51:21
なんの解決にもならないw>ギブミーpatch
0753デフォルトの名無しさん2007/02/24(土) 14:57:03
>>751-752
なにが「ひどく」て「解決にならない」なの?
ライセンスがArtisticとGNU GPLのデュアルライセンスで、
どっちもソースが公開されているものなんだから不具合あったらソースを追って自分で改変するくらい当たり前じゃん。
おまえらはフリーライダーなの?それともそれをやるだけの能力がない低脳なの?
0754デフォルトの名無しさん2007/02/24(土) 15:28:14
これは酷い混じれ酢だ
0755デフォルトの名無しさん2007/02/24(土) 17:43:38
少なくとも小飼氏よりは低能間違い無しです><
0756デフォルトの名無しさん2007/02/24(土) 20:38:11
patchが作れるなら人に頼らないしメールも送らないってば。
0757デフォルトの名無しさん2007/02/24(土) 20:55:47
「ギブミーpatch」といわれたら、「無理!」って返事すればいいだけ。

キラクニヤレヤ〜♪
0758デフォルトの名無しさん2007/02/24(土) 22:05:02
(´・ω・)
0759デフォルトの名無しさん2007/02/24(土) 23:26:36
質問です。
浮動小数点計算をループでしていてその結果を出力したら、
あるタイミングから#INDというのが出力されました。
これは一体なんでしょうか、、、
0760デフォルトの名無しさん2007/02/24(土) 23:35:56
不定値(正負の無限大 or NaN)
0除算してるんじゃね?
0761デフォルトの名無しさん2007/02/24(土) 23:48:49
>>760
レスありがとうございます。
数値扱いされてないのでしょうか?
具体的なコードはこんなかんじなんですが、、


my $a = -0.1382 ** 0.000212494687632809;
my $temp = -0.1382;
my $b = $temp ** 0.000212494687632809;

これだと$aはちゃんと出力されるんですが、$bは-1.#INDと出力されます。。
0762デフォルトの名無しさん2007/02/25(日) 00:11:04
>>759
indefinite
0763デフォルトの名無しさん2007/02/25(日) 00:27:05
>>761
"**"は"-"より強いので
-0.1382 ** 0.000212494687632809
は
-(0.1382 ** 0.000212494687632809)に等しい。
0764デフォルトの名無しさん2007/02/25(日) 01:53:36
>>761
Math::BigFloat
0765デフォルトの名無しさん2007/02/25(日) 02:10:48
>>762
>>763
>>764
レスありがとうございます。明日にでも試してみたいと思います。
0766デフォルトの名無しさん2007/02/25(日) 12:00:00
(´・ω・)12時
0767デフォルトの名無しさん2007/02/25(日) 19:23:35
(´・ω・)時報スクリプトを作ってみました..

#!/usr/bin/perl
use WWW::Mechanize;
$mech = WWW::Mechanize->new(agent => 'Mozilla/4.0 (MSIE 6.0;)');
while(1){
my(@t) = localtime(time);
unless( $t[1] == 59 && $t[0] > 20){sleep(30);next;}
$mech->get($ARGV[0]);
$mech->field("MESSAGE" => "時報");
$mech->click();
(@t) = localtime(time);
sleep(60-$t[0]);
$mech->click();
}
0768デフォルトの名無しさん2007/02/27(火) 20:41:51
日本語PDF作るモジュールのお薦めってありますか?
PDFJ?
0769デフォルトの名無しさん2007/02/27(火) 22:40:04
PDFJ
0770デフォルトの名無しさん2007/02/28(水) 00:10:35
$input=<STDIN>;
$input=~s/\n//;

print "$input";

コマンドラインから「\n\n」と入力した場合に
「\n\n」と出力されるのではなく、改行2個が出力されるようにしたいんですが
どうすればいいですか?
0771デフォルトの名無しさん2007/02/28(水) 00:17:23
自力でs/\\n/\n/g;とするかevalするか
0772デフォルトの名無しさん2007/02/28(水) 00:24:39
>>771
わかりました。ありがとうございます。
0773デフォルトの名無しさん2007/02/28(水) 00:52:29
>>771,772
evalは安易に使うとコマンド実行も出来ちゃうので正規表現にしとけ。
どうしてもeval使う場合は入力チェックしないと危険よ
07747702007/02/28(水) 01:14:01
>>773
アドバイスありがとうございます。
自分でちょっとしたテキスト処理をやりたいだけなので大丈夫です。
\< や \/ や \. などの入力が入った場合、その都度
s/\\\</\</;
s/\\\./\./;
を書かなければいけないのでevalにします。ありがとうございました。
07757682007/02/28(水) 13:05:37
>769 サンクス。
自由度がありすぎて面倒な部分もあるんだけど、
やっぱPDFJでいってみます。

0776デフォルトの名無しさん2007/02/28(水) 16:35:41
質問です 頓珍漢だった笑ってください

perlはCの #include に相当する機能はあるのでしょうか?

今、Perlで統計解析の処理をしています。解析手法ごとに異なったスクリプト
を作っています。

入出力部分が複雑なんでここの部分と全体で使える共通サブルーチンだけ切り出して
別ソースにして、実行時に組み込んで使いたいのですが、どうも旨くゆきません。

ぐぐったりしてみましたが、Use、Requireの話しか検索できません。何か単純に
Includeする方法は無いのでしょうか?


0777デフォルトの名無しさん2007/02/28(水) 16:48:38
>>776
そう難しくないからモジュールにしてuse使うべきだな。
0778デフォルトの名無しさん2007/02/28(水) 16:48:43
  ァ  ∧_∧ ァ,、
 ,、'` ( ´∀`) ,、'`
  '`  ( ⊃ ⊂)  '`
0779デフォルトの名無しさん2007/02/28(水) 16:49:14
 ははは      
   ∧_∧                もうダメ      
   ( ´∀`)                 ∧_∧          モウ カンベン
.  ( つ ⊂ )     ヒヒヒヒ         (´∀` ,,)、 あははは    シテクダサイ
   .)  ) )  ○   ∧_∧ ,     , へ,, へ⊂),    ∧_∧ ○,
  (__)_)⊂ ´⌒つ´∀` )つ   (_(__)_丿  ⊂(´∀`⊂ ⌒ヽつ
0780デフォルトの名無しさん2007/02/28(水) 16:52:53
requireで問題なくできそうだけど駄目なんかな
0781デフォルトの名無しさん2007/02/28(水) 17:02:56
目線を高くしてオブジェクト指向にしたらどうだ?
0782デフォルトの名無しさん2007/02/28(水) 17:07:13
776はrequireやuseの説明を読んでないのではないのでは?
includeとスペルが違うからって脊髄反射したのか?
そうでないのなら、ますはrequireでは駄目だった点を質問文につけないと回答者は答えようがないぞ
0783デフォルトの名無しさん2007/02/28(水) 17:08:32
すまん
×776はrequireやuseの説明を読んでないのではないのでは?
○776はrequireやuseの説明を読んでないのでは?
0784デフォルトの名無しさん2007/02/28(水) 17:11:40
名前空間の問題とかあるし、普通にモジュール作るのがいいと
思うけどな。よほどこったことやるんじゃなけりゃ、Exporter
使えば一発だし。
0785デフォルトの名無しさん2007/02/28(水) 17:14:16
>>776は最後に1;を入れ忘れてると見た
0786笑われた 7762007/02/28(水) 17:22:05
すみません確かにRequireに関して真面目に読んでいないです

Cの#includeのつもりだったので、

------------ 今まで ------------

初期の宣言など・・・

open(FP, $filename) or die($filename);

while(<FP>) {
$hash{$key} = hoge;
}


------------ 変更 ------------


初期の宣言など・・・

require 'other.pl';

&sub($filename, \%hash);


と変更しただけなんですが・・・・実行時に

0787デフォルトの名無しさん2007/02/28(水) 17:25:10
ワッフルワッフル!!
0788デフォルトの名無しさん2007/02/28(水) 23:16:02
単純に定数の扱いがやっかいかな。perlは。
0789デフォルトの名無しさん2007/03/01(木) 01:53:41
use constant FOO => 'bar';

use Readonly;
Readonly my $HOGE => 'fuga';

こういうのでいいじゃん。
0790デフォルトの名無しさん2007/03/01(木) 08:05:44
PerlでCPANによるモジュールのインストールが失敗します。
install LWP::Simple
....
BEGIN failed--compilation aborted at /System/Library/Perl/Extras/5.8.6/darwin-thread-multi-2level/HTML/TokeParser.pm line 12.
Compilation failed in require at ../blib/lib/HTML/Form.pm line 116.
html/form-param.......dubious
Test returned status 2 (wstat 512, 0x200)
DIED. FAILED tests 1-24
Failed 24/24 tests, 0.00% okay
....

どなたかお助けを。
環境:MacOS X 10.4 Tiger, perl 5.8.6
0791デフォルトの名無しさん2007/03/01(木) 16:35:18
正規表現?に関する質問です。
条件文 $Fm{"data"} !~ /^[0-9]/ の意味は ”0〜9以外の文字を含まない場合”ですが
これを”0〜9と半角カンマ「,」以外の文字を含まない場合”という条件文にしたいです。
どう書けばいいんでしょうか(´・ω・`)??
0792デフォルトの名無しさん2007/03/01(木) 16:55:20
>>791
”0〜9と半角カンマ「,」以外の文字を含まない場合”
→”0〜9と半角カンマ「,」のみを含む場合”
$Fm{"data"} =~ /^[0-9,]*$/ # NULLもマッチ
あるいは $Fm{"data"} =~ /^[0-9,]+$/ # NULLはマッチしない
0793デフォルトの名無しさん2007/03/01(木) 17:01:19
>>792
レスありがとう。なるほど(´・ω・`)
0794 ◆TWARamEjuA NGNG?2BP(6811)
>>790
cpan> install LWP::Simple
LWP::Simple is up to date.

(゚∀゚)アヒャ

MacOS X 10.4.8
$ perl -v
This is perl, v5.8.6 built for darwin-thread-multi-2level
(with 3 registered patches, see perl -V for more detail)
ほいほい・・・
Locally applied patches:
23953 - fix for File::Path::rmtree CAN-2004-0452 security issue
33990 - fix for setuid perl security issues
SPRINTF0 - fixes for sprintf formatting issues - CVE-2005-3962
07957912007/03/02(金) 01:52:03
>>792
すいません、おそらくマッチングはしてるっぽいんですが、その後
$Fm{'data'}の中身の半角カンマが全角カンマに変わってました。
これは何故なんでしょう?
0796デフォルトの名無しさん2007/03/02(金) 02:03:58
そんな莫迦なことがあるか
07977912007/03/02(金) 02:09:50
ちなみに$Fm{'data'}というのはテキストボックス
&input('text','data',"$up",' size=50',"\n");
の入力値です。
07987912007/03/02(金) 02:23:03
あ、 &inputは
sub input {
$label++;
print qq|<LABEL for="$label$_[1]">\n|;
print qq|<INPUT type="$_[0]" name="$_[1]" id="$label$_[1]" value="$_[2]"$_[3]>$_[4]\n|;
print qq|</LABEL>\n|;
}
となっております。
0799デフォルトの名無しさん2007/03/02(金) 07:19:02
「してるっぽい」ってなんだよ。プログラムなんだからしてるかしてないか
どっちかしかないので、きちんと確認してから質問しろ。

問題の切り分けができてなくて的外れな質問を垂れ流している予感。
0800デフォルトの名無しさん2007/03/02(金) 08:40:49
そして質問内容がWeborogの範疇に…
0801デフォルトの名無しさん2007/03/02(金) 09:45:17
どっかで置換してんだろ
0802デフォルトの名無しさん2007/03/02(金) 12:13:48
LWP::UserAgent を使って、https のコンテンツを「Proxy経由」で取得する場合は、
================================================
use LWP::UserAgent;
$ENV{HTTPS_PROXY} = "http://〜proxy〜:〜port〜/";
my $proxy_url = "http://〜proxy〜:〜port〜/";
my $url = "https://〜URL〜";

my $ua = LWP::UserAgent->new();
$ua->proxy(qw( http https ), $proxy_url);
# $ua->proxy(['http', 'https'], $proxy_url); --> これでも同様

my $response = $ua->get($url);
print $response->content;
================================================
で問題が無く取得できるのですが、
URLが"http://〜"の場合には、Proxyサーバから
「サポートされていないリクエスト/プロトコルです」
というエラーが出てしまいます。

「perldoc Crypt::SSLeay」に記載されている
$ua->proxy([qw( https http )], "$proxy_ip:$proxy_port");
では、Proxyサーバから上と同様のエラーが。しかしこの場合、URLが"http://〜"ならOK。

また、http と https を入替えてみると
($ua->proxy(qw( https http ), $proxy_url);)
今度は http がOKで https がエラー。

"http" "https" のどちらかしか認識してくれてないようなのですが、
どうすれば http, https とも取得できるようになりますでしょうか?
08038022007/03/02(金) 12:15:02
ちなみに環境は以下です。
OS
Red Hat Enterprise Linux ES4
Squidバージョン
2.4.STABLE7
perlバージョン
5.8.5
その他モジュール
Crypt-SSLeay-0.53 , openssl-0.9.7a-43.10
0804デフォルトの名無しさん2007/03/02(金) 13:29:18
squidはhttpsをproxyするときにCONNECTメソッドを使うやり方を期待している
ので、LWP::UserAgentのproxyの仕組みではだめでCrypt::SSLeayの方のを
使う必要がある。したがって、$ua->proxyでhttpsのproxyを設定せずに、
環境変数HTTPS_PROXYを設定するのが正解。また、HTTPS_PROXYの設定は
末尾に'/'があるとエラーになる。

たぶん以下の2行を修正すれば動くと思う。(俺の手元では動いた)

$ENV{HTTPS_PROXY} = "http://〜proxy〜:〜port〜"; # 末尾の/をとる

$ua->proxy(qw( http ), $proxy_url); # httpsは指定しない
08058022007/03/02(金) 16:10:21
> 804
バッチリいけました。ありがとう!
0806デフォルトの名無しさん2007/03/02(金) 21:38:01
PATH_INFOをHTMLに出力する場合、以下のエスケープ方法で大丈夫でしょうか。
$path = $ENV{'PATH_INFO'};
$path =~ tr/+/ /;
$path =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$print_path = $path;
$print_path =~ s/&/&/g;
$print_path =~ s/>/>/g;
$print_path =~ s/</</g;
$print_path =~ s/"/"/g;
$print_path =~ s/'/'/g;
print $print_path;
0807デフォルトの名無しさん2007/03/02(金) 22:08:28
>>806 ダメな上に板違い。
08088062007/03/02(金) 22:26:19
orz
失礼しました。向こうに移動します。
0809デフォルトの名無しさん2007/03/02(金) 22:53:42
「$textにいくつかの文字列候補、例えばApp,Bbq,Ntk,Sunが2個以上含まれる時」
っていう条件はどう書けばいいの?
1つだと $text =~ /(App|Bbq|Ntk|Sun)/だけど・・・
0810デフォルトの名無しさん2007/03/02(金) 23:20:13
>>809 これでどうかな?
$text =~/(?:.*?(?!\1)(UnKO|CHiNKO|MaNKO)){2}/

性器表現の質問なら、専スレのがレベル高い回答を得られるかも。
0811デフォルトの名無しさん2007/03/02(金) 23:23:34
(scalar @{[$text =~ /App|Bbq|Ntk|Sun/g]} >= 2)
0812デフォルトの名無しさん2007/03/02(金) 23:32:18
あ、重複があってもいいのか。なら
/(?:.*?(UNKO|CHINKO|MANKO)){2}/
で十分。
0813デフォルトの名無しさん2007/03/02(金) 23:47:55
括弧に量指定子を使うのって何か気持ち悪い
0814デフォルトの名無しさん2007/03/03(土) 00:55:36
つ ?:
0815デフォルトの名無しさん2007/03/03(土) 12:26:36
>>809
my @str = qw( FooAppBarBbqBaz NtkQuuxSun Foo App BarBbqBaz);
for (@str) {
  print 1 if @{[ /App|Bbq|Ntk|Sun/g ]} >= 2; # >>811
  print 2 if s/(App|Bbq|Ntk|Sun)/$1/g >= 2;
  print 3 if @{[ split /App|Bbq|Ntk|Sun/, $_, 3 ]} >= 3;
  print 4 if /App|Bbq|Ntk|Sun/g && //g;
  print '/';
}
0816デフォルトの名無しさん2007/03/04(日) 01:01:58
WWW::Mechanizeのインストールをしたいのですが、
make test で以下のように失敗してしまいます。
何か原因はわかりますでしょうか? (OS:fedora core 5 / perl:v5.8.8)
-----------------------------------
# Failed test '404 check'
# at t/local/back.t line 149.
# got: '500'
# expected: '404'
t/local/back............ok 29/38# Looks like you failed 1 test of 38.
t/local/back............dubious
  Test returned status 1 (wstat 256, 0x100)
DIED. FAILED test 28
  Failed 1/38 tests, 97.37% okay (less 2 skipped tests: 35 okay, 92.11%)
-----------------------------------
08178162007/03/04(日) 01:05:47
もともと開発環境が無かったので、yumでgcc make bison flex gcc-c++ gnupg をインストールしました。
他に足りないものがあったりしますか?
0818デフォルトの名無しさん2007/03/04(日) 01:07:36
足りないものは、エラーログを探して見てみようとする知恵。
08198162007/03/04(日) 01:29:41
http://72.14.235.104/search?q=cache:LZPhgIR7ry0J:wiki.bestpractical.com/index.cgi%3FOpenSuSE101InstallGuide+mechanize+Failed+test+t/local/back&hl=ja&ct=clnk&cd=1&gl=jp&client=firefox
> 10. Ok I give up
> cpan> force install WWW::Mechanize
ひぇぇ〜
0820デフォルトの名無しさん2007/03/04(日) 03:55:51
for $i (0..100){
  $n = ($i)?1:0;
  ...
}

このコードの、1以上を全て1とする処理部分を
if文を無くして$n=bool($i)の様な感じでシンプルに
書く方法はあるでしょうか?
0821デフォルトの名無しさん2007/03/04(日) 04:29:07
$n = 0;
for $i (0..100) {
 ・・・
 $n = 1;
}
08228202007/03/04(日) 05:18:01
>>821
ありがとうございます。
すみません、例が悪かったですね。。出直してきます λ...
0823デフォルトの名無しさん2007/03/04(日) 05:49:33
“シンプル”にという意味では関数以外ないはず
0824デフォルトの名無しさん2007/03/04(日) 10:17:41
まだ誰も指摘していないが「ゲーム脳」(これはガセらしいが)と同じような
障害で、「検索脳」というものが存在するようだ。>>819を見て確信した。

「ヒト」として機能していない。
0825デフォルトの名無しさん2007/03/04(日) 12:35:17
>>820
$n=!!$i; でいいんじゃね?
0826デフォルトの名無しさん2007/03/04(日) 18:53:02
それだと偽の場合に 0 じゃなくて空文字列になるような。
0827デフォルトの名無しさん2007/03/04(日) 19:14:04
$n=int!!$i;
08288202007/03/05(月) 00:57:42
>>823 >>825-826
int!! でうまく置き換えできました。ありがとうございました。
0829デフォルトの名無しさん2007/03/05(月) 01:36:38
結局?0:1の方が短い件について
0830デフォルトの名無しさん2007/03/05(月) 01:51:05
それは言っちゃダメ
0831デフォルトの名無しさん2007/03/05(月) 03:29:48
条件分岐が無くなって算術演算だけになってるのがミソじゃまいか?
0832デフォルトの名無しさん2007/03/05(月) 03:30:47
reach!!
0833デフォルトの名無しさん2007/03/05(月) 03:52:55
内部では条件分岐起きまくりだろ・・・。常識的に考えて・・・。
三項演算子の方が間違いなく低コスト。
0834デフォルトの名無しさん2007/03/05(月) 07:40:09
int!!ってrubyかなんかかよ…気持ちわるい
0835デフォルトの名無しさん2007/03/05(月) 07:46:54
PerlがRubyに気持ち悪いとな?
0836デフォルトの名無しさん2007/03/05(月) 08:00:16
目糞鼻糞
0837デフォルトの名無しさん2007/03/05(月) 10:24:26
それはないだろ・・・常識的に考えて・・・。
0838デフォルトの名無しさん2007/03/05(月) 10:43:00
>>833
論よりベンチ。

use Benchmark;

timethese(undef, {
820 => sub {
for my $i (0..100) {
my $n = $i? 1: 0;
}
},
821 => sub {
my $n = 0;
for my $i (0..100) {
$n = 1;
}
},
827 => sub {
for my $i (0..100) {
my $n = int !! $i;
}
},
});

Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.07 usr + 0.01 sys = 3.08 CPU) @ 30756.17/s (n=94729)
821: 3 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 48809.49/s (n=154238)
827: 3 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 28888.54/s (n=90710)
0839デフォルトの名無しさん2007/03/05(月) 10:51:31
意外と差が無いな。
0840デフォルトの名無しさん2007/03/05(月) 11:05:07
820だけ$nがループの外でmyされてるので影響あるんじゃないか
という疑問があったのでとりなおしてみた。やっぱり影響あった
らしく820,827はやや速くなったまでは予想通りだが、820と827が
逆転したのはかなり不思議だ。誰か理由説明できる?

use Benchmark;

timethese(undef, {
820 => sub {
my $n;
for my $i (0..100) {
$n = $i? 1: 0;
}
},
821 => sub {
my $n = 0;
for my $i (0..100) {
$n = 1;
}
},
827 => sub {
my $n;
for my $i (0..100) {
$n = int !! $i;
}
},
});

Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 2 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 36769.75/s (n=115457)
821: 3 wallclock secs ( 3.05 usr + 0.00 sys = 3.05 CPU) @ 48989.51/s (n=149418)
827: 3 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 42848.40/s (n=133687)
0841デフォルトの名無しさん2007/03/05(月) 11:16:20
int!!のが速いな・・・。マジかよ・・・、信じられない。
俺のPCでも >>840 でやってみた。

Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 4 wallclock secs ( 3.10 usr + 0.04 sys = 3.14 CPU) @ 2998.73/s (n=9428)
821: 3 wallclock secs ( 3.03 usr + 0.00 sys = 3.03 CPU) @ 4186.78/s (n=12665)
827: 4 wallclock secs ( 3.06 usr + 0.00 sys = 3.06 CPU) @ 3838.45/s (n=11761)

なるほど。俺のPCの性能は>>840 のPCの1/10もないのか。
0842デフォルトの名無しさん2007/03/05(月) 11:23:02
ここにまた新しいトリビアが生まれた
0843デフォルトの名無しさん2007/03/05(月) 11:28:32
トリビア : >>840有するPC性能の1/10にも満たないPCを>>841は使っている。
0844デフォルトの名無しさん2007/03/05(月) 11:29:01
どうでもいいな。
0845デフォルトの名無しさん2007/03/05(月) 11:33:04
/usr/bin/perl -v
This is perl, v5.8.5 built for x86_64-linux-thread-multi
Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.09 usr + 0.00 sys = 3.09 CPU) @ 51378.64/s (n=158760)
821: 3 wallclock secs ( 3.03 usr + 0.00 sys = 3.03 CPU) @ 62582.84/s (n=189626)
827: 4 wallclock secs ( 3.11 usr + 0.00 sys = 3.11 CPU) @ 55434.73/s (n=172402)

/usr/local/bin/perl -v
This is perl, version 5.005_03 built for i686-linux
Benchmark: running 820, 821, 827, each for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 43505.98/s (n=130953)
821: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 51370.00/s (n=154110)
827: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 30147.18/s (n=90743)

同一マシンで実行
int!!が2倍近く違う。
0846デフォルトの名無しさん2007/03/05(月) 11:40:54
シングルコアと、マルチコア。 条件分岐の影響が出てるということ?
0847デフォルトの名無しさん2007/03/05(月) 11:44:10
ここはソース解析するしかないな。な?↓
0848デフォルトの名無しさん2007/03/05(月) 11:53:29
それをCで書いて、そのコンパイル結果で比較するとかは無意味?
0849デフォルトの名無しさん2007/03/05(月) 11:54:41
毎回ベンチだと盛り上がるなw
08508452007/03/05(月) 11:59:10
XEON(32bit)で実行
/usr/local/bin/perlは845と同じもの

/usr/bin/perl -v
This is perl, v5.8.0 built for i386-linux-thread-multi
Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.07 usr + 0.00 sys = 3.07 CPU) @ 37608.14/s (n=115457)
821: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 45086.26/s (n=141120)
827: 4 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 41884.98/s (n=131100)

/usr/local/bin/perl -v
This is perl, version 5.005_03 built for i686-linux
Benchmark: running 820, 821, 827, each for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 44429.57/s (n=133733)
821: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 53565.33/s (n=160696)
827: 3 wallclock secs ( 3.01 usr + 0.02 sys = 3.03 CPU) @ 28967.00/s (n=87770)

5.0が遅いのか、i686が遅いのか、多分前者だろう。
0851デフォルトの名無しさん2007/03/05(月) 12:31:38
>>844
どうでもよくなかったらトリビアじゃないだろアホw
0852デフォルトの名無しさん2007/03/05(月) 13:33:05
数十倍も変わるならあれだがね
n<2倍なんて誤差の範囲だろ…馬鹿馬鹿しい
0853デフォルトの名無しさん2007/03/05(月) 15:31:15
測定してみなきゃわからない。
0854デフォルトの名無しさん2007/03/05(月) 15:47:48
実際にやってみた。
Benchmark: running 820, 821, 827, each for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 363.00/s (n=1089)
821: 4 wallclock secs ( 3.27 usr + 0.00 sys = 3.27 CPU) @ 395.64/s (n=1292)
827: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 249.67/s (n=749)
0855デフォルトの名無しさん2007/03/05(月) 16:17:10
Perl で、XMLファイルのパース可否(well-formed)をチェックするツールを作りたいのですが、
環境条件があって関連モジュール(XML::Simple、XML::Parser)を使用できません。
データの抽出とかは不要で、$!={0|1} だけがわかればいいのですが、
正規表現だけで作る方法がありましたら、教えてください。
0856デフォルトの名無しさん2007/03/05(月) 16:45:20
EBNFから正規表現を起こせばいいんじゃない?

http://www.w3.org/TR/xml11/
0857デフォルトの名無しさん2007/03/05(月) 17:05:42
俺の公言身長は、実測値の1.2倍。もちろん誤差の範囲だよな?
0858デフォルトの名無しさん2007/03/05(月) 17:06:26
>>856
ちょ、EBNFと正規表現じゃ受理できる言語のクラスが違いますがな。

もっとも何とかする方法はなくもない。

(1) ネストの段数を適当に有限に制限してがんばって展開する
(2) perl拡張の(??{ code })を使う
0859デフォルトの名無しさん2007/03/05(月) 17:08:52
ああ、再帰を使うのは当然だと思ったから書き忘れた
0860デフォルトの名無しさん2007/03/05(月) 17:30:43
モジュールがインストールされていなくても、
pmファイルをどっかから持ってきて一緒に置いとけば使えたりしないの?
ちゃんとインストールコマンド使って、CPANから入れなきゃダメ?
0861デフォルトの名無しさん2007/03/05(月) 17:35:35
ぐぐれ
0862デフォルトの名無しさん2007/03/06(火) 20:53:21
>>860
PurePerlモジュールならそれでいい。
つーか「モジュールを取ってきて適切なディレクトリにコピーする」という作業をインストールという。
0863デフォルトの名無しさん2007/03/06(火) 22:25:17
XML::TinyならPPだから使えると思う。
0864デフォルトの名無しさん2007/03/09(金) 10:24:45
単純な質問ですみまそん。
windowsのactive perl を使っているのですが、
ファイルの行数を数えるのは↓が最速でしょうか?もっといい方法はありますか?

open(FILE, "< filename");
$i++ while <FILE>;
close(FILE);
0865デフォルトの名無しさん2007/03/09(金) 10:49:35
ファイルが巨大なら `wc -l filename` とかした方が速いかもよ?
0866デフォルトの名無しさん2007/03/09(金) 10:56:54
wcってのはじめて見ました。ありがとん。

max1000行程度なんですが、ちと調べてみます。
0867デフォルトの名無しさん2007/03/09(金) 11:07:11
sysreadで丸呑みしてtrでカウントするのが早いかな。
1000行ほどじゃwc遅いけどもっとでかくなるとwcが爆速で笑える
0868デフォルトの名無しさん2007/03/09(金) 11:11:22
1000行ぐらいならどうやっても大差ないんじゃないかな。
それを10000回やるなら別だけどさ。
08698662007/03/09(金) 11:16:11
なるほど、いろいろあるんですね。sysreadもためしてみます。

>>868
ファイルはせいぜい10こ前後です。結局最初の方法でいいのかな・・

   `≡ 人
   ≡(_)
  `≡ (__)
  ≡( ・∀・)     ありがとですたー!
 ≡⊂⌒ ⊃⊃
 ≡ ̄◎ ̄◎  
0870デフォルトの名無しさん2007/03/09(金) 16:54:45
>>865 wcは質問者の環境であるWindowsでは駄目だろ。
0871デフォルトの名無しさん2007/03/10(土) 00:17:38
>>864
open(FILE, "filename");
while(<FILE>){};
print "$.\n";
close(FILE);
08728662007/03/10(土) 07:38:15
>>870
そうですね^^;

>>871
なるほど、毎回カウントアップするよりこちらの方がいいかもしれませんね。
ありがトンございます(・∀・)
0873デフォルトの名無しさん2007/03/10(土) 07:47:10
perl -n 'if (eof) { print "$. $ARGV\n"; $. = 0; }'
0874質問2007/03/10(土) 13:11:58
netstat -sで出力される
Received Packets Delivered = 6558
Output Requests = 5420
を%dataにキーをReceived Packets Delivered、値を6558、
キーをOutput Requests、値を5420として格納したいのですが、下記のプログラムでは
どうしてもoutput requestsのほうだけが%dataに格納されてReceived〜のほうが
格納されません。どうしてでしょうか?
foreachを2回行えばいいとは思うのですが、もし読み込む行数が何万行になると
かなり負荷になるのでできればforeachを1回でうまく取り込める方法が知りたいのですが・・

#!C:\Perl\bin\

@naiyou=`netstat -s`;

foreach (@naiyou){
last if($_=~/Routing Discards/);
chomp;
if($_=~/(Received Packets Delivered)(\s+)=(\s)(\d+)/){
%data=("Received Packets Delivered"=>$4)
}
if($_=~/(Output Requests)(\s+)=(\s)(\d+)/){
%data=("Output Requests"=>$4)
}
}

@key=keys %data;
print"@key\n";
@val=values %data;
print"@val\n";
0875デフォルトの名無しさん2007/03/10(土) 13:15:42
>>874
%data上書きしてるやんか

$data{"key"} = val;
08768742007/03/10(土) 13:23:56
キーがちがうから上書きにはならないと思っていましたが・・
0877デフォルトの名無しさん2007/03/10(土) 13:29:08
>>876
ハッシュの使い方が根本的に間違っている。

パンツを頭にかぶるくらい間違っている。
0878デフォルトの名無しさん2007/03/10(土) 13:35:44
>>876
基礎からやり直せ
0879デフォルトの名無しさん2007/03/10(土) 13:41:39
どうでもいいけど、 netstat -s が
何万行になる可能性ってあるの?
08808742007/03/10(土) 14:08:39
いま$data{"key"} = val; にかえてみましたら、きちんと格納されていました。
配列なら本に書いていましたが、ハッシュも上書きになるとは思いませんでした。
ありがとうございました。
0881デフォルトの名無しさん2007/03/10(土) 18:38:34
マージを意図して書くならこう
%data = (%data, "foo" => "val");
0882デフォルトの名無しさん2007/03/10(土) 19:18:30
perlのオプティマイザはそれをなんとかできるほど賢くはなかった気がする。毎回ハッシュのつくり直しになりそう。
08838812007/03/10(土) 19:57:05
言葉足らずだった。
実際こんなコーディングはしないけど、
874がどう間違えたのかの理解の助けになるかと思ってね。
0884デフォルトの名無しさん2007/03/11(日) 01:00:05
1回の実行で、その際使用された関数名を一覧することはできるでしょうか?
0885デフォルトの名無しさん2007/03/11(日) 01:39:32
日本語でおk
0886デフォルトの名無しさん2007/03/11(日) 02:32:07
っ Devel::Profile
0887デフォルトの名無しさん2007/03/11(日) 06:15:50
rubyのMailParserのようなモジュールってないですか?
MIME::Parserはちょっとちがうかなと思っています。
0888デフォルトの名無しさん2007/03/11(日) 12:31:03
>>887
まずはrubyのMailParserの仕様を説明しる
あるいはMIME::Parserの何が違うのか説明
0889デフォルトの名無しさん2007/03/11(日) 14:06:05
分からないのなら
無理に答えなくてもいいのに
0890デフォルトの名無しさん2007/03/11(日) 15:58:07
>>889
そこは素直に「実はRubyなんて知らずに質問しました、すみません」って
言っておけばいいところだと思うよ。
0891デフォルトの名無しさん2007/03/11(日) 16:18:20
?
私は質問者じゃありませんけど
「分からないなら無理に答えるな」
これ、どこかおかしいですか?
0892デフォルトの名無しさん2007/03/11(日) 16:21:59
あーあ、怒っちゃたよ
0893デフォルトの名無しさん2007/03/11(日) 16:22:47
いいんじゃない、答えなくてもいいって言ってるんだから、
>>889 みたいな失礼な奴はスルーで。
0894デフォルトの名無しさん2007/03/11(日) 16:27:45
はじめまして。何をやってもわからないので質問させてください。

print "<a href=\"$ENV{'SCRIPT_NAME'}?page=$id\" target=\"_blank\">スレタイ</a>"

みたいな感じでスレタイをクリックするとそのスレッドの内容の別ページが
開くようにしたいのですが、$ENV{'SCRIPT_NAME'}?page=1 になってるところを
クリックされた場合は$ENV{'QUERY_STRING'}にpage=1として返ってくると思うのですが、
それを分解して$form{'page'}=1 となるようにして、条件で

if($form{'page'}){ printPage() ; }

としてもひっかかってくれません。。なぜかわからないでしょうか・・
0895デフォルトの名無しさん2007/03/11(日) 16:31:03
反論出来ないのなら、私の勝ちですね。
簡単に論破出来ました。
頭の悪い人間の相手は簡単ですね。
0896デフォルトの名無しさん2007/03/11(日) 16:31:12
板違い
0897デフォルトの名無しさん2007/03/11(日) 16:35:01
>>894
板違い。WebProg板。
後、$ENV{"QUERY_STRING"}を
分解する部分のコードが怪しそうなのでそちらも添えて。
0898デフォルトの名無しさん2007/03/11(日) 16:53:16
>>896,897
失礼しました。。
WebProg板で質問してみます!
0899デフォルトの名無しさん2007/03/11(日) 20:24:44
Ruby のほうがモジュールもコミュニティも質が良いということですね。
VM 性能も、もうすく Ruby には YARV が搭載されちゃうからもう勝ってる
ところがなくなりますね。Perl6 がはやくできるといいですね。
0900デフォルトの名無しさん2007/03/11(日) 21:34:33
そうですね。
どうぞその優れているRubyとやらを使っていてください。
そしてこのスレにはもう来ないでください。
0901デフォルトの名無しさん2007/03/11(日) 21:46:17
そうそう、自分の劣等感を刺激するまともな人間は追い出すに限る。

>>899
今も昔もPerlスレは僕たち無能の馴れ合いスレです。まともな人は来ないでください!><
0902デフォルトの名無しさん2007/03/11(日) 23:30:12
あるパッケージが use もしくは require されているかを知る方法はありますか?
0903デフォルトの名無しさん2007/03/12(月) 00:29:48
>902
%INCを見たら幸せになれそう。
0904デフォルトの名無しさん2007/03/12(月) 00:31:41
CPANPLUSってどんなところが優れてるんですか。
0905デフォルトの名無しさん2007/03/12(月) 00:33:46
>>902
%INC

厳密に言うとわかるのはuseまたはrequireされたファイルだけどな。
0906デフォルトの名無しさん2007/03/12(月) 11:35:26
すみません、ワイルドカードが入った文字列を
評価するモジュール等はありますでしょうか?
諸事情で正規表現は使えません。
検索の仕方が悪いのか、ありませんでした。
宜しくお願いします。
0907デフォルトの名無しさん2007/03/12(月) 12:19:26
「ワイルドカードが入った文字列を評価する」じゃ何のことやらわからんよ。
もうすこしちゃんと説明したほうがいい。

お望みのものかどうかはわからんがとりあえず File::FnMatch をあげておこう。
0908デフォルトの名無しさん2007/03/12(月) 14:06:30
>>906
正規表現ではなくてワイルドカード? あのファイルのパターンマッチのやつ?
* を .* に変換して正規表現としてマッチさせればいいんじゃない?
あるいは、ファイル名検索したいだけなら glob() を使う。
0909デフォルトの名無しさん2007/03/12(月) 14:36:26
>>906
シェルのワイルドカードのことか? あれはGlobって言うんだぞ。

とりあえずText::Globってのがあるな。
0910デフォルトの名無しさん2007/03/12(月) 20:10:29
今、ソートの勉強しているのですが、

htmlのテキストボックス から数字を配列に入れてソートして1行1つの数値を出そうとしているのですが、
require cgi-lib.pl;

for($i = 1; $i <= 5; $i++)
{
$number[$i] = $in{"form$i"};
}

@number = sort {$a <=> $b} @number;

for($i = 1; $i <= 5; $i++)
{
$TEMP .= print "$number[$i]\n";
}

print $TEMP;

で、
1
2
3
4
5

とでてほしいのですが、

11111
に、なってしまいます。どこがおかしいか検討もつきません。
0911デフォルトの名無しさん2007/03/12(月) 20:17:14
$TEMP .= sprintf("%s\n", $number[$i]);
09129102007/03/12(月) 20:34:40
>>911
ありがとうございます。
なぜか、$tempに蓄積されませんでしたが、
なんとか思い通りにできました。
0913 ◆TWARamEjuA 2007/03/12(月) 21:04:06
(´-`).。oO(なんで11111になったのか理解したんだろうか。。。)
0914デフォルトの名無しさん2007/03/12(月) 22:11:19
つーか、そのprint文の出力はどこにいったのかと(r
09159062007/03/13(火) 14:20:37
>>907
説明が分かりにくかったのなら申し訳ありませんが、
そのままです。ワイルドカードを含めた文字列を文字列Aとして、
文字列Bと比較しマッチするかどうかを求めるだけです。

>>908 >>909
正規表現は使わないと言ったはずです。
globは知っていますが、今回はファイル名を
抽出する事が目的ではありません。
Text::Globも内部的に正規表現を使っているのでお断りします。
0916デフォルトの名無しさん2007/03/13(火) 14:36:32
ツン・・・
0917デフォルトの名無しさん2007/03/13(火) 14:54:48
>>915
だったらまさしくfnmatchをしたいわけだから、File::FnMatchでいいんでない?
あれはCライブラリのfnmatchを呼ぶモジュールだから正規表現使ってないよ。
09189062007/03/13(火) 14:59:43
すみません、書き忘れていました。
PurePerlなモジュールでお願いします。
0919デフォルトの名無しさん2007/03/13(火) 15:22:00
じゃあもう無理でいいよ
0920デフォルトの名無しさん2007/03/13(火) 15:22:53
正規表現使えばいいところを、わざわざ使わないで作られた公開モジュールなんてあるのかな?
自作するんならともかく。
0921デフォルトの名無しさん2007/03/13(火) 15:25:31
んなもんある訳なかろう。
釣りとしか思えん。
0922デフォルトの名無しさん2007/03/13(火) 16:14:29
>>918
出来合いのモジュールはまずないから、そこらからfnmatch.c拾ってきて
perlで書き直すぐらいしかないと思われる。
0923デフォルトの名無しさん2007/03/13(火) 17:51:27
正規表現を禁じられるとsplitするのも一苦労だな
sub stupid_split($$) {
my($sep, $src) = @_;
my $seplen = length $sep;
my @splited;

my $cur = 0;
while ((my $next = index($src, $sep, $cur)) != -1) {
push @splited, substr($src, $cur, $next - $cur);
}
continue { $cur = $next + $seplen }
push @splited, substr($src, $cur);
return @splited;
}
0924デフォルトの名無しさん2007/03/13(火) 18:38:02
釣りじゃないなら、なぜ正規表現を(モジュールの内部的にも)使っては
ならないのか、理由を言ったほうがいいね。多分、その理由を回避することの
ほうが楽だと思うが。
0925デフォルトの名無しさん2007/03/13(火) 18:46:47
何だこれw >>906
課題とか上司にそういうのを作れって言われたのか?
0926デフォルトの名無しさん2007/03/13(火) 18:58:36
perlから正規表現なくしたら何にも残らんわな
0927デフォルトの名無しさん2007/03/13(火) 19:00:08
どうせ宿題だろ。

>>918とか、ソース流用したいのミエミエ
0928デフォルトの名無しさん2007/03/13(火) 19:27:53
コアに用意されている機能をわざわざ使用しない意味がわからんな。
宿題を手っ取り早く片付けるのが目的なのであればスレ違いだ、去れ。
0929デフォルトの名無しさん2007/03/13(火) 20:10:40
しかし、「宿題」とすれば結構いいテーマだね。
そんなモジュール、絶対に無いはずだから、本人の掛け値なしの実力が試される。
09309062007/03/13(火) 20:11:22
宿題じゃないよ。
理由は(?{〜〜})でコードを実行されたくない、
正規表現のコンパイルエラーで止まる、等。
回避術はいくらでもあるけど、
どれも美しくないので使いたくない。

というか、善良な質問者に対してその態度は何なの?
分からないのなら、無理に答えなくても良いんですよ?
0931デフォルトの名無しさん2007/03/13(火) 20:15:33
>善良

ここが笑うポイントですか
0932デフォルトの名無しさん2007/03/13(火) 20:17:30
以降>>906はスルーで
0933デフォルトの名無しさん2007/03/13(火) 20:18:09
>>931
放置するポイント
09349062007/03/13(火) 20:22:45
いや、モジュールが存在しないのなら諦めますよ。
幸い時間だけはいくらでもあるので、
自分でガリガリとルーチンを書くのは可能なのですが…
なるべく車輪の再発明はしたくなかったので
このスレで質問させて貰った訳で、、、
0935デフォルトの名無しさん2007/03/13(火) 20:30:41
阿呆は放っておけよ
0936デフォルトの名無しさん2007/03/13(火) 20:38:36
任意のコードは実行できんがな
0937デフォルトの名無しさん2007/03/13(火) 20:39:29
馬鹿の言うことはレベルがちがうな
0938デフォルトの名無しさん2007/03/13(火) 20:55:48
任意のコードが実行できるような脆弱性やエラーで止まる事なんて、当然モジュールなら対策済みだろうに
それを使わずに「車輪の再発明はしたくない」とな?
0939 ◆TWARamEjuA NGNG?2BP(6811)
(´-`).。oO(トリップ付けて欲しいよなぁ)
0940906NGNG?2BP(3000)
トリップは付けないけど
クソコテなら名乗ったことがあるよ。
0941デフォルトの名無しさん2007/03/13(火) 21:12:49
>>930
正規表現でコードの実行なんて出来たっけ?
0942デフォルトの名無しさん2007/03/13(火) 21:27:22
>>941
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html#a_bit_of_magic__executing_perl_code_in_a_regular_expression
http://www.kt.rim.or.jp/~kbk/perl-5.8/re.html
09439412007/03/13(火) 21:41:37
>>942
どもっス。
perlre読みなおしてきますた。
これってpatternのほうを変数にしてもランタイムエラーになって実行はされないっすよね?
0944デフォルトの名無しさん2007/03/13(火) 21:42:20
汚染された質問は実行しない方がよいようですな( ̄ー ̄)ニヤリッ
0945デフォルトの名無しさん2007/03/13(火) 22:15:43
みんなお触り好きだよねえ
0946デフォルトの名無しさん2007/03/13(火) 23:28:39
>>915
>Text::Globも内部的に正規表現を使っているのでお断りします。

>>930
>理由は(?{〜〜})でコードを実行されたくない、
>正規表現のコンパイルエラーで止まる、等。

なんかおかしいよな。
Text::Globがコードを実行させる正規表現なんか使うのか?
Text::Globがコンパイルエラーを起す正規表現なんか使うのか?
0947デフォルトの名無しさん2007/03/14(水) 00:20:27
どうみても釣り
09489062007/03/14(水) 10:25:23
正規表現は使わないと、最初の条件に書いたはずですが。
正規表現使ったら1分で書けますよ、そんなもの。
0949デフォルトの名無しさん2007/03/14(水) 10:51:54
まだいたのか。

とりあえず、その1分で書ける正規表現の例を見せてよ。
それを見れば、具体的になにをしたいのか皆にわかるから。
09509062007/03/14(水) 10:55:56
具体的に言うと、.htaccessってありますよね。
あれと同じで、ホスト名やらにワイルドカードを使い、評価したい訳です。
1分で書けるってのは、 * を .* に変えるやつです。
KENTがこの手法を使ってた覚えがあります。
0951デフォルトの名無しさん2007/03/14(水) 11:01:29
いや普通は*→.*にして他の記号はメタキャラクタとして解釈されないように
quotemeta相当のエスケープするように書くから正規表現使っても全く問題
ないわけですが... KENTとか引き合いに出すあたりどうみても釣りだし
しょうがないか。
0952デフォルトの名無しさん2007/03/14(水) 11:27:27
>>906
おめぇコテハン「正規表現は使わない」にしてこいよ。
そしたらちょっとは相手してやるよ。
0953デフォルトの名無しさん2007/03/14(水) 12:17:04
>>950
つーか、正規表現使わない理由がおかしいし。宿題厨はカエレ。
0954デフォルトの名無しさん2007/03/14(水) 12:33:18
正規表現を使わない理由=モジュールを使わない理由 になっていないわけだが。

> 理由は(?{〜〜})でコードを実行されたくない、
> 正規表現のコンパイルエラーで止まる、等。

これらは、モジュールを使えば解決する事。
希望通り、任意のコードが実行されるような脆弱性もなくて、エラーでもとまらなければ
実装に正規表現が使われていようがいまいが関係ないじゃん。
車輪の再発明を避けようとして、車輪を使うのをためらってどうする。
0955デフォルトの名無しさん2007/03/14(水) 12:44:07
> * を .* に変える

え?、変換後もワイルドカード文字が残ってるの?
0956デフォルトの名無しさん2007/03/14(水) 12:47:41
* -> .* じゃなくて
* -> [^/]* かな。
0957デフォルトの名無しさん2007/03/14(水) 12:55:48
カレーにヌルーしようぜ
09589062007/03/14(水) 14:52:02
>>953
宿題?学校も行ってないのに、
誰が宿題出すんですか?逆に聞きたいよw

>>951 >>954
正規表現は使わないって
何回言えば理解出来るの?メクラですか?
0959デフォルトの名無しさん2007/03/14(水) 15:31:48
906 を NGName 指定で万事解決
09609062007/03/14(水) 15:48:10
もう正規表現なんて使わないなんて、言わないよぜったいぃー
09619062007/03/14(水) 16:00:23
俺が正規表現使うと日本が滅びるんだよ。
つまり俺は日本のために必死に頑張っているのであり
お前等の運命は俺に委ねられているんだよ。

わかったらとっとと俺を導け。
0962デフォルトの名無しさん2007/03/14(水) 16:03:28
>>961
正規表現が難しくて分からない って正直に言っちゃえよ。
0963デフォルトの名無しさん2007/03/14(水) 16:24:59
日本の運命は>>961に任せて俺は散歩行ってくる
09649062007/03/14(水) 16:25:49
2ちゃんねるが無能の塊だということはよく分かりましたよ。
こんなところで訊いた私が莫迦でした。

二度と来ません。
0965デフォルトの名無しさん2007/03/14(水) 16:44:39
今日、2chで一番気分の良くなる書き込みを見たな(´ー`)y━~
0966デフォルトの名無しさん2007/03/14(水) 16:58:38
この後、散歩途中の>>962が、
コンビニで立ち読みしてる906を目撃しようとは
>>962本人も今はまだ気付いていなかったのである。
0967デフォルトの名無しさん2007/03/14(水) 17:01:21
流れを無視して書いてみたけど動かねえ
'*' の処理は再帰でいいよね?
0968デフォルトの名無しさん2007/03/14(水) 17:13:52
perl で質問です

TreePPというライブラリを使ってます。
連想配列 $tree というのがあってこれにXMLを展開したものを入れてあります。

<top>
<elem>1</elem>
<elem>2</elem>
</top>

こんな感じで
$value = $tree->{top}-{elem}[0];
とアクセスしますよね

elemの個数は不確定です。
1個の時に添え字を使うとperlがエラー起こします。

何個あるかどうかを調べるにはどうしたらいいのですか?
0969デフォルトの名無しさん2007/03/14(水) 17:22:50
想像だが常識的に考えると
scalar $tree->{top}->{elem};
あたりじゃないか?
0970デフォルトの名無しさん2007/03/14(水) 17:34:59
やってみたら HASH(0x1ad51b4) ってのが帰ってきます
0971デフォルトの名無しさん2007/03/14(水) 17:36:59
>>906
Perlで正規表現が使えないのは特殊なケースだと思いますので,
お探しのようなモジュールは絶対とは言い切れませんが,おそらくないと思います。

私は作れませんが,とても興味がありますので,
作られたら是非見せてください。
0972デフォルトの名無しさん2007/03/14(水) 17:37:30
Socket使ってWebページからソース取得したんだけどprintで出力すると
ヒ、ョ、・/b>
こんな感じに化けちゃっててシフトJISにまともにエンコできない
どうやって対処すればいいんだい?
0973デフォルトの名無しさん2007/03/14(水) 17:42:32
>>972
主にsjis以外で使われる文字コードはUTF8の場合が多い
jcode.pl pmはたぶんこのコード変換が出来ない

取得するページが固定ならperlソースのコードをUTF8に合わせてそのまま出力するのが一番簡単
どうしてもsjisに統一したければutf8用のライブラリがあるよ
09749672007/03/14(水) 17:46:38
# 誰か添削plz
sub simple_fnmatch {
my ($pattern, $string) = @_;
my $p = 0;
my $s = 0;

while ($p < length($pattern)) {
my $char = substr($pattern, $p++, 1);
if ($char eq '?') {
} elsif ($char eq '*') {
$p++ while (substr($pattern, $p, 1) eq '*');
for my $pos ($s..length($string)) {
return 1 if fnmatch(substr($pattern, $p), substr($string, $pos));
}
return 0;
} else {
return 0 if $char ne substr($string, $s, 1);
}
$s++;
}
return $s == length($string) ? 1 : 0;
}
0975デフォルトの名無しさん2007/03/14(水) 17:47:15
>>968
使ったことないんだが
単数のとき、 $value = $tree->{top}->{elem};
複数のとき、 $value = $tree->{top}->{elem}->[0];
だよな?とすれば、
単数のとき、 ref($tree->{top}->{elem}) eq "HASH"
複数のとき、ref($tree->{top}->{elem}) eq "ARRAY" / $count = @{$tree->{top}->{elem}}
となるはず。
0976デフォルトの名無しさん2007/03/14(水) 17:56:39
>>975
一部できたけど
また問題がでました、elemが0の時はどうしたら?
0977デフォルトの名無しさん2007/03/14(水) 18:08:37
$havechild=0;
foreach $key(keys %{$tree->{top}}){
if($key eq "elem"){$havechild=1;last;}
}

これで出来たけどなんか長い
0978906NGNG?2BP(3000)
答えられなくなると、名前を偽って
マイナス要素になる書き込みをするんですね。
ここのレベルも落ちましたね。残念です。

>>962
そこまで頭は悪くありません。
普段は普通に使っていますので。
0979デフォルトの名無しさん2007/03/14(水) 18:55:28
典型的すぎてワロタ
0980デフォルトの名無しさん2007/03/14(水) 19:26:20
あと何回捨て台詞吐くのかな
0981デフォルトの名無しさん2007/03/14(水) 20:10:25
>>978
入力が何で出力が何したいのか書けば、
天才の俺が教えてやっても良い。
0982デフォルトの名無しさん2007/03/14(水) 20:17:14
>>974
マンドクセーからちゃんと読んでないが、fnmatch()の真似をしたいのなら
パスのセパレータ('/')は意識しないとだめだろう。
09839062007/03/14(水) 20:20:25
>>981
自称天才の意味不明な要求なんか
聞く耳持てません。
俺はまともな人に向けて話しているんです。
0984デフォルトの名無しさん2007/03/14(水) 20:21:16
>>982
とりあえずめんどくさいので ? (任意の一文字) と * (任意の文字列) だけ実装してみました。
関数名が良くなかったですね。
0985デフォルトの名無しさん2007/03/14(水) 20:22:57
906が
> あれと同じで、ホスト名やらにワイルドカードを使い、評価したい訳です。
なんていうからこんな仕様になったんですけどね。
0986デフォルトの名無しさん2007/03/14(水) 20:23:18
http://rakuten.wise-policy.com/
おかげ様で完成です
よかったら使って下さい
0987デフォルトの名無しさん2007/03/14(水) 20:55:52
次スレはー?
0988デフォルトの名無しさん2007/03/14(水) 21:10:43
RFTM
0989デフォルトの名無しさん2007/03/14(水) 21:53:53
>>976
refが空文字を返してるんじゃないか?
そこまでは実装がどうなってるのか見てみないことには分からんが。
0990デフォルトの名無しさん2007/03/14(水) 22:56:51
新スレ
つ http://pc11.2ch.net/test/read.cgi/tech/1173880452/

# >988
# RTFM
0991デフォルトの名無しさん2007/03/15(木) 00:48:00
>>968
もう解決したかもしれんが、XML::TreePPならnewの時に
$obj = XML::TreePP->new( force_array => [ "elem" ] );
…とすれば、1個の時でも添え字を使える。
0992デフォルトの名無しさん2007/03/15(木) 21:22:51
梅?
0993デフォルトの名無しさん2007/03/16(金) 07:01:16
竹
0994デフォルトの名無しさん2007/03/16(金) 08:37:42
松
0995デフォルトの名無しさん2007/03/16(金) 09:46:55
酒
清
の
び
こ
ろ
よ
0996デフォルトの名無しさん2007/03/16(金) 10:44:07
>>995
どこを縦読みすれば?
0997デフォルトの名無しさん2007/03/16(金) 11:23:27
ume
0998デフォルトの名無しさん2007/03/16(金) 11:45:11
うめ
0999デフォルトの名無しさん2007/03/16(金) 11:46:23
1000!
1000デフォルトの名無しさん2007/03/16(金) 11:47:11
               ┌┐                                ●●●
    人          ││                              ●\  ●\
   ノ二\  ナ ゝゝ   V                 ●●●        ●\     ●\
     /   / 乙 つ  O               ●\   ●\      ●\       ●\
                  ●●●        ●\     ●\    ●\       ●\
                 ●\   ●\      ●\      ●\    ●\        ●\
       ●●\     ●\     ●\    ●\       ●\   ●\        ●\
        ●\    ●\      ●\    ●\       ●\    ●\       ●\
        ●\    ●\      ●\    ●\      ●\    ●\     ●\
       ●\    ●\       ●\    ●\      ●\      ●\    ●\
       ●\    ●\      ●\    ●\     ●\        ●●● \
      ●\     ●\      ●\      ●\   ●\           \\\
      ●\     ●\     ●\        ●●● \
     ●\      ●\   ●\           \\\
     ●\        ●●● \                              ┌┐ ┌┐
    ●\          \\\      ┣━┳┃┃      ┃          ││ ││
   ●●●\                      ┃   ┃┃┃ ┣┓ ━╋ ━╋  V   V
   \\\\                     ┛     ━┛ ┃   ┏┫ ┏┫  O  O
                     (´´
 
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。