1 :
デフォルトの名無しさん :
2012/03/02(金) 14:30:16.30
# [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)"; # ※1 use Encode; # 次に、あなたが実行したい処理の内容を入れて下さい。 $file = 'C:/なんたら/かんたら.txt'; open my $fh, '<', encode("cp932", $file) or die $! ; # ※2 print <$fh>; # 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう # おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。 # 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、 # ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。 # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、 # この例のように cp932 でエンコードする必要があります。
6 :
前スレ981 :2012/03/02(金) 17:33:26.84
前スレで右寄せリスト代入をするための方法を募集したものです。 # やりたいこと my ($sensen, $sensyu, $konsyu); ($sensen, $sensyu, $konsyu) = @ARGV if (@ARGV == 3); ($sensyu, $konsyu) = @ARGV if (@ARGV == 2); unshift @ARGV, undef if (@ARGV == 2); my ($sensen, $sensyu, $konsyu) = @ARGV; # 自分 my ($konsyu, $sensyu, $sensen) = reverse @ARGV; # 984さん my ($sensen, $sensyu, $konsyu) = @ARGV[-3, -2, -1]; # 985さん リバースの方法はカッコイイですね!思いつきませんでした。 変数の宣言順とコマンドライン引数の順が変わるのが少し気になりましたが。 添字にマイナスを指定するというのも直接的に右寄せする感じが面白いですね。 皆さんレス有難うございました。
my$i=0,$_=$ARGV[--$i]for reverse my($sensen, $sensyu, $konsyu);
もっと読みにくくしろや
> 変数の宣言順とコマンドライン引数の順が変わるのが少し気になりましたが そもそもの仕様が、必須項目は左に、省略可能なものは右にっていうコマンドライン引数の大原則を外れてることのほうを気にしろよ
いやまあどっちの原則を重視するのかはちょっと気になってた Perl寄りなら必須項目を左に寄せる原則重視だけど 右寄せ重視で書きたい場合もあるのかなと (たいてい左小右大で書かれる数直線的な感じで書きたいとか)
11 :
10 :2012/03/02(金) 19:06:30.47
あっと他の誰かと勘違いされかねない書き方してるな俺
この話題で書き込むのは
>>10 が初めて
コマンドラインって基本英語の命令の文法だから それを理解してるかどうかよくわかるw
マジかよ、20年以上オプションが前で、ファイルが後ぐらいの感覚しかなかったぜ。
コンパイラ言語で自作するのがいいね
perlでCSVを取り扱う時の一番楽そうなライブラリは何ですか "でそれぞれの要素が括られていて、中にコンマが入っていてもok、みたいなパターンの 取り扱いに3秒で挫折したので、いい感じにsplitしてくれるだけでいいんだけど
>>15 Text::CSV
Text::CSV_XS
のどっちかだね
まあ、その二つしか見つからなかったんだけど、 splitと置き換えるには結構面倒で installしないといけない、->newして->parseして->fieldsしないといけない、 unicodeで渡さないといけない、とかいろいろ きっちりしといた方が後々楽なんだろうけど、 splitと書いた所を、split_csvと書き換えるだけで全部面倒みてくれるような sub split_csv があったら、そっちの方が好きなんだよな
>>18 さすがにそれは自分で書きなよ
モジュールで提供してくれるのが一番だけど
何ていうのかな 楽をしようと思ってライブラリを頼ったのに、楽できない的な CSVくらいなら簡単だからいいんだけど、なんか大規模な作品にぶつかったりして まず勉強から入らないといけない 結果的に出来上がるコードはシンプルなんだけど、 単に大部分のオプションがデフォルトでいいと判ったからシンプルになってるだけで、 背景に膨大な知識が要る、みたいな
> installしないといけない もうPythonでも使ってろよと
>>2 Effective Perlはperl4の時代の本だよね
これのperl5バージョンみたいなの無いの
あ、ほんとだ 普通に4の本だと思って読んでた
>>20 そんな君には詳説正規表現がおぬぬめ。
楽をしたいなら購入するがいい。
27 :
デフォルトの名無しさん :2012/03/04(日) 03:50:08.60
>>20 ↑
何このゴミ
何で2chをブログ代わりに使ってるの?
>>27 ↑
何このゴミ
何で2chをブログ代わりに使ってるの?
今日は何故か下痢が酷かった 昨日食べたかっぱ寿司か、ワインか、つまみの鶏肉のどれかが怪しい 鶏肉は同じもの昨日も食ったから急に悪くなるとは考えにくいし、 ワインはそんな腐るようなものでもないから、やはり寿司か
30 :
デフォルトの名無しさん :2012/03/04(日) 13:05:33.36
>>28 ↑
オウム返ししたいだけで
わざわざレス消費するこういうゴミって必ずいるよね
31 :
デフォルトの名無しさん :2012/03/04(日) 14:11:30.69
膨大な桁数の計算をする時にはどういう感じでやればいいですか? 3.987......e+47みたいになるので、 それの回避方法です。 いいアルゴリズムないですか?
33 :
31 :2012/03/04(日) 14:50:58.20
>>32 アルゴリズムの書いてあるページ貼れやゴミ
34 :
デフォルトの名無しさん :2012/03/04(日) 14:51:33.30
>>30 ↑
オウム返ししたいだけで
わざわざレス消費するこういうゴミって必ずいるよね
本当にオウム返しきたw 頭悪そうw まさにゴミwww
38 :
デフォルトの名無しさん :2012/03/04(日) 20:02:40.09
馬鹿には無理
39 :
デフォルトの名無しさん :2012/03/06(火) 01:52:18.29
クソスレ
馬鹿には馬鹿
41 :
デフォルトの名無しさん :2012/03/06(火) 05:14:48.30
うるさいゴミ
42 :
デフォルトの名無しさん :2012/03/06(火) 16:05:48.69
バーカ
43 :
デフォルトの名無しさん :2012/03/06(火) 16:06:42.71
生きる!
45 :
デフォルトの名無しさん :2012/03/06(火) 18:57:42.01
↑ ゴミ
またどうしようもないカスが貼りついてんのか
47 :
デフォルトの名無しさん :2012/03/06(火) 22:14:15.40
48 :
デフォルトの名無しさん :2012/03/06(火) 22:28:48.33
失せろよ池沼
50 :
デフォルトの名無しさん :2012/03/07(水) 03:05:21.22
頭の悪いヴァカが住み着いてるな
51 :
デフォルトの名無しさん :2012/03/07(水) 12:06:33.78
ケツ毛の処理方法を教えてください
52 :
デフォルトの名無しさん :2012/03/07(水) 14:12:39.71
うるさいゴミ
53 :
デフォルトの名無しさん :2012/03/07(水) 17:35:17.78
chompはマルチコアに対応していますか?
モンゴリアンchomp
カトchomp にしてもラクダ新版が出たというのにこの荒れっぷりは
56 :
デフォルトの名無しさん :2012/03/07(水) 20:42:58.11
「P」と「H」の両方を含む言語は大抵ゴミ 例) PHP HSP Python
>>56 Pythonいいんじゃないの?
HSPは、どうかしらんけど。
PHPはキャラかぶってる。
Net::Nslookupでダウンしたサーバーに nslookupすると固まるのですが どうやってタイムアウトさせるのでしょうか? サーバーがダウンしてるか確認したいのですが
systemでping
1人雇った
ソース読むと$TIMEOUTって変数があるから、適当に設定しとけばいいんじゃないの。 Windows以外なら動作するように見える。
何入れても1分も待たされる ソースに書いてもダメみたい
63 :
デフォルトの名無しさん :2012/03/08(木) 01:04:39.63
マジで馬鹿しかいない
64 :
61 :2012/03/08(木) 01:40:39.28
>>62 デフォルトで15秒だから、他に何か問題があるんじゃないの?
試してみたらちゃんと動作したし。
つまりWindowsでは、この方法は無理なのか
バッチファイルとリダイレクトさいこう 巣に帰りました
67 :
デフォルトの名無しさん :2012/03/08(木) 15:19:59.97
クズだな
68 :
デフォルトの名無しさん :2012/03/08(木) 15:42:45.77
日本版じゃねーじゃん
sub read_file1 { local $/ = ""; <$_[0]>} sub read_file2 { local $/ = ""; my $fh = $_[0]; <$fh>} print read_file1("test.txt"); # ->GLOB(0x10063af0)と出力される print read_file2("test.txt"); # ->ファイル全体が正常に出力される なぜ1の方法ではうまくいかないのでしょうか?
すみませんコード部下二行、間違えていました。訂正です。 open my $fh, "<", "test.txt"; print read_file1($fh); print read_file2($fh);
>>71 perlopに書いてある
山括弧の中の文字列がファイルハンドルでもファイルハンドル名、型グロブ、 型グロブリファレンスの
いずれかが入った単純スカラ変数でもなければ、 グロブを行なうファイル名のパターンと解釈され、
コンテキストによって ファイル名のリストか、そのリストの次のファイル名が返されます。 この区別は
単に構文的に行われます。 <$x> は常に間接ハンドルから readline() しますが、 <$hash{key}> は常に
glob() します。 $x は単純スカラー変数ですが、$hash{key} は違う(ハッシュ要素)からです。
<$x > (余分な空白に注意) ですら readline($x) ではなく glob("$x ") として扱われます。
73 :
71 :2012/03/08(木) 17:03:05.36
>>72 レスありがとうございます。
あぁ、ラクダ本で何かそういった記述を呼んだ記憶があります。たしかこんな文面の、
行入力演算子<>の中に変数以外のものを置くと突然変異して別の演算子になる。:グロブ演算子
配列の要素も置けなかったとは読み解けませんでした。
$_[0]はグロブすべきファイル名パターンとして解釈されたのですね。
少し紛らわしいと思います。
代替法としては・・
<$foo>をブログとして解釈させるために<${foo}>とすることができるようですが
その逆、<$_[0]>をブログではなく行入力として解釈させることは出来ないようです。
>>71 のように一度別の容器に入れるしかないのでしょうか。
ブログ?
76 :
71 :2012/03/08(木) 17:23:37.36
>>74 ブログでした・・・
>>75 なるほど!ばかですね私ってw
うまく動きました。ありがとうございます。
~/work $ perl test.pl
sub read_file1 { local $/ = ""; readline($_[0])}
sub read_file2 { local $/ = ""; my $fh = $_[0]; <$fh>}
open my $fh, "<", "$0";
print read_file1($fh);
#print read_file2($fh);
__END__
77 :
デフォルトの名無しさん :2012/03/08(木) 17:56:17.05
ファイルロックについていろいろ試したけど ロックをしないで ファイルを読み込み中に書き込みするとデータが壊れる 書き込み中に読み込みしても壊れるが 読み込み中に読み込みしても壊れないということがわかった これらを考慮してファイル読み込み中は書き込みのみロック ファイル書き込み中は読み込みと書き込みの両方ロックするのが一番いいのである。
何十年前の話題だよ
fcntlの範囲ロックは未来の技術
PCDOSの話か
$cond = "t"; $cond ? $hoge = "aiueo": nop; ↑これはいけるけど ↓これはいけないんだね $cond = ""; $cond ? nop: $hoge = "aiueo";
flock
nopが変数じゃないからエラーじゃないから。
nopが変数じゃないからエラーじゃないからじゃないから。 ↓ノーエラー $aho = 84; $cond = ""; $cond ? $aho: $hoge = "aiueo";
有効な左辺値を返すのか。知らなかった。
undef や lvalue sub のように左辺値として有効な何かであれば変数である必要はない。
>>87 さすがにundefはエラーを吐く。
代入可能(左辺値として妥当)な何かであればいいけど。
undef はダメだけど () や (undef) なら妥当だね。 1 ? undef : $dummy = 'aiueo'; は通らないけど、 (1 ? undef : $dummy) = 'aiueo'; は (undef) = 'aiueo' になるので通る。 my @a = "a".."z"; 1 ? $foo : $bar = @a; say $foo; #=> 26 (1 ? $foo : $bar) = @a; say $foo; #=> a
1 ? undef : $dummy = 'aiueo'; は通らないけど、 (1 ? undef : $dummy) = 'aiueo'; は (undef) = 'aiueo' になるので通る。 これで意味が変わるのか? やっぱ、クソだわ。
91 :
デフォルトの名無しさん :2012/03/09(金) 01:20:08.26
flockが使えない環境用にmkdirで書き込みのみロックと読み込みのみロックと両方ロックのを作った 作るのにまる3日もかかった
>>89 それは条件部が定数だからコンパイル時に (undef) = 'aiueo': へ最適化されて
リストへの代入になるからたまたま通るだけで、
($ARGV[0] ? undef : $dummy) = 'aiueo'; のように変動する条件なら
$ARGV[0] ? undef : $dummy = 'aiueo'; と解釈され、
$ARGV[0] が真の時に undef = 'aiueo' をやろうとして実行時エラーになる。
じゃあ (($ARGV[0] ? undef : $dummy)) = 'aiueo'; なら通ったりするのかな?外側のカッコも最適化されてなかったものにされるのかな? それって処理系依存な動作だったりしないのかな?
>>93 > perl -v
This is perl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)
...
> perl -MO=Deparse -e "(($ARGV[0] ? undef : $dummy)) = 'aiueo'"
$ARGV[0] ? undef : $dummy = 'aiueo';
-e syntax OK
> perl -MO=Deparse -e "1 ? undef : $dummy = 'aiueo'"
undef = 'aiueo';
-e syntax OK
> perl -MO=Deparse -e "(1 ? undef : $dummy) = 'aiueo'"
(undef) = 'aiueo';
-e syntax OK
>>68 今日届いた。らくだ本は青くなってからだじゃれが減ってつまんないよ。
版が上がってますますそう感じる。それともおいらのセンスがないのかな。
日本語の第四版持ってるけどどんな所が改訂されたんだろう
>>97 ラクダの右足踏み込みが2ドット深くなってます。
翻訳されたのが出るのは何年後?
2年後でしょうね。 その頃はPerl5.18なので、脚注で補われるかと。
101 :
デフォルトの名無しさん :2012/03/10(土) 18:10:37.59
このようにmkdirでロックを作っているのですが if(mkdir("write.lock",0755)){ } #(ここの隙間) if(mkdir("read.lock",0755)){ } このように読み込みのロックと書き込みのロックの隙間に別のプロセスが入り込んで read.lockを作ってしまわないようにするにはどうしたらいいんですか?
>>101 ちょっと意味が分からないけど、
if (mkdir("read.lock", 0755) && mkdir("write.lock", 0755))
って事?
どういう事情で読み込み用と書き込み用で2つもロック用ディレクトリ作ってるの?
103 :
デフォルトの名無しさん :2012/03/10(土) 18:46:08.41
>>102 まあそういうことだけど
2つロック作る理由は
書き込みページ(kakikomi.cgi)
1:ファイルロック
2:ファイル読み込み
3:データ加工
4:書き込み処理
5:ファイルロック解除
読み込んで表示するページ(hyouzi.cgi)
1:ファイルロック
2:読み込み
3:表示
4:ファイルロック解除
1つロックだとkakikomi.cgiの処理が終わるまでhyouzi.cgiがsleep待ちというのはいいのですが
問題はhyouzi.cgiの処理が終わらないと他のhyouzi.cgiがsleep待ちになってしまって観覧数が増えると重くなると言うことです
すなわちhyouzi.cgiは書き込み禁止ロックだけかけて読み込みはできるというようにしたいのです。
DB使えばいいじゃん。 ってこれ言ったらおしまい?
>>103 たとえば、kakikomi.cgiやhyouzi.cgiが書き換えたり参照したりするファイルがdata.logだった場合、
kakikomi.cgiで、
ロックして書き出しの時にtmpファイルへ書き出し、
書きだしたtmpフィアルをdata.logへリネーム
ロック解除。
hyouzi.cgiは、ただ読み込むだけならロック無しで読み込み。
これならどう
106 :
デフォルトの名無しさん :2012/03/10(土) 19:10:04.23
hyouzi.cgiの読み込み中にrenameでdata.logの中身が変わると 読み込みが中断されたりしないのかな?
renameがアトミックかどうかはOS依存。 ぶっちゃけ※Windowsを除く。 つか板違い。
108 :
デフォルトの名無しさん :2012/03/10(土) 20:15:05.94
答えられなくなってきたので板違いと言って追い出すことにしました
110 :
デフォルトの名無しさん :2012/03/10(土) 21:24:22.36
1 Apple 2 Orange 3 Banana : のような 番号-文字列 で構成されたデータがあり、各データは1:1かつユニークであることが保証されます。 (1つの番号に複数の文字列が指定されていたり、逆に複数の番号でAppleが割り振られていたりはしません) 番号←→文字列の相互参照をさせるとき、どのようなデータ構造にするのがスマートでしょうか? とりあえずユニークであることの保証はデータベースに丸投げして、 Perl側で必要な部分だけ取得し、2つのハッシュ(片方は配列でもいいかも)に突っ込むという形を考えています。
>>111 http://perldoc.jp/docs/perl/5.10.1/perlfaq4.pod #!/usr/bin/perl -w
use strict;
my @data = split /\n/, <<'EOD';
1 Apple
3 Orange
5 Banana
EOD
# 番号が密で番号から文字列を引く処理が主なら配列
my @n2s; /([0-9]+) (.+)/ and $n2s[$1] = $2 for @data;
print $n2s[3], "\n"; # Orange
# 文字列から番号を引く処理が主ならハッシュ
my %s2n; /([0-9]+) (.+)/ and $s2n{$2} = $1 for @data;
print $s2n{'Orange'}, "\n"; # 3
# 番号が疎だったり両方の処理が必要ならハッシュ
my %n2s = reverse %s2n;
print $n2s{'1'}, "\n"; # Apple
# 計算量を気にしないなら毎回検索
use List::Util qw(first);
print first { defined $n2s[$_] && $n2s[$_] eq 'Banana' } 0..$#n2s; # 5
__END__
あとはこの手の処理をブラックボックスの中でやってくれるモジュールを探すなり、
それこそデータベースを使えって事になると思うよ。
>>112 サンクス!
実際に運用してみないと分からないけど、文字列→数字への参照の方がクリティカルになりそうなので、
2番目か3番目でやってみる!
試作段階では参照もDBに任せてたんだけど、ちょっと負荷が大きかった(´・ω・`)
まあ、まだ最適化やら何やらする前ってのもあるだろうけどね。
綺麗なコードだ・・・
>>112 どうすればこんなコード書けるようになるんだろう
ほとんど読んだことない。どんな時に読むものなのか分からない。
ていうかどこから読んでいいのかわからない
CGIならKENT本もいいよ
わざわざありがとう。個々の要素要素については分かるんだが、 全体通した時に上手に組み合わせて書くな、書き慣れてそうだなと思った。 もっと読みたい。
opendir my $DH, $dir or die "$dir : $!"; すると「リストを返してるのに括弧が無い」というような warning が出る。 Parentheses missing around "my" list at ... opendir my ($DH) なら怒られないけど 何故 opendir の dirhandle はリストになってるの? もしくは、リストになっていると何が出来るようになるの?
警告が出ないから分からん。
123 :
デフォルトの名無しさん :2012/03/14(水) 00:45:35.55
>>121 その警告は
my $foo, $bar
のように書いたときに出る。この場合、
my($foo), $bar
と見なされるから意図している動作と違うのでは? と。
典型的な例としては、my $foo, $bar = @hoge とか。
最近のバージョンだとこの動作を意図して書いているところでは
警告が出なくなっているんだと思う。多分。
「拒載韓国人(韓国人の乗車拒否)」こんな文字が台湾のタクシーに貼られていることが分かった。
韓国のインターネット上で、大きな話題を呼んでいる。
12日、韓国のコミュニティーサイトに「台湾のよくあるタクシー」「台湾の反韓感情」などのタイトルで、
台湾のタクシーの写真が投稿された。写真には女性がタクシーに乗車しようとしている場面が映っており、
開いたタクシーの窓には「拒載韓国人、NO KOREAN PASSENGER」という韓国人の乗車を拒否する文字が書かれていた。
この写真がネット上で広まると、多くの韓国人ネットユーザーが台湾タクシーの対応に反発。
「台湾はそんなに韓国人が嫌いなのか?」「私も台湾が嫌いだ」「幼稚だ」などのコメントが殺到した。
中には、「外国ではマナーを守ろうよ」「海外でK-POPや韓流は人気だけど、韓国人の市民意識のレベルはまだまだ低い」
といった意見や、「日本はほかの国々から好かれているからうらやましい」「台湾は日本が好きだよな」
「台湾は日本に植民地支配を受けたのになぜ親日なのだろう」などと日本と台湾の関係について議論する韓国人ユーザーらもいた。
韓国メディアによると、台湾内の反韓感情は、韓国が中国と国交を結んだのを機に高まった。
2004年に台湾の1人あたりのGDPが韓国を追い越した頃から、反韓感情は強まりをみせているという。
http://news.livedoor.com/article/detail/6364207/ http://image.chosun.com/sitedata/image/201203/12/2012031201423_0.jpg
PerlでMySQLを叩く時、今まで通りに 文字化け防止で$dbh->do("set NAMES sjis"); とやっていたのですが、新しくデータベースを作成し、そこでinsert文を作成したら Can't call method "do" on an undefined value とエラーが表示されます。 何が原因か分かる方いませんか
>>121 よく見たら警告の出る所では or die ... の部分を省いてた。
つまり単に opendir my $DH, $dir; と書いてた。後付でゴメンね。
>>123 なるほど dirhandle 云々じゃなくて、 my $DH, $dir の部分がリストなのでは?と警告されてるのか。
open my $FH, '<', $filename; の時はこの警告が出ないから気づかなかった。
つまり open のときはイディオムとして処理されてるのか。
>>127 ちゃんと記入しています。
SELECT文の時は何も問題なく接続できますが、INSERT文になるとなぜかエラーがでます。
一番怪しいのは、 その手の常套句であり頻出語の筆頭である 「いままでどおりに」 その時から行った「今まで通り」の手順に何らかの問題がある
>>125 だから、undefined value なんだろ。$dbh が。
>>126 opendir my $dh, "$dir" でもいいはず。
>>130 本当にごめんなさい。
自分の頭の中では
$sth = $db->do("set NAMES sjis");
とやってるつもりだったのに・・・
$dbh->do("set NAMES sjis");
なんでこんな書き方してるんだ・・・・・・
質問です。 DBI.pm、DBD::Pg.pmのソースを見たのですが、 DBIのメソッドexecuteはどこで定義されているのでしょうか?
>>130 あ、はい。それでようやく分かった。
open my $FH, '<', $filename; は間に '<' が挟まるから
リストの宣言とは解釈しようがないわけね。
どうもありがとー。
パーサーがコンテキスト読みすぎで 文法が無駄に複雑
初歩的な質問でごめんなさい %hashの添え字をスカラー変数名に自動的に置き換えるにはどう言う風に組んだら良いのでしょうか? 例 $hash{hoge} $hash{moge} $hash{poge},,,,,, これを $hoge $moge $poge........ と言う風にしたいのですが、初心者すぎて手作業でしか出来ませんでした。
こういうこと? $text = <<'HERE'; $hash{hoge} $hash{moge} $hash{poge} HERE $result = ""; while ($text =~ /{(.*?)}/g) { $result .= "\$$1 "; } print $result;
my $keys = [ qw(a b c) ]; my $values = [ qw(apple banana chocolate) ]; my $hashref = {}; @{%$hashref}{@$keys} = @$values; print $hashref->{a}, "\n"; perl v5.8.9で実行すると apple と表示されるのですが、 perl v5.10.1ではエラーになります。 Can't use string ("0") as a HASH ref while "strict refs" in use at 〜〜. perl v5.10.1でもappleと表示されるようにするにはどうすればいいのでしょうか?
138 :
137 :2012/03/14(水) 17:48:44.70
自己解決 #@{%$hashref}{@$keys} = @$values; @{$hashref}{@$keys} = @$values;
>>136 ありがとうございます。
whileと正規表現を使えばいいんですね。
ありがとうございました。
140 :
デフォルトの名無しさん :2012/03/14(水) 18:40:58.63
socket通信のプログラムを書いていますが、 オブジェクトを送信して、受信側でオブジェクトを参照しようとすると HASH(0x00)みたいになって参照できないのですが、 何か対処方法はありますか? 以上、よろしくお願いします。
コードも無しに対処法とは…… 俺らのことをもしかしてエスパーか何かだと思ってる?
142 :
デフォルトの名無しさん :2012/03/14(水) 19:10:21.40
うーん。会社から2chに繋がらないのです。 明日USB経由でコードを持ってきて出直します。
それはそれでいいのかw ・・・まぁ原因部分だけならあれか
>>140 オブジェクトをそのままファイルに保存出来ないのと同じ理由。
Storable、Data::Dumper、JSON などでシリアライズして送信すると良いかも!
会社って…… だーーーーーれも教えてくれないの???
146 :
デフォルトの名無しさん :2012/03/14(水) 19:51:08.42
>>143 やっぱりわかっていそうだw
送信が
print $socket $obj
受信が、
my $msg = <$client_socket>){
みたいな感じで、
chomp( $msg);
$obj = $msg;
$obj->show_hoge;
↑HASHがうんたらって出てくる。
多分、分かる人はすぐに分かる問題だと思うけど。
147 :
デフォルトの名無しさん :2012/03/14(水) 21:56:16.89
>>145 教えてくれる人がいる方が珍しい
大抵は孤独に独学だよ
>>132 DBI::DBD::SqlEngine::st::execute
SqlEngine.pmの773行目あたり
>>137 素直にList::MoreUtils使わん?
use List::MoreUtils qw/zip/;
my $keys = [ qw(a b c) ];
my $values = [ qw(apple banana chocolate) ];
my $hashref = +{ zip @{$keys}, @{$values} };
print $hashref->{a}, "\n";
>>146 show_hogeがcoderefだからそのまんまじゃシリアライズしてもダメかもね。
データだけ渡してロジックは受け側が持っとかないと。
Perl6はいつリリース予定ですか?
クリスマス
Digest-SHA-PurePerl-5.71でprint sha512(hoge);が出力されないのはなぜか教えてもらえませんか? ? sha256やsha1は出力されるのに。。
>>145 わかるわー
会社で聞くと、おめーそんなこともわからねーのかふざけんなって、居眠りばかり
してるおっさんプログラマーに怒られる
>>152 エラーメッセージは出た?
手元の環境では動くようだけど。
# This is perl 5, version 12, subversion 3 (v5.12.3) built for darwin-multi-2level
perl -MDigest::SHA::PurePerl=sha512 -e 'print sha512("hoge")'
perl -MDigest::SHA::PurePerl=sha512_hex -e 'print sha512_hex("hoge")'
>>154 さん
ありがとうございます
エラーはでません。指示頂いたやりかたで試してみます。
【ソース】
use lib '../module';
use Digest::SHA::PurePerl qw(sha1 sha256 sha256_base64 sha512 sha512_base64);
print sha256 (a);
print "\n";
print sha256_base64(a);
print "\n";
print sha512(a);
print "\n";
print sha512_base64(a);
【結果】
C:\Perl\work>sha.pl
ハ浴ハスハツ1ウ・ワMァ・・|Nrケw・dサ
ypeBEsobvcr6wjGzmiPcTaeG7/gUfE5yuYB3ha/uSLs
C:\Perl\work>
use Digest::SHA::PurePerl; my $state = Digest::SHA::PurePerl->new(512) or die; 私の環境もこれで死ぬ。 軽くソース追ってみたけど、64bit長の計算ができないと、はねられる模様。
__END__以下を一気読みして変数に入れるため以下のようなコードを書きました。 しかし一気読みされずこの様に出力されました。 >[あいうえお >かきくけこ > >] 何故行の区切り文字を無くしたにも関わらず区切られてしまうのでしょうか。 これは仕様なのでしょうか?This is perl, v5.10.1 built for MSWin32-x64-multi-thread $/ = ""; $data = <DATA>; print "[$data]"; __END__ あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ
>>157 perldoc の説明だと分かりにくいけど、"" は "¥n¥n" と似た動作をする。
多分、undef $/; が答え。
160 :
デフォルトの名無しさん :2012/03/15(木) 19:06:08.11
>>157 これって改行が続いていて、そこが終了と認識されているんじゃないの?
シングルクオテーションでくくってみたら?
噴いた
file33.jpg 1234
164 :
157 :2012/03/15(木) 20:30:21.12
>>158 ,159,160
$/ = ""には空行を区切り文字にする、という意味があったのです。
代わりにundefを使うことで目的の動作が実現できました。
""とundefの二種類があることを活用しているのです。
レスありがとうございました。
パ・パ・パパッパ〜Perlライス
sub decimal2binary { my $decimal = shift; my $binary = ""; while($decimal>=1) { $binary = $decimal % 2 . $binary; $decimal /= 2; } $binary; } sub binary2decimal { my $binary = shift; @binary_ary = reverse split //, $binary; my $i = 1; my $result = 0; for(@binary_ary) { $result += $_ * $i; $i <<= 1; } $result; } print binary2decimal(decimal2binary(5184)); #=> 5184 こういう10進数と2進数の変換関数を書いたのですが、もっとクールにしたいです。添削お願いします。
デバグの時に使うBEGIN{ $| = 1; print "Content-type: text/html; charset=shift-jis \n\n"; open(STDERR, ">&STDOUT"); } は具体的にどう言う動きをするのでしょうか? &STDOUTでエラーを検知したら、 print "Content-type: text/html; charset=shift-jis \n\n"でSTDOUTの中身を書き出すって感じなのかな?と思うのですが、{ $| = 1;は何を指示してるのでしょうか?感緑化されてるようでちょっと意味がわかりませんでした。 初心者ですみません。
perldoc嫁ks
>>169 BEGIN{ # コンパイル時に実行されるブロック (sub BEGIN { ... } と同じ)
$| = 1; # STDOUTのバッファリングをオフ
print "Content-type: text/html; charset=shift-jis ¥n¥n";
open(STDERR, ">&STDOUT"); # 標準エラー (STDERR) の出力先をSTDOUTと同じにする。
}
172 :
デフォルトの名無しさん :2012/03/17(土) 18:08:54.19
renameが失敗するのはどういう場合ですか?
おなじファイルがすでに存在する場合(ファイル名がわるい)
>>172 同じ名前のファイルがある場合。
同じ名前のディレクトリがある場合。
変更しようとしているファイルが存在していない場合。
ファイル名を変更する権限がない場合。
別のプログラムがファイルを開いていてロックかけている場合。
名前として有効でない記号などが入った名前の場合。
ウイルスに感染している場合。
OSが不調の場合。
HDDが壊れている場合。
パソコンが壊れている場合。
そういう夢を見ていた場合。
電源が入っていない場合。
電力会社が大変な事になっている場合。
世紀末でメシア待ちの場合。
ヤマト発進後のプロジェクト成功待ちの場合。
エラーバリアブル見ろよ。
177 :
デフォルトの名無しさん :2012/03/17(土) 19:54:51.07
>>174 >別のプログラムがファイルを開いていてロックかけている場合
これはflockをしている場合と言うことですか?
>>171 ありがとうございます。
$| = 1;をどう検索かけても、検索出来なくて途方にくれてました。
そう言う意味だったのですね。
>>177 OSさんがファイルロックしてる事もある
flock中にファイル名変えれるかどうかはしらん、試せばいいんじゃない?
180 :
デフォルトの名無しさん :2012/03/18(日) 03:25:45.75
perlvar見ればggr必要すらないがな
最近の2ちゃんは略字が多くてわかりづらくなってしまったな 最近常用となってしまった2ch略字 kwsk 詳しく wktk ワクワクテケテケ ktkr キタコレ mjkt マジキチ iksg 今北産業 opop おっぱいおっぱい drum だれがうまいこと言えといった omor お前は俺か morkw またお前らかよw ohh2ckyw お前ら平日の昼間から2ちゃんかよw mjkt マジキチだからやめろ ggrks→これはわからん・・
perldocとか使いませんですしおすし 俯瞰出来る.jpはたまに見る
>>182 mjktが2通りあるぞ
ここまでわかってggrksがなぜわからぬ
ネタとしてはあまりにつまらなすぎて意味不明だからマジボケなんだろうけど
>>182 「今北産業」「だれうま」「おま俺」「マジキチ」というのが略記であって
その一覧はアブジャド系表記にしか見えんが…
ggrksはググれカス
いや、iksgは流石にアブジャドだけじゃ足らずに略もしてるか
ここまでコピペ
iksg イキすぎ
若者のマニュアル離れが深刻。
マニュアル離れって・・・そこらのオッサンの方がマニュアル読まないだろうがw
さすがにμ即ネタは食いつきが違うな。
待て、マニュアルは使うな!マニュアルは最後の武器だ!
マニュアルモード カラ オートメーションモード ヘ イコウシマス
思い込みという脳内マニュウアルが最優先です。
その点、Perlはマニュアルがいらないからいいよね。
いやだからperldocは見ねえと言ってるだろ!
LWP使っています。 javascriptが有効であるかのように振る舞う方法があったら教えてもらえませんか?
199 :
デフォルトの名無しさん :2012/03/19(月) 15:35:17.24
ふつうはopenしてflockしますけど、 これロックファイル無しで一体化できませんかね
>>200 ありがとう
おれLinusだから利用できないわ
おや、ご旅行ですか?
206 :
デフォルトの名無しさん :2012/03/20(火) 07:38:39.74
PerlにはRubyでいうyugui本みたいなのはありますか? 思い当たるものがありましたら教えて頂けると嬉しいです _ _
リャマ本ってこと?
208 :
206 :2012/03/20(火) 07:52:02.22
>>207 返信ありがとうございます。リャマ本とラクダ本は過去に読んだのですが、
リャマ本はプログラミング初心者を対象としており
(プログラミング経験者には記述が冗長で、また仕様が十分に記されていない)
ラクダ本は小さく纏まっていない気が私的にはするのです。
Perlの仕様を必要十分に短く簡潔に記述したものが知りたく
yugui本という例えを使いました。言葉足らずで申し訳ありません;
小型高速船で未明上陸、韓国人男女7人密航容疑
第7管区海上保安本部(北九州市)と大阪府警は19日、韓国からの密航者や密航の仲介をした
韓国人の男女計7人を入管難民法違反(営利目的の集団密航助長など)容疑で逮捕した、と発表した。
同本部の発表によると、7人は仲介した無職鄭舜晧(42)、ホステス梁英美(46)の両容疑者
(いずれも名古屋市在住)ら。
鄭容疑者は昨年6月30日夕、韓国南部で小型高速船に女性3人(45〜51歳)を乗せ、
同7月1日未明に山口県下関市の小串漁港に不法上陸させた疑い。
梁容疑者は千葉県柏市と大阪市の韓国人女性2人(32、53歳)を同船で出国させるため、
同漁港まで車で運ぶなどした疑い。
女性たちは1人50万〜100万円の報酬を支払っていたという。
同本部は鄭、梁両容疑者は密航請負組織の一員とみている。
大阪府警が昨年10月、不法上陸した3人のうちの1人を不法在留の疑いで逮捕し、集団密航が発覚。
3人はすでに全員逮捕、起訴され、有罪判決を受けた。
(2012年3月19日21時08分 読売新聞)
http://www.yomiuri.co.jp/national/news/20120319-OYT1T00969.htm
スレッドを生むスレッドってどーやって作るの?
211 :
デフォルトの名無しさん :2012/03/20(火) 12:21:20.66
perlの処理順番について質問です 1:プロセス1とプロセス2を全くの同じ時間に起動した場合 全く同じ行の全く同じ部分が同時に実行されるのか? 2:プロセス1を先に起動して、その0.01秒後くらいにプロセス2を起動した場合 プロセス1の1行目はプロセス2の1行目より0.01秒はやく実行されるだろうが それ以降の行でもプロセス1の方がプロセス2よりも0.01秒はやく実行されているのか? 例えばプロセス2の100行目がプロセス1の100行目より先に実行されるということはないのか? 教えてください
>>211 CPUの数はいくつありますか?(マルチコアですか?)
213 :
デフォルトの名無しさん :2012/03/20(火) 12:27:53.24
>>212 CPUいくつあるかわからないので
1つの場合と複数の場合について教えてください
215 :
デフォルトの名無しさん :2012/03/20(火) 18:03:41.46
処理の順番が狂うとうまくいきません yomikomi.cgi y-1:readlockファイルがない場合 y-2:writelockファイルを作る y-3:readlockがあればsleepで待つ y-4:読み込んで表示 kakikomi.cgi k-1:readlockファイルを作る k-2:writelockファイルを作る k-3:sleepで待ってreadlockとwitelockファイルが作成できたら k-4:書き込む 処理の順番がy-1〜y-4,k-1〜k-4となる場合や k-1,y-1,k-2,y-2,k-3,y-3,k-y,y-4となる場合は問題ないのですが yー1とyー2の間にkー1とkー3が割り込んだら ロックができない状態になります どうすればいいんでしょうか?
そういうのはひとつのロックファイルで排他ロックと共有ロックを使う
DB使いなよ。
>>218 もしかしてDBまでモダンだと思ってるの?
>>217 =─‐\\‐ /─'''''ニ二\''' |レレゝゝ、\
 ̄く<<く >, ゙、/<三三二\ ̄\ゝゝゝゝゝゞ''ヽ、
<<<<〈__入 ゙、く彡三三三二ヽくゝ\メメメゝ、_ゝ、\
くく<<<<<< ゙、 ゙、ミ三三二ニ─ゝゝゝゝゝ,,,,,,,、 '( ゙''ヽ、ヽ、
くくくくくく彡‐ヽ ゙、ミ三三二ニ'''くくゝゝ_ゝゝ、\\_,>」ノ,
く く く く く 彡゙、゙、三三二ニ‐くゝ、/ ,,,,,,,,メメゝヽ''''"ゝゞ丶、
二─二二彡彡、゙、三三二==くメゝ/ ゙'ヽ、メゝゝゝゝゝゝゞ''ヽ-、,,,,,,_
‐'''" ̄ \彡彡ミ、゙、三二=''"く<メ/:: \''-、メメゝゝゝ_ゝ 、 ,,、ヽヽ
、 ,,,,- ゙彡//ヾ、三二= くゝ/:::.... \>∠レ-,-‐ニ二メヽ''ヽ ノ
゙ヽ、,,,-‐//_///,,、゙、三二= ゙、 ""''' ヽ>//レレヽ,,___ /
-,,,,,,-‐'''"""/////,,ヽ ゙、三二─ ゙ヽ. //-ヘヘ,、 レレレレノ さあ願いを言え
''" ,l|"////ノ,、\彡'''''‐-ニ,、 ::::::::::,,,,,,,,// ゙ヽフ/|/| レ' どんな願いも聞き流してやろう。
ドラゴンボールな、はいはい。
/`゚`ii´゚`ヽ
>>211 ,
>>215 どうなるかは不定(決まってない、どっちになるか分からない)、としか答えようがないでそ。
どうしても特定の順番で処理させなきゃいけないんなら、
排他ロックを適切にかけながら処理するしかない。
そしてもちろん排他ロックにはアトミックな仕掛けを使わなくてはいけない。
ただそれだけのこと。
DB使えってのはDBMSがそのへんの排他制御を比較的よきにはからってくれるから。
flockとかそういう話じゃなくて?
flockでもいいんじゃない?使える環境なら
228 :
208 :2012/03/20(火) 22:32:19.30
どなたか宜しければお願いします _ _ perldoc辺りが最善手になるんでしょうか・・・
プログラミングの基礎を学びたいのか実戦で効率的にやりたいのかどっち?
230 :
208 :2012/03/20(火) 23:05:01.65
>>229 返信有難う御座います。プログラミングの基礎を学びたいわけではないです。
かといって、実践で(仕事で)使えればそれで良いかと言えば
Perlは既に仕事で何度も使っているのでそういう訳ではないです。
Perlの仕様を隅々まで(と言っても限度はありますが
少なくともラクダ本にある程度は)把握したいです。
ですが、ラクダ本をもう一度全て読むのは分量があるので御免被りたいです。
ワガママですみません;
>>230 Perlの隅々の仕様の把握ならラクダ本ほど楽な方法も中々ないぞ
一気に読もうとせず、毎日コツコツ読むだけでも随分違うかと
今まで知らなかった仕様を知ることができるかもよ
毎日20ページ読むだけで2週間ありゃ読み終わる
1ページの半分読んで眠くなる
235 :
デフォルトの名無しさん :2012/03/21(水) 01:08:33.44
ディレクトリがあるかどうか調べるとき ディレクトリがない場合というのelseやunlessを使うしか方法はないんでしょうか? elseやunlessはあまり使いたくないんだけど if(-d "test"){ print "ディレクトリがあります"; } else{ print ""ディレクトリがありません; }
not -d
>>230 そんな君にはポケットリファレンスがよかろう
あの青いやつか
痴漢するときに、入力したファイルをそのまま変換するのって どんなオプションでしたっけ
自己解決しました。 やっぱり愛なのね。
関数の戻り値を変数に代入する場合、そのまま利用する場合と比較して、メモリは倍必要になるのでしょうか? my $data = large_data(); print $data; print large_data();
243 :
208 :2012/03/21(水) 11:17:49.63
>>231 ありがとうございます!検討してみます。
>>232 まさにこういうの探していました!本当に有り難うございます _ _
みなさん長々とお付き合いありがとうございました _ _
>>243 行末の「 _ _」が気になる。なんの暗号だ。
>>236 > not -d
! -d を使ってる。理由は忘れた。
m(_ _)m → m _ _ m → _ _ → ?
( @u@)
250 :
デフォルトの名無しさん :2012/03/21(水) 19:09:23.68
排他ロックはmkdirを使うやりかたがいろいろ紹介されていますが 共有ロックはflockを使う以外では見たことありません flockを使わないで共有ロックをするのは隙間ができたりして難しいのでしょうか?
>>250 別に難しくもなんともないが、mkdirだのあのあたりの方法は
プログラムが死んだときにロックしっぱなしになるので
自分では絶対に採用しないな。
hint: 404
シェルの関数でしょ
最終的にシェルだとかシステムコールにたらい回されるにしたって、
perlfuncに載ってるexecはPerlの組み込み関数でしょ。
http://perldoc.jp/index/function execのほかにforkやexitもだけど、リンクはあるのにクリックすると組み込み関数じゃありませんってのはおかしいので何かの手違いだろう。
そりゃあ簡単だ forkなんてUNIXの方の機能じゃん だからperlのモンじゃあない execもexitも同じ、perlの組み込みじゃない
手違いというより単に翻訳済みのドキュメントがないってことでしょ
んじゃそっちからこっちへアップデートされてないってことで
262 :
デフォルトの名無しさん :2012/03/22(木) 12:26:23.50
>>216 書き込みロックと読み込みロックの2種類があるから
どうしても2つロックが必要じゃん
『アドバイザリ・ロック』ッ!! オレたちの「読み込み」のみを許可し! ヤツらの「書き込み」を禁止しろーッ!
>>262 書き込むときは LOCK_EX、読み込むときは LOCK_SH
マジで吐いた処理
スクレイピングをするのに、いちばん簡単な方法は何ですか とりあえずの目標は、pixivをキーワード検索して、閲覧数でソートすることです
>>267 ピンポイントで正規表現
がとりあえず一番楽
use Web::Scraper;
ちょっと間違った scraperだけじゃあまだめんどい Web::Scraper入れてコマンドラインでprocessを試し打ち、 ラクにxpath取得するために、firefoxのアドオンfirebug入れる
271 :
デフォルトの名無しさん :2012/03/23(金) 12:10:02.21
$lock_path = "lock_test.data_mode_haita"; if($lock_path=~/(.*)_mode_(.*)/){ $lock_file_name = $1; $lock_mode = $2; } とした場合$lock_modeはhaitaとなるのですが $lock_path="lock_test.dat_mode_mode_haita"; の場合だと$lock_modeが取得できません どうすればいいのですか?
>>270 うう、やっぱり面倒そうだ
でもそのくらいは身につけても損はしない気がしてきた
LWPでhtmlなりダウンロードして あとは正規表現で欲しい所抽出してソート って感じじゃね
そういう意味ではperlはへヴィだよな
>>271 if ($lock_path =~ /(.*)_mode_([^_]*)$/) {
でどうだ
firebug使うと全部コピペで済ませられるらしいけど、 Firefox10以降ならツール→Web開発→調査でも、だいたいの情報が取れるよ。
>>276 すごいなfirefox
それコマンドラインから自動化したいんだけど、参考になるページある?
そういうの俺も探してた。→スクレイピングの自動化 対象となるウェブページとそこから抜き出したい文字列を指定することで、 自動的に類型のウェブページからスクレイピング出来るようなライブラリ。 これなら対象のウェブページの構造が変わったとしても自動的に対応できる。
>>277 誤解させてたらごめん。
ページを表示して、クリックで手軽に要素の属性を知ることができるってだけで、
スクレイピングは別に必要。
Web::Scraperでpixivの作品ページから取るとすると下みたいになると思うけど、
この.viewsや.titleを手軽に知ることができるだけ。
use URI;
use Web::Scraper;
my $pixiv_views = scraper {
process '.views', number => 'TEXT';
process '.title', title => 'TEXT';
};
my $uri = URI->new('
http://www.pixiv.net/member_illust.php ');
$uri->query_form(mode => 'medium', illust_id => '作品id');
my $views = $pixiv_views->scrape($uri);
xml::simpleも使えば
自動化できるかもナ
>>278 つっても
拾ったxmlのdumpの中身をマッチさせて
xml構造からxpathを練り上げるだけ
か?
>>271 > $lock_modeが取得できません
・期待する結果
・実際の結果
・「取得出来ない」というのはどういうことか
を説明すると回答をもらえるかも。
>>276 Firebug は存在しないtbodyをXpathに含めてしまうので注意が必要。ぐぬぬ。
存在しないんじゃなくて省略してるだけだよ
>>282 xml的にすくレイプしてる時には出てこないから、
いやーんな感じになるんじゃね?
sub hoge { qw(asdf zxcv qwer); } @ary = hoge(); print $ary[1]; 上記を一時的な変数を使わず直接的にアクセスするようにしたいのですが 以下の様に無名配列のリファレンスを使うよりないでしょうか? print ${[hoge()]}[1];
print + ( hoge() )[1]
どうやっても読みにくくなるな
面倒クセ―からクロジャーにしちまえよ あとオメーはどういう風にアクセス()したいんだ print hage()->[0]: とでも死体のか?
printしたいだけ、ということは普通あり得ないから、 何らかの変数への代入をする訳で ($dummy, $val) = hoge(); みたいな使い方で、大抵は問題ない
そこは$dummyなんて使わずにundef
そんなところにundefが書けるのは、 言語仕様として異常だよな
だがしかしそれがいい
結合が密なんで、代入するのが吉。
294 :
デフォルトの名無しさん :2012/03/25(日) 05:16:56.76
>>281 Firebugが追加してるわけではなくFirefox本体が補完している
古いPerlスクリプトを動かそうとしてみたら、2003年から更新されていない モジュールParallelUserAgentをPerlが通さなくて挫折したんだが、これを最少努力で 置き換えられるモジュールってなんじゃろう?
ParalelUserAgentを動くようにする。 それが何か知らないけど。
そんな努力はしたくない が答え そのスクリプトは捨てる
一括ダウンする時は、リストだけ作ってIriaとかに渡してるな
俺はwget
>>301 セマフォまで話が及ぶんなら
そのままthread使えよ
と思ってしまう
一つのバカでかいファイルを並列DL……
てワケでもなさそうだし
いっせんまん とかお書きになられてるし
そしてそのblog、その記事が人気エントリになってるwww
アクセスしすぎだwww
何だ何だと勘繰るだろwwwww
>>303 wgetでページにアクセスして、そこで発行された
クッキー使って別のページから落とす。
みたいなことどうやってやるの?
>>304 だからクローラだろ?
しっかりそのページに書いてあるじゃん。
もしかしてクローラしらないとか?
Gtk2::MozEmbedを使うのが正解は越後製菓
>>305 そんな面倒臭いことはやったことがないし今後もやらない
310 :
デフォルトの名無しさん :2012/03/26(月) 12:51:25.81
1:投稿をファイル1に書き込む 2:投稿数をファイル2に書き込む 1と2の処理の間に鯖が落ちたり、sleepでタイムアウトエラーになったりする場合 実際の投稿数と投稿数が合わなくなりますがこういうのを避ける方法はないんでしょうか?
>>310 そこまで気にするなら同じファイル(データベース)に書くしかない。
>>310 というかそんな用途なら違ってもこまらなくね?
マルチコアやらマルチスレッドで動いてるもんが、 究極的に処理の競合を避ける方法って無いよな 誰も使ってないことを確認してから、自分が使うことを宣言するまでの時間を ゼロにできない
PerlでFirefoxを操る方法がわからない。Win32::OLEはIEしか使えないし WWW::Mechanize::Firefoxなるものをググってみてあるらしいことはわかったが今一 Win32::OLEみたいなものないのかな?
素直にaddon書けばいいんじゃね? さすがにそこはperlの域を超えてるような気もする それか Firefox::OLEのようなもの を自作するとか CPANに上げれば一躍スタァになれるぞ
CPANに上げることもスターになることも目的ではありません。
確認せずに書き込むぜ ワイルドだろう?
>>318 俺こういうの用事ないからわからんのだけど、どうやんのが一般的?
そもそもFirefoxが外部から操作できるようになってないんでしょ。
mozrepl
Firefoxのある特定のクッキーをPerlでエクスポート エクスポートした情報をPerlで読み込んだり、 FirefoxにPerlにてインポートできますかね?やり方教えてください
クッキーなんか唯のテキストファイルだから どーにでもなる これ以上はwebpログラム板あたりでどうだろう
Firefoxのクッキーってテキストだっけ
違うな
テキストファイルじゃなければバイナリなんだから どーにでもなる
まあPC上のすべてのファイルはバイナリ(テキスト以外)だからな exeもバイナリだ
特定アプリのファイルの読み書きは ウェブプログラムじゃない。 ここでよい。
昔の古いバージョンじゃなければtxtじゃなくsqliteでしょ。
以下、テキストとバイナリの話題がループして元に戻る ↓
バイナリなんて無茶だ
FireFoxのクッキーとかWebProg行きだろ そうじゃなかったら、Perlとは関係ないFireFox都合の質問でスレ違いだろ
Plackとかの質問もこっちじゃないの? CGIじゃなければいいと思うけど。
えっ
WebProgで質問してもどうせこっちにたらいまわされるだろうなw
最近やたらsqliteファイルにぶつかるな そんなに便利か?
うん
> FireFoxのクッキーとかWebProg行きだろ はぁ? どこにウェブ関係有るんだよw
Firefoxは " W E B ブ ラ ウ ザ " なんだが
PerlからSOAP::LiteでJavaアプリにリクエストを投げて、レスポンスを色々加工して表示、 ということをしているんだけど、その時に、設定したタイムアウト値(90秒)よりもかなり短い時間(早い時は1秒以内)で タイムアウトのエラーになることが度々あって困ってます。 こういった現象の原因に心当たりのあるひとはいません?
知らないくせに余計なこと書き込むから・・
設定した気になってる が 正解
$timeout=90; $soap=SOAP::Lite->proxy($url, timeout=>$timeout); こんな感じでセットしてるんだけど、これでタイムアウトセットされてますよね?
>>347 おお。知っている人がいた。
まじありがとうございます。
349 :
デフォルトの名無しさん :2012/03/27(火) 01:15:49.14
crypt関数は半角で8文字までのパスワードしか暗号化できませんが 半角で16文字までのパスワードを暗号化するには substrで8文字ずつわけて、それぞれ暗号化して最後にくっつけるというやり方しかないんでしょうか?
CPANでモジュールをバージョンアップしたい場合 アンインストールせずに普通に上書きで大丈夫ですかね? 通常の方法で大丈夫?
>>349 Digestモジュールからsha1使ったら?
>>350 既存の環境壊したくなかったら適当なユーザランドにperlbrew + cpanminusしたら?
>>310 ファイル名の末尾に投稿数をつければ良い
つーか1と2が連続していると仮定した場合(普通そうすると思うが)
その途中で鯖が落ちたらファイル1破損してね?
投稿数が合わなくなる云々以前の話になる
return $table->{long}{$_} if defined $table->{$_};
途中送信してしまいました。すみません。 say $table->{"key"} if defined $table->{"key"}; 重複が気になるのですがもっと短く書けませんか?
$table->{key} を何度も書きたくないだけなら変数に代入しちゃえばいいのでは。 {my $k = $table->{key}; say $k if defined $k} ぜんぜん短くはなってないけど。
a<>b<>c<> みたいに記録してるデータを書き換えるとき $data = 'a<>b<>c<>'; として ($x, $y, $z) = split(/<>/, $data); <処理($x = 'A'; など)> $data = "$x<>$y<>$z<>"; みたいにやってるんだけど開発途中で a<>b<>c<>d<>e<>f<> みたいに追加したり a<>d<>e<>b<>f<>c<> みたいに挿入したりしたいが別の処理する状況で何回も同じのが出てくると修正に時間がかかる (いちいち ($x, $y, $z, $r, $s, $t) = split(/<>/, $data); とか $data = "$x<>$r<>$s<>$y<>$t<>$z<>"; と書き換えるのが面倒) なんか巧いやり方ありませんか?
>>354 普通に代入に一票。
my $key = $table->{key};
say $key if defined $key;
お勧めしないperlっぽい何か。
defined and say for $table->{key};
>>356 あのですね、
ここはおひとつ、配列というものをお使いになってはいかがでしょうか?
それか一行目に
name<>mail<>id<>date<>str
とか書く
あとはその一行目でハッシュうんぬん
>>356 #!/usr/bin/perl
use strict;
use warnings;
my $target = $ARGV[0] || 'z';
my $fs = '<>';
my @field = split $fs, <DATA>;
while (<DATA>) {
my %record;
@record{@field} = split $fs;
print $record{$target}, "\n";
}
__DATA__
x<>y<>z<>r<>s<>t<>
a1<>b1<>c1<>d1<>e1<>f1<>
a2<>b2<>c2<>d2<>e2<>f2<>
普通はjoin使うね
>>355 ,357
レスありがたいです。
definedがなければ以下の文でいけたので、これを基準に右側をこねくり回していたのですが、ダメでした。
say if $_ = $table->{"key"};
say if $_ = defined($table->{"key"}); #definedが1か""しか返さないのでダメ
左側で処理すればよかったのですね。このforの使い方、ラクダ本で見た記憶があります。
この様なものを欲していました。
defined and say for $table->{key};
チラ裏
say if defined($_ = $table->{key}); #これでもいけました
凄い低レベルな質問で申し訳ないんですが、スクリプトを実行する度に実行結果を新しいファイル作成してログに吐き出すには、どうしたらいいんでしょうか。 ログローテーション見たいなのを想定しています。
現在時間でもファイル名に与えたら?
オレの勘によれば ログローテーションをやってくれるそのものがCPANにある 1000ペリカ賭けてもいい
このスレにも一過性のモダンPerl()を流行させようとする青尻君か。 長期に渡る保守を考えたらCPANなんかに頼らず自分で書かないと。
www use Encode; の代わりの何かをスクラッチから自作すんの?wwww ガンバってねwww プ
おいおいwCPANまで否定すんのかよw
CPAぁ〜〜〜N CPAぁ〜〜N 人はぁ誰ぇ〜でもぉ〜 CPAぁ〜〜N CPAぁ〜〜〜N ひとつのぉ太陽ぉぉおおお〜〜〜
CPANを否定するなんて、こっちは青鼻くんか...。やれやれだぜ。
Jcodeで十分。
いやさ 十分とかじゃなくてさ Jcodeなど使わずにそれに類するものを 「後後の保守を鑑みて」自作する……ってんだろ?
なにごともほどほどで
Jcodeが嫌なの?それとも髭がいやなの?どっちなの?マギカは好きなの?
素のPerlと標準モジュールだけで全て事足りるようになって ようやく初心者卒業。 それぐらいは理解しようね、青尻くんたち。
まぁお前ら。 俺の小話でも聞いて落ち着かないか
小話、ワクワク、ドキドキ
ガラパゴス標準をばかにする気だな、この洋かぶれが。
CPANの無いPerl使うくらいならPythonやってる。
モダンモダンいうならRubyやってる。
あ、PHPは無い。無いわー。ごめんなー。
小話はどうなった
モダン冷ややかとCPAN否定はまるで別だけど、青尻くんには区別できないん だろうな。
はやく小話してくれないとかえって落ち着かないよ
標準じゃなければモダンだろJcode
388 :
デフォルトの名無しさん :2012/03/28(水) 23:38:54.10
ガラパゴスモダンってことで。うん、今いいこと言った。
389 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/03/29(木) 02:25:01.46
まあppmでいいな
>>387 JcodeとJKをひっかけてるのか
なるほどこれが小話
なんだこの名前は Cスレのアレのせいかよ
smalltalkはいいぞ
【モダン推奨】スレ潰した奴が乗り込んできた模様
も〜ダンナったら勘弁して下さいよー
このままじゃ体がモダンわい
ポストモダニズム
perlで@等のsjisの文字をutf-8にfrom_toで変換すると文字化けするんですが、 どうすればいいでしょうか?
>>4 >>5 あたりに書いてある
結論としては:ンなモン使うなアホ
>>398 勉強してみます。
普通の文字はちゃんと変換できるのが不思議です…
www フツーの文字じゃねーからそれwww @AB
(1)とかに置き換えるように書こうと思っても、 utf8のみでは処理できない
もういい、sjisで書くな。
取り敢えずnkfを通すことで変換できました。
そうは言っても、既に膨大なsjisの資産があるのだから、 今後1世紀はsjisの呪縛からは逃れられない
オトナの事情もありますからね
@とかはshiftjisの範囲じゃない cp932ならおk
銀行の口座名義がカナしか使えないのは、100年経っても変わらない気がする
Coroを使えば複数のファイルを監視できそうだ、という所まではわかったのですが 以下のような場合どう書けばいいのでしょうか?よろしくおねがいします。 use File::Tail; use Coro; for my $path(@paths){ my $file = File::Tail->new(name=>$path, tail_num=>0, maxinterval=>1, interval=>1); while (defined(my $line = $file->read)) { if( $line =~ /$regexp/ ){ warn "match! : $line"; } } }
>>409 File::Tail::selectじゃだめなん?
>>409 ファイルの監視とスレッドは全く別の問題。
そのコードはいろいろとその、マズい。
OSにも依るけどログを追っかけたいのならログはきちんとsyslogあたりに出して、
syslog.confに名前付きパイプでもくっつけて定期的に読みに行けばおk
>>410 orz
完全に見過ごしてました…
>>411 ありがとうございます。syslogも含めていろいろ検討したいと思います。
if(isset($a)){ print "SET"; } else{ print "UNSET"; } みたいなことやりたいんだけどどうすんのよ
isSet($a)->printCheckString() ; とでもなさればよろしいんではないでしょうかと提案いたしましょうか?
>>413 if(defined($a) and $a){ print "SET"; }
else{ print "UNSET"; }
そもそもPHPのisset知らなかったんで間違ってるかも
>>415 ありがとう。 and $a は別にいらんかった。 ありがとう。
>>390 意味が分かりません。解説しておくんなましぃ。
>>413 my $str = 'foo';
print defined $str ? 'SET' : 'UNSET';
$aと$bは恐ろしい事にsortで使われる特殊変数だから、避けた方がいい。
相当気を配る必要があるな
この $a と $b は普段使うなって言う奴が必ずいるけど、根拠あるの? 実際に sort とからんでまずいことになるケースって具体的にどんな時?
どうせ$aと$bって$a <=> $bか$a cmp $bでしか使わないよな 複雑になっても、$hash{$array[$a]} <=> $hash{$array[$b]} とかになるだけで 代表項とソート順だけ指定する方がよっぽどスマート
一種の戒めじゃあないのかねこりゃ $aや$bなんて安直な変数名つくんなよアホ!! ってな、ありがたーいお言葉の表れだよ
>>421 use Data::Dumper;
my $a = +{ num => 2 };
my $b = +{ num => 1 };
my @array = ($a, $b);
#
# あれやこれや長々と書いてて$aと$b宣言したの忘れてる
#
print Dumper sort {$a->{num} cmp $b->{num}} @array;
__END__
use diagnostics;
しておけば詳しいエラーが得られる。
コードが整然としてればまず問題ないけど、そんな機会はまれでなぁ・・・
>>424 use strict; つけときゃエラーで弾かれるな。
>>425 違った。use strict; つけてなくてもエラー出るわ。
>>425 >>426 ほんとに?
うちの環境だと両方出ないから、やっぱ気をつけた方がいいんじゃない?
>>427 Can't use "my $a" in sort comparison at test.pl line 12.
だって。line 12は「print Dumper ...」の行。perlは5.10.1 (cygwin)
>>428 あぁそれは出る。
でもuse strictされてなくてグローバル変数あっちゃこっちゃ飛び交ってたり
変数名が変数からモリモリ作られてたら、頭抱えるだろ。
「テストもねぇ仕様もねぇ……とりあえず$aに結果入れてダンプ取るか」
で前任者が$aほったらかし。
考えたくも無いけど、今俺の目の前でそんなコードがのたうち回ってる。
モジュール作る時日本じゃModule::Setupが幅きかせてるけど、Dist::Zillaってどう? 誰か使ってる人居る?
Dist:: じゃなくて God:: だったら使ったカモナー
use strict; use warnings; my $unko{chinko}=1; これがエラーになるのですが、どうしてでしょうか syntax error at line 2, near "$unko{chinko" Execution aborted due to compilation errors.
>>433 エラーにならない書き方 ならわかるが
どうしてエラーになるのか は処理系内部の話になるんで中途半端な習熟レベルの俺にはちょっとわからない
>>434 すぐ答えるのも勉強にならない。
その変数が何かわかって使ってるのか?
どこで手に入れた知恵だ?
>>433 my $hoge[0]=1; #syntax error
と同じことじゃないの?
$unko{'chinko'}=1; print $unko{'chinko'},"\n"; これはなぜかエラーにならない myをつけるとエラーになる なんでだろう
myはスカラー変数だったらスカラー変数に my $hoge; 配列だったら配列に my @array; こうはだめ→my $array[0] = 1; ハッシュだったらハッシュにつけろってこと my %hash; こうはだめ→my $hash{'key'} = 1;
>>433 myは変数そのものをローカル化できるけど、配列とかの一部のローカル化はできない。
前者がやりたいなら
my %unko;
$unko{chinko} = 1;
後者がやりたいなら
local $unko{chinko} = 1;
ちなみにmyとlocalは他にも微妙に違いがあるから、普段はmyを使うべし。
質問者じゃないけど、perl初学者の俺には勉強になった。
なお宣言と一部初期化を同時にやりたい場合は my %unko = (chinko => 1, manko => 2); など。 my %unko = {chinko => 1, manko => 2}; ではないので注意。
445 :
433 :2012/04/03(火) 15:21:13.77
すごくためになった うんこちんこ連呼させてごめんね
use strict; use warnings; my %unko = ( chinko=>"manko" ); print $unko{chinko},"\n"; エラーがなくなった! たぶん理解できた。ありがとう。
〜うんこちんこまんこで覚える〜 Perlプログラミング
最後に真珠がきてるのがミソだな
ミソだと最後がうんこになっちまうだろ
>>438 perly.y を見れば
>>437 が正しいことが分かるよ!
myterm (Things that can be "my"'d) の定義ね。
>>424 のリファレンス宣言に付いてる先頭の + ってなんでしたっけ
昔見た覚えはあるけど思い出せないので教えてください
>>451 ぶっちゃけて言うと「これはサブルーチンじゃなくてハッシュ(へのリファレンス)だよ」とするためのおまじない
これがついてないとエラーになる場合もあり
>>452 無名サブルーチン sub {} の sub が省略されてるとみなされる場合があるって話でしたっけ
みなされるケースが思い出せないけどどうもありがとう
サブルーチンじゃなくて、ブロックだ
>>453 perlは"{...}"で表現できることが多すぎる。
プロトタイプ宣言でサブルーチンの引数がCODEへのリファレンスであると指示されている場合、
"sub"の表記がなくてもサブルーチンとして解釈される。Try::Tiny然り。
不用意なバグを埋めこまないよう、その部分を見ただけではBLOCKかHASHREFか判断つかないような場合
+{...}と表記してハッシュであることを明示する人は多い。
perldocにはBLOCKの場合に{;...}として表記する、なんてもあるけど、こっちはあまり見かけないと思う。
どちらかというとBLOCK内でreturnを省略せずに書いたほうが見た目に受けがいいらしい。
+{...} という言語外の表現でハッシュを示すのは Javaのようにクソ長い言語的表現でそれがハッシュであると示すよりも もっと効果的だと思う 記号の形状から判断するところ、perlでは自然言語外での記号からの想起や表象を 上手く使っている
> perlでは自然言語外での記号からの想起や表象を > 上手く使っている 例えば?
ヤダヤダ演算子のことか・・・!
ハッシュと配列を区別しちゃったことは失敗だと思う
括弧記号が() [] {}くらいしか無いのが諸悪の根源か 多バイト文字圏で開発されていれば【】『』《》なども使い分け出来たろうに
>>460 それぞれが具体的にどういう意味かすんなり理解できるならいいけどね
あんたも含めて
《花束も買ってあったりして》
日本人の開発したRubyがそうなってねえじゃねーかよ!!1
(・ω・) 実際こうかければ簡単だよな
(@益@ .:;)ノシ
AAで表現する
AAになるプログラムってあるのかな
つか記号使う理由有るの? たとえばハッシュなら%dataとかせずに、 hDataってやればいいだけではないのか?
ハンガリーにお帰りください
でもさ、ハンガリーと何が違うの?
やっぱりそうなのか。勉強になりました。
不満ならRubyのように自分で新言語作ってみたら?
シジルを使うのはネームスペースを確保するため、かな。 バージョン上がってキーワードと変数名がバッティングでもして コンパイル通らないとかなったら泣ける。
だとすると & はなんで省略してよくなったのかが説明を要する。 ちょっと納得できない。
ラクダ本の第4版って3版とだいぶ違う?
sub if とかふつうに定義できるし、使えるから、いいんじゃないの。
質問です。 下記をそれぞれ実行したときに、 while (1) { #改行されない。 print "\n", last; } while (1) { #改行される print ("\n"), last; } となったのですが、それは何故でしょうか? 自分の予想では、どちらも改行後、ループを抜けると思っていたのですが。 お手数おかけしますが、よろしくお願いします。
>>477 >>478 自分がコントロールできる範囲かどうかがポイントなんじゃないの?
アンパサンド無しで括弧も無しの裸のサブルーチン呼び出しはあらかじめそれが定義されている場合にだけ有効。
他人と同じスコープ共有してて変数名がバッティングするようなら
単にチームのコミュニケーションが不足してるか
安易にスコープ切れないマズいプログラムのせいだろ。
これは言語の設計とは関係ない。
例えばもしList::Util::shuffleがデフォルトになって変数にシジルがついてないと結果が変わってしまう。
use strict;
use warnings;
use List::Util qw/shuffle/;
my @shuffle = qw/0 93 2 3 5 6 2 1 8/;
print 'キーワードになるなんて聞いてないです' unless shuffle;
print "\n", last; は print("\n", last); と一緒
>>483 解答ありがとうございます。
といっても、まだよくわかっていないです。
例えば、
print ("1", "2");
とすれば、
「12」と表示されますよね。
printは、制御文が優先的に処理されるということでしょうか?
print (3+5, 10+2, "hoge");だとまず 3+5が評価され8, 10+2が評価され12 "hoge"が評価され"hoge" それら2つがprintにわたって812hogeが出力される。 括弧で囲まれた中の引数が評価されてから出力、と言う流れになる。 print ("\n", "hoge", last);の場合も同じく中の引数がまず評価されていく。 "\n"が評価され"\n" "hoge"が評価され"hoge" 次にlastが評価されるがこれは残りの処理を飛ばし、while自体から脱出する効果を持つので printはされない。 print ("\n", "hoge"), last;は print("\n", "hoge"); last; と殆ど同じ。 なのでprintが行われ、次にlastが行われる。 セミコロンで区切る場合とカンマで区切る場合の違いは代入の時の挙動。 カンマで区切ると左から順番に評価されて行って一番右の値が代入される。 my $i = 3+5, 10+2; print $i; #=> 8が出力される。
>>485 回答ありがとうございます。
>次にlastが評価されるがこれは残りの処理を飛ばし、while自体から脱出する効果を持つので
>printはされない。
なるほど、てっきり「last」の前の文が評価されていないと思い込んでいました。
評価はされるが、printされる前にループを抜けてしまうんですね。
勉強になりました。ありがとうございます。
>左から順番に評価されて行って一番右の値が代入される。
右の値ではなく、左の値の間違いでしょうか? (一応確認です)
>>479 >ラクダ本の第4版って3版とだいぶ違う?
なんとも言えない。基本的には追記されているわけだけど。。。
ばっさりとやってしまった部分もある。
バージョン間の互換性のことを意識し始めた様子はうかがえる。
>>486 > my $i = 3+5, 10+2;
> print $i; #=> 8が出力される。
カンマ演算子は代入演算子より結合順位が低いので、上記を冗長に書くと (my $i = 3+5), 10+2; になる。
当然$iには3+5が代入されるから8になる。
ちなみに my $i = (3+5, 10+2); って括弧でくくると、今度はリスト(〜)をスカラーコンテキストで評価することになるから
その場合は最後の要素が返るので $i には10+2が代入されるよ。
話は変わって Perlgolf Historyネタなのですが、「10桁ゼロフィルで出力する wc -l コマンドを作れ」というお題で、最短コードが
#perl -p
}{$_=$.+1e9.$/^v1
らしいのですが、最後の $/^v1 ってのがどうにも理解できず。
$/はデフォルト値が"\n(0x0a)"で、v1とxorしているらしいけど、v1って何なのかがさっぱり...
489 :
訂正 :2012/04/08(日) 19:00:03.77
> 上記を冗長に書くと (my $i = 3+5), 10+2; 正しくは my ($i = 3+5), 10+2; myのスコープ範囲はずれて消えちゃってました
490 :
再訂正 :2012/04/08(日) 19:01:42.36
my $i; ($i = 3+5), 10+2; 何度もスマン 言いたいことは上記
$_ = (($. + 1e9) . "\n") ^ "1"
あ、"1" じゃなくて "\1" ね
}{ は何?
perl -pe 'print 1' ↓ while ($_ = <>) { print 1 } perl -pe '}{ print 1' ↓ while ($_ = <>) { }{ print 1 }
496 :
488 :2012/04/08(日) 21:17:56.82
>>495 ナルホド…、thx
でもwhileのループボディーを空{ }にするのは何のためだろ。
行数だけを数え上げるために行を読み捨てていくためでおk?
foreachの最適化の副作用を利用して↓でも良い気がするけど… (0fill処理は略) #perl 1 for <>; say $.
>>498 間違えた、オレ494,497だた。
10桁ゼロフィルは$#を設定するだけで出来ないものかな…
オレはこれでいいや $#="%010g";1 for<>;say $.
あー
>>495 はちょっと不適切だったな。
-p と }{ を使うことのメリットはその短さと、$_ の内容が最後に print されること。
具体的にどうしてそうなるかは自分で -MO=Deparse とかして見てくれ。
あとは単純に
()=<>;print$.+1e9.$/^v1
とかよりも、-p をつけて
}{$_=$.+1e9.$/^v1
とするほうが短い(shebangやスイッチをどう数えるルールか知らんが)ので勝利ってことでしょう。
ちなみに say は最短でも use 5.01; とかしないと使えない(ワンライナー以外で -E は不可)のでゴルフではまず役に立たない。
>>502 すごいな・・もはや顔文字にしか見えない ^v1
use 5.010;
だから言ってんじゃねーかよ perlは自然言語の単語以外の表現で 意味を表してるって
perlに限らずともコンピュータ言語はみな人工言語なわけで...
while(<>) と while(System.in.read) どっちが良いんだよwww ダイヤモンドのかたちで標準入力だって意味をくみ取ってるんだろwww 人工言語とかの話じゃねーからさ、 アホちゃんww
どっちが良いかって聞かれたら後者かなー。
}{ こういった記号はその意味を調べるのが大変だから勘弁してほしいよなあ。 perlはこんなのが多すぎ。
>>508 <> がシェルの $ foo < bar > baz にちなんでるかもしれないってことか
Perl知ってからいい加減経つけど全然気づかなかった
>>511 だがしかしそれがいい。一回わかってしまえば便利だし
だらだら書かなくちゃいけないのなんて入力補助ないと無理
そう。だらだら書かなくていいのがPerlの美点であり利点なんだ。
>>509 みたいのはPerl向きじゃない頭なんだろうね。
もっと自分に合った言語を探した方がいいね。
while (line = System.in.Read) ならいいけど while (System.in.Read) はやだな。中途半端すぎる
<>が嫌ならreadlineを使えばいいじゃない。 print while readline;
>>510 それは裏技的に使ってるだけで、普通は使わないだろ。
IOCCCのプログラムを見て、C言語をdisってるようなもの。
while ブロックの終りの } と新規ブロックの始まりの { を新たに 挿入しただけだから、}{ で調べようがある訳ない。 perldoc perlrun で -p とか -n の項を読めば 「あんたのプログラムはここに来る」って明言されてる。 具体的に書くと、-p の場合概要は、 while(<>){ # あんたのプログラムはここに来る } continue { print $_ ; } だから、 perl -pe ' } N:{ $_=$.+1e9.$/^v1' (便宜上 N: ラベル付き)とすると、 そのまま解釈されて、 while(<>){ } # <- おいらのプログラムはここに来た N: { # <- $_=$.+1e9.$/^v1 ; # <- } continue { print $_ ; } 結果、 continue ブロック無しの while ブロックと continue ブロック付き N ラベルのブロック が書かれていると判断される。それだけの話。 perldoc perlrun まで辿り付けないのなら御愁傷様。
>>513 自前のサーバ運用や学問でやるならともかく、
開発環境を自分で決められるシーンってそんなに多くないんだよなw
>>518 「貴様がメモ帳以外のエディタをインストールしたせいで社内にウイルスがうんたらかんたら」
コーディングスタイルは合わせるからエディタぐらいは好きなの使わせてほしい。
ブラウザ上で動くエディタがあればいいのでは
jslinux? つくりゃつくれそうだな。
ハッシュベースのオブジェクトの属性を変更したときなどにフックすることってできるでしょうか。 $obj->{foo} = 'foo'; とアクセサを使わず代入したときに↓のようなメソッドを呼び出すイメージです sub {}= { my ($self,$key,$value) = @_; $self->{$key} = ucfirst $value; } 無理矢理考えてみたのは以下のようなtieを使った実装ですが・・・ package Test; sub new { my ($class) = @_; tie my(%tied), 'MyTie'; bless \%tied, $class; } package MyTie; use Tie::Hash; use base qw(Tie::StdHash); sub TIEHASH { bless {}, shift } sub STORE { my ($self,$key,$value) = @_; $self->{$key} = ucfirst $value; } package main; my $obj = Test->new; $obj->{foo} = 'foo'; #=>'Foo' インスタンスにblessしたタイ変数(ハッシュ)に別のハッシュにblessされたオブジェクトがtieされてるので なんか余分なオマケがくっついて来ている感じが否めません。 逆に、オブジェクトにblessしたオブジェクトと同義と考えるとつじつま合ってる気も。 どうでしょうか。
DBIを使用しています。 同じフィールド名が多いのですが、表結合する際に同じ名前が上書きされないようにするいい方法はないでしょうか? いちいち〜AS〜とか書くのは面倒なので、自動でテーブル名で修飾する方法とかあれば助かるのですが。
>>523 package _Test;
use Tie::Hash;
use base 'Tie::StdHash';
sub new {
my ($class) = @_;
tie my %hash, $class;
return bless \%hash, $class;
}
sub STORE { $_[0]->{$_[1]} = ucfirst $_[2] }
オブジェクト指向Perlマスターコースに載ってるやり方だけど、
適切かどうかはわからない。
tie my (%hash), $class; 警告が出るから、こうか。
>>525 ありがとうございます。
実は同じ実装を当初考えてみたのですが、同じTestインスタンスが2つ存在する形になることから
機能を分離して、公開されたメソッドを備えたTestオブジェクトと、
tieに特化したオブジェクトに分けようと考えた次第です。
でも、同じような実装例が信頼できる書籍に載っているというのは大変参考になります。
当面
>>523 の路線で進めてみようと思います。
>>524 なにか抽象化のためのライブラリを使用することになんだろうけど、
コードがガラッと変わってしまったり、joinするようなコードでは結局
別名指定のSQL断片などを書くようなことになりがちじゃないだろうか。
個人的には自前での別名定義に慣れた方がいいような気がする。
あと別の考え方では、joinせずそれぞれのテーブルに対して複数のクエリを実行してってゆうのも案外珍しくないよ。
なんだかんだテーブル結合はコスト高で、えてしてインデクスがうまく使われなかったりってこともあるから、
結合クエリより効率がいい場合も少なくない。
コードが単純になる場合もあるし、逆に多少の面倒が増える場合もあるけど、
ORMに慣れてたりすると発想自体はさほど抵抗ないんじゃないかな。
>>528 ありがとうございます。
考えさせられることが多く大変勉強になります。
530 :
デフォルトの名無しさん :2012/04/12(木) 02:30:47.13
disp.cgiは print "<TABLE>"; print "<TR><TD>$title</TD></TR>"; print "<TR><TD>$honbun</TD></TR>"; print "</TABLE>"; のようになっておりますが これをHTML形式にするには make_html.cgiで open(OUT,">test.html"); print OUT "<TABLE>"; print OUT "<TR><TD>$title</TD></TR>"; print OUT "<TR><TD>$honbun</TD></TR>"; print OUT "</TABLE>"; close(OUT); としなければならないのでdisp.cgiのデザインを変える場合make_html.cgiもまた 作り直さなければならない手間がかかるわけですが disp.cgiを変更しても、make_html.cgiを変更しなくてもいい方法はないんでしょうか?
print する前に close STDOUT; open STDOUT, ">poo.html"; とか書く
それは1引数selectでよくねと思ったがHTML::Templateを使う
533 :
デフォルトの名無しさん :2012/04/12(木) 03:47:51.91
setter/getter を実装するのに、個別にせこせこ書く代わりに 一括指定する方法って何かありますか? use Rubyish::Attribute; して attr_accessor を使えばその通りなんですけど、 あまりにもそのまんまなので…。
Class::Accessor系 Moose系
/じゃない記号で正規表現したいんだけど、どうすりゃいいの?
s|(\d+?)|$1\t|; とかすりゃあイイんじゃねーでしょうか
>>537 print "unko\n" if( "chinko" =~ /n/ );
はちゃんとunko出るけど
print "unko\n" if( "chinko" =~ |n| );
はunkoが出ないです。
くせえ
m|| の他に m{} m[] m<> m() m!! m"" m## m$$ m%% m'' m-- m== m.. m,, m^^ m~~ m\\ m?? m%% m`` なども使えるぞ
543 :
デフォルトの名無しさん :2012/04/12(木) 17:55:52.36
ファイルハンドルを引数として渡すにはどうしたらいいんですか? open(OUT,">test.dat"); &test(OUT,"テストです"); close(OUT); sub test{ my($handoru,$str) = @_; print $handoru $str; } これでいいんでしょうか?
545 :
デフォルトの名無しさん :2012/04/12(木) 19:11:59.39
>>530 変数に貯めといてまとめてから書き出せよ
>>543 おkです
ほんの少しだけ今風にするならこんなところかな
----------
open(my $out,">test.dat");
test($out,"テストです");
close($out);
sub test{
my($handoru,$str) = @_;
print $handoru $str;
}
----------
# ↑のコードでtestの定義内に「print ref($out)」を書くと「GLOB」と表示される
# myなのにサブルーチン内から参照できるんだ…って自分なんか勘違いしてるのかな?
# ちなみにsub test{}を最初に書くと「GLOB」は出てこない
あと
>>543 も
>>530 もそうだけど
「ファイルハンドルにはOUTとかのベアワードを使え」って今時Perlの参考書に書いてあるものなのかな?
>>543 *OUT
>>546 今風にすると言いながら3引数openにしてないのが半端
あとおまえはレキシカルスコープを根本的に理解していない
549 :
546 :2012/04/12(木) 19:54:08.51
>>548 全ておっしゃるとおりです
ありがとう教官
いつものことだが、まともな回答示せないのにあげ足だけとる奴がいるね
551 :
デフォルトの名無しさん :2012/04/12(木) 20:07:15.09
このようにすれば 普通の表示とHTML化両方できる sub print2{ my(*filehandoru,$str)=@_; if(*filehandoru eq ""){ print "$str"; } else{ print *filehandoru $str; } }
handoru()
被ってるのを承知で。 strict 通らんのに OK なんて答えるなよ。 ×&test(OUT,"テストです"); &test(\*OUT,"テストです");
>>549 そのへんは「型グロブ」っていう、太古の昔の仕様を引きずってるからね
*FH 周りで苦しむよりも、大人しく use IO::File; を使うことを勧めるよ
詳しくはEffective Perlって本を買うといい
>>543 Effective perl (p113-114) より。
見ての通り、Perl4時代の遺物だけど、どうしても生のファイルハンドル使いたいなら。
この本を買ってバッドノウハウを得るか、あるいはPerl以外の言語に乗り換えることを勧めるよ。
-------------------------
sub funct{
local *FH = shift;
print FH "Hello";
}
open FILE, ">foo.txt;
&funct *FILE;
Effective Perl には、&funct *FILE{IO}; して、my $fh = shift; するって 方法も乗ってるけど、そこまではやめてくれって感じ。 IO::File; 一択だね。
#って、行頭と正規表現と文字列とコメント以外で使う事ってあるの?
my @array; my $n = $#array; 数学的には、#は集合の位数(元の個数)を表す それの流用だろな
ラリー・ウォールさんなんでそんな事知ってるの
そりゃあmapなんていうスペシャルな仕組みを仕込む人だ 知ってんじゃねーの? 集合AからBへの写像(mapping) f:A→B があるとき、 それをperlでそのまま書けばこうだもん @B = map {f($_)} @A;
$#array は the # of the last index じゃないの 数学とかしらないけど the # of と書いて the number of と読ませるのわりとよく普通の英文で見かける
KshやBashだと${#array[*]}で要素数が取れるから、その流れじゃないだろうか。
100% ・・・ ひゃくパーセント と読むだろ? #1 ・・・ ナンバーワン と読むだろ?
#(ナンバーサイン)を一体何の記号だと思ってるの?
半音上げる記号
ンだから そのナンバーサインはいつ出来た なんでそんな形になった っちゅー話だよ
スレチレス
答えられない低能は都合よくスレチとか持ち出すよな
>>568 オメーだよアフォ
さっさと答えろks
自分で答えられないくせに偉そうだよなぷ
と答えられない奴が言っています
オイオイ 低能ほどよくよくキャンキャン吠えるよな さっさと答えろks
Perl文法ならLarryに聞けよ。 ナンバーサインの成り立ちならスレ違い。
常識で押し切ろうとするアホが居るから 話がややこしくなるんだよ さっさと答えろよks スレチとかほざいてるのも 答えられないから口をつぐみましょうてな 無能だろ
はぁ? 子供が、お父さんナンバーワン!っていうときに #1 DADっていうだろ。 小さい子供でも知っているナンバーの記号を ナンバーに使うのは当たり前だろ。
まだそういうクソをうんぬん言ってるのか さっさと答えろよ お前はそういうやりとりも理解できない低能かよ ks
どうしてナンバーサインはああいう形に なったかを知りたいの? 最初に作った人に聞けよ。 コンピュータが出来るよりも前の話だ。
例えばドル記号はなんでSに縦線が入った形をしているのか? なぜナンバー記号は、あんな形をしているのか? 文字と記号の歴史について調べればよい。
だから
>>564 とか
>>565 とかの
何も考えてないし何も知らない低能の相手すんのは疲れんだよ
#にナンバーの意味が出来たのは
数学とかで使われ出してからとかだったら
ハナシが逆になるだろ
それも分からんのか
マジでアホしかいねーのか ここ
>>580 numberって単語が長いから
#って記号ができただけの話だろ。
>>581 オメーは話が分かってない低能だな
口はさむなks
>>582 ようやくデキのいい答えがきたじゃん。
いいよ上出来だよお前。
俺なら答案に95点つけてやるよ。
584 :
582 :2012/04/13(金) 23:55:11.70
>>583 あ、そんなことも分からなかったんだ?
記号ってのはそういうものなんだよ。
>>584 笑わせんなよwww
さっさとあと5点分埋めろよwww
期待してんゾw
>>585 じゃあ代わりにお前が$はドル記号なのかを答えてみ。
俺が95点だ。さてお前は俺を超えられるかな?
久々の忍者降臨?
無知の知だよバーカw 俺は知らねーからてめぇらが答えてればいいんだよw
知らないのに点数をつけられるとはこれイカに
じゃあ0点だな。 いくら開き直ってテストで知らないと書いたところで 点数はもらえない。
なんということだ、ここは試験場だったのかー
> 俺なら答案に95点つけてやるよ。 答案らしいよw
いい加減他でやれ
#をナンバーと呼ぶようになった由来を言わないのが悪い
>>594 コンピュータと関係ない。
大昔に誰かが決めたこと。
つまり日本が悪い
>>597 リンク先に「罠」なんてどこにも書いてないぜー。
I --- いち(一) II --- に(二) III --- さん(三) X --- じゅう(十) # --- なんばー(井) これって万国共通なんだな、5点。
そういえばLarryは漢字もできるんだっけ、努力家なんだな、100点。
601 :
デフォルトの名無しさん :2012/04/14(土) 18:26:51.90
>>564 ナンバーワンになれなくてもいい元々特別なおんりーわん
なんでその書き込みしたの?
601だからだろ
リファレンス使っての多次元難しい 慣れればすらすらとなんとかなるのか
$$リストリファレンス名[][][][]… または $リストリファレンス名->[][][][]… こういふののこと? あちきは perlref perlreftut を読んで ${$リストリファレンス名}[][][][]… の{}を省略した記法が $$リストリファレンス名[][][][]… で、また、 $リストリファレンス名->[]->[]->[]->[]… の][の間の->は省略できるため $リストリファレンス名->[][][][]… でよいと理解して、身につけた(つもりw)。
一瞬伏字だらけ文字化けだらけの 発禁カキコかと思ったYO
文字列内に5回以上ある一文字が含まれていたら、5回目の一文字含め、それ以降の文字列を削除、 という動作をさせたいのですが、どう記述したらいいんでしょうか?
1 23 4 5 aaababbaababaanaaa 1 23 4 aaababbaaba
>>608 「ある一文字」というのが「任意の文字」ではなく下記の'A'のようにあらかじめ指定されるならばこうかなぁ
my $c = 'A'; # 5回以上登場するかどうか調べる文字
my $test_str = 'abcAAA012AAAAdefAAAAA3456AAAAA789abAAAAAAcdefg';
$test_str =~ s/^(.*?$c{4})$c.*$/$1/;
print $test_str . "\n";
$test_str = 'abcAAA012AAAAdefAAAA3456AAAA789abAAAAcdefg';
$test_str =~ s/^(.*?$c{4})$c.*$/$1/;
print $test_str . "\n";
実行例
$ perl p_char5.pl
abcAAA012AAAAdefAAAA
abcAAA012AAAAdefAAAA3456AAAA789abAAAAcdefg
「任意の文字」に対応させる場合、どうすんだろ…
もっと良いやり方知っている人がいたらレスどうぞです
ごめん、意味取り違えた
>>610 は5回以上「連続して登場した」場合のマッチングだった。
スマソ
> 5回以上ある一文字が含まれていたら ってのはそういうことかね? それとも何かもっと別の壮大で長大で深遠で 常人には及びもつかないロジックなのかね?
「ある一文字」というのが「任意の文字」ではなく
>>609 の'b'のようにあらかじめ指定されるならばこうかなぁ
my $c = 'b'; # 5回以上登場するかどうか調べる文字
my $str1 = 'aaababbaababaanaaa';
$str1 =~ s/^(([^$c]*$c[^$c]*){4})$c.*$/$1/;
print $str1 . "\n";
実行例
$ perl p_char5_.pl
aaababbaaba
間違っていたらゴメンチャイ
'b'とか決めず任意の文字の5回以上の登場に対応させるには後方参照使ってもムツカシイ感じ。
splitでバラしてlist処理に持ち込んだ方ががいっそ楽かも
もっと良いやり方知っている人がいたらレスどうぞです
if ($str =~ /^((?:.*?b){4}.*?)b/){ $str = $1; } とか my $cnt = 0; while($str =~ /b/g){ $cnt++; if ($cnt == 5){ $str = $`; last; } }
任意の文字が5回以上現れたら、その5回目の文字以降右をtrimするのはこうかな… my $str = 'Animals are happy so long as they have health and enough to eat.'; my @elm = split '',$str; my (%cnt, @seq); $cnt{$_} = 0 for @elm; for (@elm) { last if 5 <= ++$cnt{$_}; push @seq, $_ } my $str2 = join '',@seq; print "`$str2'\n"; 実行例 $ perl p_char5.pl `Animals are happy so long' この例の場合、5個目のspace文字' 'から右か切り捨てられる。 さて寝るか…ノシ
fastq の LQ trim の宿題?
% perl -le 'print @{[ ( split /(b)/, $ARGV[0]), (q{}) x 9]}[0..8]' 'aaababbaababaanaaa' aaababbaaba
$_ = 'AAAABBBBBCCCCCC'; print $_, "\n"; s/((.)\2\2\2)\2.*$/$1.../; print $_, "\n";
パ・パ・パパッパ〜Perlライス
...はいらないの
JAなんとかか?
622 :
デフォルトの名無しさん :2012/04/15(日) 21:33:17.22
DBD::Pgモジュールをインストールしようとしたら ぐぐってもperl5.8でのインストール解説しか見当たらず、 5.8にダウングレードしたいのですが perl5.8って何処で入手すればいいんですか
超発想すぎてついていけない
>>622 ぐぐらずoreillyの本を買って学ぶ
>>624 とか言うと絶対にラクダ本初版とか買ってくるんだよな
PostgeSQLに付いてくるDBD::Pgを使うかDBD::PgPPを使うといい
628 :
デフォルトの名無しさん :2012/04/16(月) 14:25:01.73
みんながPHP&WordPressに走るのでPerlを勉強しようと思うのだが需要はあるかな。
もうちょい訳書だしてくれると、買うかは別として なんとなくテンション上がるんだけどな〜>オライリー すっかりスルーされてる感じなのがつまらんね。 ラクダは10年ぶりだし(たいして目新しくもないだろうけど)出してほしいところ。
訳書というか原書の時点であまり出てないんじゃない? Effective Perlが出てないけどあれはオライリーじゃなくてAWだし
while(1)のなかで改行しないprintだけを使うと処理が先に進まなくて、 改行するprintを混ぜると正常に動作するんですが、何か条件があるのでしょうか。 ActivePerl + Win7 + DOSで実行です。
それはひょっとして$|ですか?
たぶん行バファリングされてる 改行が出力されるかstdioのバッファが満タンになるまで出力されない
あ、表示されました。 存在を知りませんでした。ありがとうございました。
テキストの中から許可したHTMLタグだけそのままにして、残りは無効にするにはどういったやり方が最適でしょうか? 閉じタグの扱いや、fontのように内部にsizeやcolorなど複数の値が指定されていたり、なかなか厄介で泥臭い方法しか思いつきません。
636 :
デフォルトの名無しさん :2012/04/16(月) 17:58:07.24
ファイルハンドルがあるかどうかを判別するにはどうしたらいいんでしょうか? print2 "(<font color=\"#00ff00\">てすと</font>)"; #ファイルハンドルがない場合 open(OUT,">test.dat"); print2("<font color=\"#00ff00\">てすと</font>",OUT);#ファイルハンドルを渡す場合 close(OUT); sub print2{ local($str,*FH)=@_; if(FHがないの場合){ print "$str"; } esle{#FHがある場合 print FH $str; } }
バッファリングの質問が出てたので便乗させてください。 perlの出力をクライアント(JavaScript)でストリーミングに受け取るテストスクリプトを書いています。 perlでは、HTML5のServer-Sent Eventsのルールに則って、一度に次のようなチャンクを返します。 "event: message\n data: fired message event\n id: 1\n retry:1000\n \n " ↓コード(抜粋) my @data = ( {event=>'message',data=>'fired message event',id=>1,retry=>1000}, {...} ); sub output { my $data = shift; my $output = ''; while (my ($key, $value) = each %$data) { $output .= "$key: $value\n"; } print $output."\n"; } for my $d (@data) { output($d); sleep 3; } # 時間のかかる処理をシミュレートするためsleepを使用 改行のたび出力されてしまわないよう、ひとつの文字列にしてからprintしてるのですが、 できたらループ内では↓の擬似コードのように書きたいイメージです。 $buff->append("key: $value\n"); ... $buff->flush; あるいは print "key: $value\n"; ... STDOUT->flush; もっとも、通常はサーバ側のバッファリングも機能するため、この程度の分量だと サーバのバッファ分のスペースを末尾に追加する必要があるくらいの話なんですが、 perlの使いこなしというか、コード的にもっとうまい書き方があれば知りたいです。 (改行を含む文字列をバッファにためつつ、任意のタイミングでflushする)
わっかりにくい日本語だなーーー 「ループ」ってどれよアホちゃん
642 :
デフォルトの名無しさん :2012/04/17(火) 19:10:01.97
ロックディレクトリ$lock_file_pathに ディレクトリがないにもかかわらずF5を連打して連続リロードすると mkdir($lock_file_path,0755)が成功しない場合があります これはどうしてでしょうか? ディレクトリがある場合以外でmkdirの作成が失敗することはあるんですか?
なぜエラーメッセージを見ないのかす
644 :
639 :2012/04/17(火) 19:53:35.30
>>641 わざわざ貼っていただきありがとうございました。
バッファに相当するものをperlでという発想ですね。
あれから調べてたんですが、やはりバッファに直接指示するようなのはできないですよね。
javaやC#などのioではよくBufferd〜というようなクラスがあって、バッファを直接操作してる感覚でいたのですが、
中身はこうしたものなのかも?(考えたこともなかったorz
printflush()があってuseするとSTDOUTでも使えるようになるのも気づきませんでした。
これが可能なのであればあとの部分の実装はいかようにも、と感じます。
たいへん参考になりました。というか、この部分、まんま使わしていただきます〜m(_ _)m
646 :
デフォルトの名無しさん :2012/04/18(水) 09:43:49.35
642だけど原因がわかりました 連打するとロック解除の時ロックディレクトリを削除するプロセスが ロックフォルダを作成〜mkdirの間に割り込むため mkdirしようとしても上位ディレクトリがないので作成失敗ということでした
ロックフォルダを作成~mkdir って… 二段階のmkdirをやってるの? それそもそも設計がダメだわ。それじゃ排他制御できん。
648 :
デフォルトの名無しさん :2012/04/18(水) 10:19:03.17
だってmkdir1回じゃディレクトリ作れないじゃん 例えば$lock_file_path="./lock/log/thread_00001.lock";の場合 mkdir($lock_file_path)ではディレクトリが作成できない lockディレクトリを作って、logディレクトリを作ってthread_00001.lockディレクトリを作るという手順になる 3回mkdirしなければ作れないだろ
だから3回mkdirしなければいけないようなロックの設計の仕方がそもそも間違いだって言ってるんだよ
何故ロックのためにmkdirを使うかを知るべきだね
マジモンのアホだぞこいつwww
File::Pathを使えって話? 俺だったらロックディレクトリ用ディレクトリは削除しないか、 あるいはそもそもロックディレクトリをロックしたいファイルと同じパスに作るけどな
書いたあとで思ったけどFile::Pathにはアトミック性が無いな
654 :
デフォルトの名無しさん :2012/04/18(水) 12:28:42.13
>>649 windowsみたいにflockが使えない環境なら
mkdirしかないだろ
File::pathとかっていうのも内部では3回ディレクトリ作ってるんだろ?
Perlダサィ
>>656 File::Pathで3階層分のディレクトリをatomicには作れないだろ?
文字列から最初の&までと、その後を分割したいです。 ただし、""と''の記号に囲まれている&は除外したいです。 さらに""中の'と\"、''中の"と\'は囲む記号としては扱いません。 $str = q/test"xx&xx'x"xxx'xx&xx'xxxxx&yyyyy&zzz/; $str =~ /(.*?)&(.*)/; #ここをどう書けばいいのでしょうか? $1; #test"xx&xx'x"xxx'xx&xx'xxxxx $2; #yyyyy&zzz
>>658 #!/usr/bin/perl -w
use strict;
q/test"xx&xx'x"xxx'xx&xx'xxxxx&yyyyy&zzz/ =~ /^
( # 1
(?:
[^"&']+
| " (?:[^"]+|\\")* "
| ' (?:[^']+|\\')* '
)+
)
&
( # 2
.*
)
/xgs;
print "1:[$1]\n2:[$2]\n";
>>659-660 すごい…理解するのにちょっと時間がかかりました。
大変勉強になりました。
ありがとうございます。
>>654 今は、強制ロックになるけどflockは使える。
使えないのは98,ME辺りまで。
perl-mongers.org 繋がらなくなってる…
664 :
デフォルトの名無しさん :2012/04/19(木) 12:43:29.48
for(1...5){ sleep(1;) } print "5秒経ちました"; for(6...10){ sleep(1); } print "10秒経ちました"; これを実行すると10秒経った後に 5秒経ちましたと10秒経ちましたが同時に表示されるけどどうしてですか? 「5秒経ちました」が表示されてから5秒たって「10秒経ちました」を表示させることはできないのでしょうか?
666 :
デフォルトの名無しさん :2012/04/19(木) 17:59:46.37
サブルーチンの呼び出しは&をつけなければならないんですか? &をつけなくてもエラーにならなかったですけど それと引数を渡すときは( )は省略できないのですか?
まるでその答えを導くためにされたような質問だな
669 :
デフォルトの名無しさん :2012/04/19(木) 20:01:08.20
SHIらねーよww テメーのブラウザがリリパット症候群なんだろ Ctrlおちながらマウスホイル回せば大きくなるよ テイノーちゃん プ
html { font-size: 62.5%; ... 最小フォントサイズ設定してるから気づかんかったが なるほどこりゃ小さいな
こういう流れ好きだよ
ぼくも大好きです
>>670 いつもハリキッテるけどスルーされかたハンパないすね
ひでえサイトだな
676 :
デフォルトの名無しさん :2012/04/20(金) 01:22:34.32
PRINT("てすと");だとカッコがじゃまなので PRINT "てすと";としたいわけですがエラーになってしまいます カッコは必要なのでしょうか? sub PRINT{ print "@_"; }
>>670 みたいな白痴でも使えるんだから
やっぱりPerlは素晴らしい言語だわ
679 :
デフォルトの名無しさん :2012/04/20(金) 12:08:36.84
>>677 一応読んだけど知りたい回答は書いてなかった
聞きたいことは
PRINT "てすと";
sub PRINT{
print "@_";
}
の場合はエラーになるけど順序を逆にして
sub PRINT{
print "@_";
}
PRINT "てすと";
とするとエラーにならずちゃんと表示されるというのはどうしてかということです。
それと
test.plに
sub PRINT{
print "@_";
}
1;
を作り
test.cgiで
require "test.pl";
PRINT "てすと";
とするとエラーになってしまうのはどうしてかということです
681 :
デフォルトの名無しさん :2012/04/20(金) 12:24:42.40
>>680 インポートというのはrequire "test.pl";はインポートにはならないんですか?
マイルールでは 自作関数には括弧を付ける 組み込みは付けない その方が上級者ぽく見えるらしく 俺の株が上がった
http://perldoc.jp/docs/perl/5.10.0/perlsub.pod > サブルーチンを宣言するには:
sub NAME; # "先行" 宣言
> サブルーチンをインポートするには:
> use MODULE qw(NAME1 NAME2 NAME3);
# test.pl
# test.pl のファイルスコープ上での宣言と main::myprint() の定義
sub myprint { print "Args are @_\n" }
1;
# test.cgi
require 'test.pl'; # main::myprint() が使えるようになるが、
# test.cgi のファイルスコープ上では宣言もインポートもされていない
myprint('test1'); # 括弧付きならば宣言は不要
sub myprint; # test.cgi のファイルスコープ上での宣言
myprint 'test2'; # 宣言したので括弧を省略できる
なんでcgiなんだ?
◆やりたいこと 人に渡すスクリプト書いてるのですが、ある処理のとこに限っては utf8 を cp932 で出力する際に起こり得る dose not map cp932 の 出力を抑止したいと考えています。 ◆こうしてみた 思い付きで STDERR を閉じたら取り合えずは希望通りの動作になりました。 ◆質問 もし何らかのモジュールや何らかの設定で抑止可能であればそちらで dose not map 〜 の warning を抑止したいのですが、 close(STDERR); 以外で何か手段はあるのでしょうか?
別のクチを作るかな
すんません。 サクっとサンプルが見つかってしまいました m(_ _)m
open(my $devnull, '>/dev/null');
my $bakstderr = *STDERR;
*STDERR = $devnull;
〜STDERR あての出力を抑止したい処理〜
*STDERR = $bakstderr;
close($bakstderr);
これで出来ました。
サンプル見たあとだからと言うのもあるけど、
>>686 さんのはかなり的を射た助言でした。
ありがとうございました。
688 :
デフォルトの名無しさん :2012/04/20(金) 23:40:23.98
拡張子.cgiはPerlの拡張子ではないから違和感は感じるね Webプログラミングは別板ってのもあるし まあ昔は.cgi=Perl、みたいな風潮もあったし俺はツッコむほどじゃないと思うが
違和感ある? cgiは何のファイルの付ける拡張子なんだ? CGI(Common Gateway Interface)として みなせるものはすべて拡張子cgiで間違い無いだろ?
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板:
http://hibari.2ch.net/php/ )
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
ようは、ファイル名の拡張子をplに変えれば 純粋なperlになるということですよ。
拡張子なんてただの飾りです。ドザーにはそれがわからんのです。
また頭の悪い奴がきたなw Apacheの設定したことないのか? 拡張子でmime type定義するだろ。
>>695 単なる一アプリであるApacheが拡張子をどう扱おうが知ったことじゃございません
697 :
デフォルトの名無しさん :2012/04/21(土) 01:52:16.65
open(IN,"test.dat");のあとで タイムアウトエラーだったり鯖が落ちたりで close(IN);できなかった場合何か問題ありますか? ずっとファイルが開きっぱなしってことですか?
プロセスの終了とともにファイルハンドルは閉じられるよ
普通にPerlの質問なら、CGIとして動かす場合でもスレ的には問題ないんじゃないかと思ってみる。
アホみたいにレベル低い質問だけじゃなくて、Perlに関係ない質問もたくさん来るようになるから 初心者にもわかりやすいように、cgiと付く物は全部よそに言ってもらった方が平和
>>699 問題の切り分けができる人間なら、cgiでない問題として質問すれば良いだけのこと。
切り分けができてない時点で、webprog板逝きだ。
名前付きパラメータを渡すのに簡単のためCGI.pmを使っているが Perlの質問だから気にするなよ みたいな
CGIの質問箱に行ったら、Perlの質問はこっちのスレだと言われました。
質問を書くか、誘導元を書けよ
もう何がなんだか
たらい回し関数が発動中だな 素晴らしい 愛のバケツリレーだwww
708 :
デフォルトの名無しさん :2012/04/22(日) 13:09:04.52
perlで画像を表示するにはどのようなコードを書けばいいんでしょうか? 例えば<IMG SRC="access_count.pl">で画像を表示する場合です
エスパー試験3級問題
access_countというのがヒントだな
いや imgタグなのに /> で終わっていないのがヒントだろうw 相当に古い *何か* を参照してるぞコイツww
エスパーというかスルー検定4級問題かと…上の数十レスはなんだったのか
714 :
デフォルトの名無しさん :2012/04/22(日) 13:27:24.91
もういい 今調べて print "Content-type: image/jpeg\n\n"; とbinmode使うってわかったから
最初から調べろよksちゃんwww
\n\nじゃないよ。\r\nだよ。
そこらへんはNPHでなければWebサーバが面倒みてくれるよ
\n\nじゃないよ。\r\nじゃないよ。\r\n\r\nだよ。
いつのまにか HTML から HTTP の話に つーか、質問する手間と調べる手間ってそんなに違うんかな?
つーかここに書きこむ人は 検索より質問のコストの方が低い と思っているから 書き込むんだろう
俺はとりあえず質問を書いておいて 他の作業をする。 運が良ければ釣れてる程度の扱い。
そんなんじゃいつまでたってもスキル上がらんわな〜
てゆか2chしか頼るところがないと思ってる限りスキルが向上することはないよ
スキルとやらは数ヶ月使わないだけで消えうせるよな・・ 人間は勘以外蓄積しない生き物だ
どこかに書いてあって、どこに書いてあるのかなんとなく分かる ってのがあると覚えないよねw
726 :
デフォルトの名無しさん :2012/04/23(月) 01:24:58.79
アクセスカウンター作ってるのですが 画像カウンターの場合は<IMG SRC="access_count.pl">で呼び出せばいいのですが テキストカウンターの場合はどうやって呼び出すのでしょうか?
SSI
さーばの方に AddType image/jpeg .pl みたいな設定をすれば画像として表示できるんじゃね?
それはCGIだな
731 :
デフォルトの名無しさん :2012/04/23(月) 12:14:33.72
print "Content-type: image/jpeg\n\n"; open(IN,"img/img1.jpg"); binmode(IN); print <IN>; close(IN); これで画像を表示しようとするとファミコンでバグっだような画像になってしまってきれいに表示されません 何が原因なのでしょうか? 環境はwindows7、activeperl、ブラウザ(IE8)で実行です
733 :
デフォルトの名無しさん :2012/04/23(月) 12:43:20.50
このスレは上級者用なのか?
シラネーヨwww お前が回答できないなら少なくともお前は中級上級者ではないwww
735 :
デフォルトの名無しさん :2012/04/23(月) 12:54:23.62
それなら初心者用スレに誘導する意味ないじゃん
>>735 ここはPerl一般の質問を扱うスレ。
Web開発はWebProg板へ。
板のローカルルールで決まってる事だから。
ローカルルールの意味が分からない2ch初心者の方は、
半年ROMるか、初心者の質問板へどうぞ。
Perl初心者スレなのかWebProg板なのか
739 :
デフォルトの名無しさん :2012/04/23(月) 18:00:32.31
数字のn桁目の数字を調べるのはどうしたらいいんですか? 例えば36598の4桁目を調べて結果は6になるようにです
36598 =~ /\d*(\d)\d{3}/; print $1; print ((36598/(10**(4-1)))%10);
>>740 は
あまりに親切で懇切丁寧でとっても初心者向けだと思うw
my $num = 36598 ;
my $n = 4 ;
print "".(split // , reverse $num)[$n-1] ;
742 :
デフォルトの名無しさん :2012/04/23(月) 19:09:11.05
$suuzi=36598; $keta=4; $a=length($suuzi)-$keta; $kekka=substr($suuzi,$a,1); print "$kekka";
>>739 int($suuji / (10 ** ($n-1))) % 10
744 :
デフォルトの名無しさん :2012/04/23(月) 20:00:10.57
みんなちがって、みんないい
substr($suuji,-1 * $n + 1 , 1);
perl -Mbignum -e 'print 36598->digit(4-1);'
There is more than one way to do it.
743が一番見た目もわかりやすい割によさそうな気がする
正規表現、文字列演算は遅い。 数値は数値として計算するのが正解。
752 :
デフォルトの名無しさん :2012/04/24(火) 12:00:21.55
&img_disp("./img/1.gif"); で1.gifが表示されるけど これのあとのに &img_disp("./img/2.gif"); &img_disp("./img/3.gif"); としても1.gifしか表示されません、これはどうゆことでしょうか? 1つの画像しか表示できないってことですか? 2つ以上の画像を表示するにはどうしたらいいんですか? sub img_disp{ local(*IN); my($img_path)=@_; open(IN,$img_path); binmode(IN); binmode(STDOUT); print <IN>; close(IN); }
sub img_disp{ my $imgpath = shift; return if !$imgpath; if(open(my $imgfh, '<', $imgpath)){ my $imgbin; binmode $imgfh; read($imgfh, $imgbin, (-s $imgbin)); close($imgfh); binmode STDOUT; print $imgfh; } } 基本的には、呼び出す時に & は不要。
間違えた × read($imgfh, $imgbin, (-s $imgbin)); ○ read($imgfh, $imgbin, (-s $imgfh));
>>753 カッコがついたりつかなかったり、気まぐれデスネ
久しぶりにPerl忍者っぽいコードを見た。
758 :
デフォルトの名無しさん :2012/04/24(火) 14:49:19.29
>>752 CGIネタはすれ違いですよ。
プログラムが間違っているのでなければ、おそらく、imgタグ内でどの画像でも同じプログラム名で呼び出しているため、ブラウザのキャッシュが効いている。
>>752 コードを書くのに参考にした本・サイトを教えてください
761 :
デフォルトの名無しさん :2012/04/24(火) 17:47:57.87
762 :
デフォルトの名無しさん :2012/04/24(火) 17:50:43.15
表示できる画像は1つだけだよ だから複数の画像を連結して1つの画像にするプログラムが必要
763 :
752 :2012/04/24(火) 18:10:36.76
>>762 ああそうか、カウンタを作っているのか。勘違いした。
スレチだが、gifcat.plを使うとか。ていうか、今時カウンタを自作とかしないし。
gifcat.pl って10年以上ぶりに聞いたわ……
765 :
デフォルトの名無しさん :2012/04/24(火) 18:57:53.55
カウンタのレンタルはしたくないので自作がいい
Heavy.pm って、何をするモジュールですか?
perlをヘヴィにするモジュール 具体的には ・perlの動作を重くする ・負荷をかける ・レスポンスを緩慢にする など 不可視剣をしたいときに重宝する便利なモジュール
settimerの勉強をしています use Time::HiRes qw ( setitimer ITIMER_REAL time ); sub printunko { print "unko\n" }; $SIG{VTALRM} = 'printunko'; setitimer(ITIMER_REAL, 1, 1); while(<>){} というプログラムを動かすと、1秒後に「アラームクロック」と出力され とまってしまいます。 1秒おきに unko を出したいのですが、どうしたらよいでしょうか
1秒おきにunkoが出るようになりました 元ネタで ITIMER_VIRTUALだったのをREALにしたので、 VTALRMもあわせてALRMにする必要があったのですね
うんことflushをかけてるのか。高尚だな。 カウンタの件はネタだと思ってたのにマジっぽくなってきてて噴いたw
自分のサイト用のカウンターでなく、レンタルカウンターとかつくりたいんだけど、 どうやればいいのか参考になるページを教えてください
やること何も変わらなくね?
レンタルって課金したいの?
いま、課金しました。
完成前に課金すんなwww
>>739 もカウンタのネタだったんだな
CGIのアクセスカウンタ作成(レンタル設定も追加)に関するネタを
どこまで汎用的かつ高度な質問に変換できるか、というコンテストは
挑戦しがいがありそうな気はする
だが板違いなんだなこれが
>>767 って、ほんとう?
ググってもよくわからない
ウソはウソと見抜けない人は(掲示板を使うのは)難しい
780 :
デフォルトの名無しさん :2012/04/26(木) 00:23:25.12
正規表現で、改行コードを<br>タグに変換したい OSごとに、\n,\r,\r\nと3つあるそうですがそれぞれにうまいこと対処できる正規表現の記述の仕方を教えてください
(i) か (|) のどちらかを使う
>>781 おさないおまたと成熟したおまたみたいだな
784 :
デフォルトの名無しさん :2012/04/26(木) 01:38:50.37
>>771 おれが作るとしたら
ユーザーIDとパスワードでユーザー認識して
1つのユーザーは複数のカウンターを持てる
それらのカウンターの集まりにgroop名をつける
カウンター1つ1つにcounter_IDを持たせる
1カウンター1つ1つにどのリファラならカウントを加算するかを設定させる
例えば<IMG SRC="access_counter.pl?counter_groop=abcde&counter_ID=00001">
これによってどのgroopのどのカウンターを加算するのかできるようになる
s/(\r\n|\r|\n)/<br>/;
>>780 s{(\015\012|\015|\012)}{<br />}g;
>>784 ありがとう。結構複数個設置したいという需要あるんだね
group(s)な あと俺は<br />への変換如何に関わらず\rを除去するようにしてるな
>>778 不可視剣と書いてしまうような奴の言うことが
信用できるかどうかぐらい分かるだろ?w
フカしだな。
つーか 40時間も経ってるのに調べてないなんて 無能すぎる それにオマイラも教えてやれよwww
義務教育じゃねえんだよ 人様に質問なんかせず全部自分で調べろ
Heavy.pmはPythonのコードをPerlから呼べるようにエクスポートするモジュール Perlのビルド時に--emb-pythonを渡してコンパイルしないと使えない
じゃあ超ヒント ボクシングにはlite級やheavy級がある
単体のHeavy.pmを知らんから回答しようがない。 CPANにも無さそうだし。
<form action="../RealGraphView/Index.asp" method="post" id=form1 name="form1" target="_top"> <input type="hidden" name="SelectPoint" id="SelectPoint" value=""> </form> 上記をmechで記述したいのですが、どのようにしたら良いのでしょうか? submit か post モジュールでしょうか?
こんな風にするとよい。 print <<'END'; <form action="../RealGraphView/Index.asp" method="post" id=form1 name="form1" target="_top"> <input type="hidden" name="SelectPoint" id="SelectPoint" value=""> </form> END
800 :
デフォルトの名無しさん :2012/04/27(金) 21:32:58.69
perl hoge.pl で実行する時にhoge.plにオプション渡す方法教えて
perl hoge.pl foo bar boo で実行すると hoge.pl の中では @ARGV で foo bar boo が参照できるよ。
802 :
デフォルトの名無しさん :2012/04/27(金) 21:45:16.52
perl hoge.pl -a 1 ってやったらエラーになったけど おいらの勘違い?
>>802 スクリプトの内容とエラーメッセージください
>>802 ARGV の参照だけでエラーにはならんよ。
スクリプトが悪い。
805 :
デフォルトの名無しさん :2012/04/27(金) 22:17:31.24
文字列内の存在する改行(\r\n|\r|\n)の数がn回以下なら真、それより大きいなら偽 と正規表現で出来ませんか。 更に付け加えるとそれらの改行コードを置換しつつ回数の判定がしたいです
>>802 オメーの勘違い
print "$_\n" for @ARGV ;
そのクソスクリプトは全部すてて
まずは上のこれだけを書き込んで
perl hoge.pl -a 1
なり
hoge.pl -a 1
と成功を念じながら打ち込んで速やかに実行しろ
痴漢の戻り地。犯人は犯行現場に戻ってくる。
809 :
デフォルトの名無しさん :2012/04/27(金) 22:35:21.20
>>807 そもそも文字列内にn回「含まれてる」ってどうやって記述するんですか
$s =~ /((\r\n|\r|\n).*){0,5}/;
↑これでは出来ません
my $count = $str =~ /(\r\n|\r|\n)/g; $count++ if $count; または my $count = $str =~ /(\r\n|\r|\n)/g ? scalar(@_) : 0; 携帯から書いたから動作は分からん
いちばんテキトーに書きゃこーなる $cnt = $s =~ /(\r\n|\r|\n)/g;
書き直す my $check = $str =~ /(\r\n|\r|\n)/g ? (scalar(@_) < $n ? 1 : 0 ) : 1;
>>805 ((() = $s =~ /(\r\n|\r|\n)/g) <= $n);
($s =~ s/(\r\n|\r|\n)/('A`)タリー/g <= $n);
外部のperlスクリプトから出力を得る為、次のようなテストコードを書きました。 便宜上、1秒以上返ってこない場合には子プロセスをkillする処理を入れていますが、 せっかく別プロセスを起動しているからには、レスポンスが返ってくるまで他の処理をしたいと考えています。 # foo.pl 単に文字列を出力する ※ 実際はもっと時間のかかる処理です print "return from PID:$$, and '" . ucfirst($ARGV[0]) . "'"; # main.pl if ( my $pid = open my $reader, '-|', "perl foo.pl $arg" ) { eval { # time up signal handler - kill child process, and clear timer local $SIG{ALRM} = sub { kill 'KILL' => $pid; waitpid $pid, 0; alarm 0; }; alarm 1; # set time out, fire SIGALRM handler 1 sec after while (<$reader>) { print "$_\n"; } alarm 0; # clear timer }; close $reader; } スレッドを使ったコードも書いてみてるのですが、この程度なら(変数等の共有がない) もしかしてもっとシンプルな方法で足りるのではないかと思い ひとまず投稿させてもらいました。よろしくお願いします。
↑"待ってる間にしたい他の処理"を書いてませんが スレッド以外で可能だとしたら、どういうコードになるかわからないので・・・
>>815 waitpid($pid, WNOHANG)でループさせて、
その中でファイルハンドルをselectして、読み出し可能なら読み出す。
>>805 # split も正規表現、な
@line = split(/\r\n|\r|\n/,$_);
# 置き換えたいものでくっつける
$_ = join('<br />', @line);
# 落ち着いて数を数える
if(scalar(@line)-1 > 5){
$result = 1;
}
else{
$result = 0;
}
819 :
デフォルトの名無しさん :2012/04/28(土) 18:13:22.91
文字列1のどこの位置に文字列2が含まれていてもいいのではなく 文字列1の最初の位置から見て文字列2が含まれているかを調べるにはどうしたらいいんですか? $str1="abc/def/abc/def"; $str2="abc/def"; この場合は文字列1に文字列2が含まれているとする $str1="www/nnn/abc/def"; $str2="abc/def"; この場合は含まれていないとする if($str1=~/$str2/){ print "含まれいる"; } これだと文字列1のどの位置に文字列2が含まれていても 含まれているとされるのでだめです。
split は思いつかなかったw
サーカムフレックスなどお使いになられてはいかがでしょうか
アブフレックスなら知ってるけどサーカムフレックスっていうのは知らないですね
check ("abc/def/abc/def") ; check ("www/nnn/abc/def") ; sub check { my $str1 = shift ; my $str2="abc/def"; if ($str1=~/^$str2/){ print "含まれいる\t$str1\t$str2\n"; } else { print "含まれていない\t$str1\t$str2\n"; } } # 結果 # 含まれいる abc/def/abc/def abc/def # 含まれていない www/nnn/abc/def abc/def
Perl Cookbookのレシピ6.5 パターンにn番目にマッチする文字列を見つける 問題 3つ目のfishの直前の単語を取得したい。 解法 $WANT = 3; $count = 0; while (/(\w+)\s+fish\b/gi) { if (++$count == $WANT) { print "The third fish is a $1 one.\n"; # 注意:このループをlastで抜けてはならない } } このループをlastで抜けてはならないのは何故なんでしょうか?
827 :
デフォルトの名無しさん :2012/04/28(土) 19:50:36.54
>>827 シラネーヨkswwww
お前の言う汎用性とやらをちょっと説明してみろやwww
> 文字列1の最初の位置から見て文字列2が含まれているか
を満たすんだからいいだろアホwwww
でなきゃあもっとテメーが説明しろよクズwwww
プププププウwww
829 :
デフォルトの名無しさん :2012/04/28(土) 20:12:33.65
test1.plの中身 $aaa = 30000; 1; test2.plの中身 require "test1.pl"; print "$aaa"; 1; これだと30000が表示されますが test2.plの中身を require "test1.pl"; package www; print "$aaa"; 1; とすると$aaaが表示されません どうすれば表示できるんでしょうか?
requireしたときは、変数を直には呼びたくない きもちわるいから だから直せ my $bbb = &test1::getValueAAA(); # $aaa の値を取得 とかにしろ
言いたいことはわかるが果てしなく例がダサい
じゃあアンさんが ガイアがささやくようなカッコイイ例を 是非とも
>>825 正規表現の修飾子に /g を使っているから、whileを途中でlastすると
次の正規表現の処理が途中から始まってしまって分かりにくいバグになる。
それを防ぐため。レシピ6.5のお題とは直接関係がない。
836 :
825 :2012/04/28(土) 21:44:31.96
>>819 if(substr($str1,0,length($str2)) eq $str2){
print "含まれいる"
}
>>829 test1.plの中身
package www;
$aaa = 30000;
1;
数百行前後の小さいスクリプトなら暗黙も良いだろうけど、 use してインポートするか、->() で呼び出した方が良いよ。
840 :
815 :2012/04/29(日) 00:55:04.43
>>817 ありがとうございます。ノンブロックモードというのがあるんですね。
参考にして書いてみたのがこちらですが、どうでしょうか(タイムアウト処理を省略しました)
use POSIX qw/:sys_wait_h/;
my $pid = open my $reader,'-|',"perl foo.pl $arg";
my $wait_pid = -1;
my $main_process_end = 0;
do {
if ( $pid && ( ($wait_pid = waitpid $pid, WNOHANG) > 0 ) ) {
while (<$reader>) { print "$_\n"; }
}
# main process
unless ( $main_process_end ) {
# do something main process, and turn flug
$main_process_end = 1;
}
} while $wait_pid != -1;
close $reader if $reader;
openの仕方によるのだと思いますが、select($pid)では
STDOUTが返ってくる(foo.plのSTDOUTと$readerがつながっているから?)ため
素直にopenしたハンドルから読み込んでいます。
perlはあらゆる用途のあらゆる規模のプログラムに向いている、といったようなことが「リャマ本」に かかれていたのだけど本当なの?
お前ん中ではなってやつだよw
>>841 XSはperlに含むの?含まないの?それとも何でもありなの?
>>842 がすでに回答しているとおり、主観でしかない。だから他人の回答が
自分に役立つとは限らない。ヒント:「向いている」という単語。
846 :
815 :2012/04/29(日) 22:30:54.33
>>843 ありがとうございます!!いただいたコードは動作確認できましたが、
使ったことない関数が多くあったり、調べるうちに新知識を得たりと、
なかなか自分のコードに落とし込んでコレだというところまでいきません。
しかしおかげさまでメドは立って来ました。
もしかすると後日、掲載させていただくかもしれませんが、機会があったら見ていただけたら幸いですm(_ _)m
なお、9行目のopenの第3引数が洩れていると仮定して動作させています。
golf関係で質問させてください.
http://thospel.home.xs4all.nl/golf/minigolf4.html にあるコードで,一番最後に
print<@{q[@b,@ARGV]=@b=0..30}>.$/ とか
print<@{h{@a,@ARGV}=@a=0..30}>.$/ ってのがあるんですが,
・q[@b,@ARGV]になぜ@bを代入できるのか?
・h{@a,@ARGV}ってなんなのか?
がわかりません.確かに実行すると動くんですが…
どなたか解説して頂けませんでしょうか?
きたねーコードだなw
qw//とかqw[]とかの囲むなにかじゃねーの qもhも
上は @a=0..30;@a[@ARGV]=();print<@a>.$/ の短縮版 下はハッシュスライス my%h;@h{1..2}=1..2
print <@a>における山括弧の使い方は俺の知ってるのと違うような どのへんのドキュメントで勉強できる?
らくだ本に書いてあるよ
日本にゃgolf好きやacme好きは少ないな。
だってなぁ。所詮Perlでしか通用しない技術だし。
globを空文字削除として転用してるということか? 合ってるとしたら、その発想はなかった…
空文字を無視して最初の要素を取得してる感じかな。 これは知らなかった。 use File::Glob; print scalar glob(" a b c"), "\n";
858 :
847 :2012/05/01(火) 01:50:33.08
>>850 助言と色々試行錯誤してみたら,おかげで理解できました.
#!/usr/bin/perl
@a=0..30; @array[@a,@ARGV]=@a;
print<@array>.$/
859 :
847 :2012/05/01(火) 02:00:06.06
>>858 書いてる途中で送信してしまいました...
>>850 助言を元に色々と試行錯誤したら,理解できました.ありがとうございました.
qとかhってただの変数名なんですね.
@qを@arrayにしてコードを書きなおしてみると,こんな感じでしょうか.
#!/usr/bin/perl
@a=0..30; @array[@a,@ARGV]=@a;
print<@array>.$/
@array[@a,@ARGV]は,@array[@a]=@aなら個数はあっていますが,
@array[@a,@ARGV]だと,右辺の@aで指定しきれてないリスト,つまり()が入るということですね.
たしかに短縮版になってますね...
それにしても,変数名を明示的に囲むだけと思っていた{}が,
@array[@a,@ARGV]=@a; → @{array[@a,@ARGV]=@a}; みたいに,式ごと囲めるとは思ってなかった...
860 :
851 :2012/05/01(火) 02:28:52.37
qはq//があるからわかりづらいな
そういう難読コードを読み解くときはとりあえず use O "Deparse" してみるのが鉄則
863 :
デフォルトの名無しさん :2012/05/01(火) 13:02:58.84
独りで全部プログラミングする場合 packageする必要があるのか? package名::変数名としなければならないので呼び出しの変数名やサブルーチン名が長くなり プログラムファイルの容量が増えその分重くなる。 他のパッケージにサブルーチンを移し変えた場合 例えばサブルーチンaaaをpackage testからtest2に移し変えた場合 $test1::aaa;を全部$test2:aaa;と修正しなければならない グルーバル変数名とサブルーチン名を重複させないようにすればpackageする必要なんてないと思うが むしろpackageしたほうがデメリットあるのでは?
864 :
デフォルトの名無しさん :2012/05/01(火) 13:06:27.50
$test1::aaaと$test2::aaaじゃなくて&test1::aaaと&test2::aaaだった
>>863 Exporter使って輸出すれば完全修飾名で使うことは無いから、そうすればいいよ。
名前が衝突するかも知れないけど、そこは気を配るしかないね。
パッケージを使う理由は、
1. コードを再利用しやすくなる。変数名もサブルーチン名も衝突しないから。
2. デバッグしやすくなる。問題が出たらパッケージ単位で調べればいいから。
blessするだろ普通。
情報の隠蔽を学ぶ段階で、オブジェクト指向を突きつけるのことは、私には無理。
むしろパッケージ使うの禁止で泣きながら関数名の付けかえとか一度経験すべきw
その伝統を未来永劫引き継いでいくべき モダン()Perlなんかくたばれ!
再帰の練習をしているのですが、再帰せず1度で終わってしまいます #!/usr/bin/perl sub unko { my $name = $ARGV[0]; my $count = $ARGV[1]+0; print "name=$name,count=$count\n"; if( $count==0 ){exit;} unko($name,$count-1); } unko($ARGV[0],10); $countがいきなり0になっているように見えます。 どうすれば指定回数分だけunkoが呼ばれるようになるのでしょうか
サブルーチンの引数は@ARGVじゃなくて@_。基本なのでちゃんと勉強してね。
sub rec { my $name = shift; my $count = shift; print "$name, $count\n"; return if $count == 0 ; rec($name, $count-1); } rec("myrec",10);
もしかして:@ARGVと@_をごっちゃにしている
>>863 > 独りで全部プログラミングする場合
> packageする必要があるのか?
Perlを一人で作ったと考えよう。
packageなしで使いやすいと思うか?
875 :
870 :2012/05/01(火) 21:51:36.80
ありがとうございます! $_[0]とかに直したところ、 再帰的にunkoが出るようになりました!
以下の時間の文字列の差分をとってsleep関数でその差分の時間で待機させたいのですが どのようなコードをかけばいいんでしょうかね? あと@の取得方法などもありましたらよろしくお願いします 電波時計などから取得した時間: 07:03:21 @ ある特定の時間の文字列: 06:54:32 sleep( 07:03:21 - 06:54:32 );
POSIXの何かを使う
Time::Pieceで引き算しる
use Time::Local; sleep( time - timelocal(32,54,6,2,5-1,2012) );
>>876 use Net::NTP;
use
HTTP::Date; sleep(
+{get_ntp_response('ntp.nict.jp')}->{'Transmit Timestamp'} -
str2time('2012-05-02 19:40:00')
);
再帰で連想配列を渡したいんですが、 連想配列のデリファレンスってどうやればいいんでしょうか
やってみろよ。一発でうまくいくから。
>>882 use strict; use warnings;
sub unko {
my ($count,%chinko) = @_;
print "count=$count\n";
return if $count<=0;
$$chinko{"$count"}=$count*2; # ★ここがエラー
unko( $count-1,\%chinko );
}
my %chinko;
unko( 5, \%chinko );
for my $i (%chinko) { print "$i\n"; }
こういうコードで試してるんですが、$chinkoが
グローバルな男のシンボルになってしまいます
リファレンスの型は何かを知らずにチンコ切って死ね
>>884 もう1時間くらいチンコ切り続けてるんですが、諦めきれません・・・
sub unko {
my ($count,$chinko) = @_;
print "count=$count\n";
return if $count<=0;
$$chinko{"$count"}=$count*2;
unko( $count-1,$chinko );
}
これでうまく動きました!
>>884 さんのヒントが無ければ解決出来なかったよ・・・ありがとう!
Cと同じように考えたらそれなりに理解できた気がする
デリファレンスを $chinko->{$count} ってシたほうがよくわかるだろ
>>887 以外と初心者ほどその書き方を知らんのよね
まあ他の言語ではあまりしない書法だから仕方ないが
今日もパールのような物で戦います。
>>888 C言語で普通にするでしょ、そこから来たんだし
俺が C で書いてた矢印は幻だったのか
アロー演算子ドット演算子の呼び方を教えてくれないのは不親切だ!
>>892 いやC言語のアローの後にブレースや角括弧は来ないと思うぞ
矢印はCのとは違いすぎてちょっとわかりにくいな むしろCの*を使わせる感じのほうがわかりやすい
Cのポインタは全く詰まることがなかったのに Perlのリファレンス周りが未だに怪しい
899 :
デフォルトの名無しさん :2012/05/03(木) 18:01:17.83
form.plの中身 package FORM; (途中略) $form_data{$name}=$value; #デコードしてフォームから送信された値を格納する 1; test.plの中身 pacckage TEST; %form_data = %FORM::form_data; print "$form_data{'aaa'}"; 1; 他ファイルでフォームデータを受け取るには このようにすればいいのですか?
ポインタの場合はどんどんインクリメントしていくと、自分で確保した 領域以上のところまで行ってしまって、バグの元になる。 一方で、リファレンスの場合は実在するメモリの参照を扱うわけなので 領域以上のところにアクセスする危険性がない。 あとは変数のリファレンスやリテラルのスカラー、リスト、ハッシュ、 関数のリファレンスの記述方法を覚えればもう終わり。
どうして他ファイルでフォームデータを受け取ることを思いついたのか
903 :
デフォルトの名無しさん :2012/05/03(木) 19:57:20.56
>>901 じゃあformデータを受け取るサブルーチンを
各ファイルにコピペするというのか?
他ファイルでデータ取得するしかないだろう
ま、まあCGIも他ファイルといえば他ファイルだよ…ね?
>>899 そこまで書けるなら試せばいいじゃん
やり方はスマートじゃないから、俺ならこんなやり方はしないけどね
906 :
デフォルトの名無しさん :2012/05/03(木) 20:19:06.97
メソッド
質問スレでくだくだ言っているだけのやつwwwwwwwwwwwww
>>909 アホか
そんなん使うぐらいならライブラリなしで済ますわ
レス相手を間違えたんだろう
912 :
デフォルトの名無しさん :2012/05/04(金) 18:11:52.65
@id_list=("aaa","bbb","ccc","ddd","eee","fff"); print "<TABLE>"; foreach $id(@id_list){ print "<TR>"; print "<TD><inpu type=\"checkbox\" NAME=\"check_$id\"></TD>"; print "<TD>"; print "<form method=\"POST\" action=\"test.cgi\">"; print "<input type=\"hidden\" NAME=\"id\" VALUE=\"$id\">"; print "<input type=\"submit\" name=\"shousai_settei\" value=\"詳細設定\" >"; print "</form>"; print "</TD>"; print "</TR>"; } print "</TABLE>"; これだとチェックボックスのデータが送信できないので <TABLE>から</TABLE>までをFORMタグで囲むようにしてもFORMのネストになるので チェックボックスの値が取得できません このような場合でチェックボックスの値を取得する方法を教えてください
913 :
デフォルトの名無しさん :2012/05/04(金) 18:21:06.06
チェックしたチェックボックスのname一覧を取得したいのです
>>914 今日近くの寺で写経会があったんだけど、般若心経でなく
>>1 を100回書くのも
ありなのかなと書いてて思った
誘導することに疲れました。 このjperl(5.003)使いをなんとかしたいです。
つい答えちゃう頭の弱いやつのせい
920 :
デフォルトの名無しさん :2012/05/04(金) 21:56:12.90
正規表現で利用する文字列に変数って利用できますか? $itemと$checkって変数を正規表現にかけて、 マッチしたら処理をするって感じにしたいです。 でも、以下のプログラムだとエラーが出てしまいます。 どうしたらいいでしょうか?? if($item =~ /$check/){ $flg++; }
my $item = "this is a pen." ; #my $check = "gh" ; # (none) my $check = "th" ; # (match) if ($item =~ /$check/){ print "match.\n" ; } else { print "none.\n" ; } エラーがでない どうやってそのエラーを出せば良いんだ エラーを出すのも一苦労DA☆ZE
if($item =~ /\Q$check\E/){ $flg++; }
>>912 <form></form> の外に置かれた <input> を送信してくるブラウザを俺は知らない
HTML 要素は小文字表記
method は post と小文字で表記
use strict と use warnings は必須
ヒント: type="submit" の name は押された時に送信される。
name が aaa bbb ccc の submit があり、bbb の submit を押した場合は aaa と ccc の value は送信されない。
perl を学ぶ前に HTML を学習しような。
925 :
デフォルトの名無しさん :2012/05/04(金) 22:24:16.80
>>920 ドキュメントに普通に登場するようなかなりの初歩だから、ネットでぐぐらずに
>>2 の本のうちどれか買いなさいな。
これからも、そういったど初歩の質問をし続けるつもりですか?
927 :
デフォルトの名無しさん :2012/05/05(土) 00:47:36.06
>>926 おいおい「
>>2 の本以外は絶対に買うな。特に日本人が書いた奴」を忘れてるぞ
初心者なのですが、KENTさんの本でお薦めはどれですか?
KENT神のお書きになられた御本は全てお勧めです その全てをコンプリートしていても何もおかしくないような名著ばかりです 是非とも全て買いましょう コンプするのがperlモンガーへの最もな近道です そしてkENTは紙です 彼(あるいは彼女(に貢ぎましょう 我々は信者であるからして、彼の儲けになるべくして存在している存在なのです
>>929 > 初心者なのですが、KENTさんの本でお薦めはどれですか?
そんなもん無いよ。
KENTというのは、2000年より以前の時代。
アマチュアのフリーウェア作家が
頑張っていた時代の人だから。
>>932 KENTはプログラマだろ。プログラマと言ってもコボラだが。
KENTのソースコード見て勉強すると 馬鹿になる。
KENT は初心者にチン毛が生えたようなもん チン毛が好きなら買えばいいよ
○○のラーメン次郎はイマイチみたいな話の流れだな
ラーメン次郎はどの店もイマイチみたいな流れじゃないのか? KENTはどのアプリもいまいち
初心者でも知っているKENT氏をバカするな
馬鹿にしてない。中学生のコードだって言ってるだけ。 本当の中学生なら頑張ってる方だ。
KENT は反面教師と言う良い例
昔はあんなのでももてはやされた