Perlについての質問箱 ..
232:デフォルトの名無しさん
09/03/08 15:52:30
>>231
不要とは言ってない。Perlでブートするわけにはいかんだろw
ただマの知識として必要かというとPerlで事足りる人もいるだろう。
233:デフォルトの名無しさん
09/03/08 16:07:30
>>231
お前こそムキになってPerlは必要ないって言ってるじゃん
234:デフォルトの名無しさん
09/03/08 16:07:39
>>232
エンドユーザの立場から一言。
プログラマの方のお考えはごもっともです。
しかし、「高層建築にカンナやカナヅチなんて要らない」的発想が
今日のエンドユーザー・コンピューティングの惨状を招いたのではありませんか?
たかだかちょっとした自動化、文書検索、集計程度も自分で書けない人だらけにしてしまったのは
「素人は言語なんて使わなくていい」という発想のせいだと思えるのですが。
235:デフォルトの名無しさん
09/03/08 16:21:46
自分の目的を達成できれば言語なんて何使ったっていいんだよ。
特にスクリプト系言語を使うってことは、大体が小物でしょう?
自分がサッと書けること。これが重要。
236:デフォルトの名無しさん
09/03/08 16:26:44
>>234
時代のせいだと思います。
例えば自分はWebプログラミング畑だけど、全てのWebアプリケーションを
全部Cで書くことは納期的にほとんど不可能です。awkでは完成すらしない
ものも出てきます。
自分も昔はquick sortくらいは空で書けたけど、Webに足を
突っ込んだ今ではそれすら忘れてしまいました。
237:デフォルトの名無しさん
09/03/08 16:47:37
>>236
quicksortなんてlibcに任せときゃいいんですよ。気に病むことでもない。
238:デフォルトの名無しさん
09/03/08 16:59:13
>>236
quick sortもできないの?
ププ
239:デフォルトの名無しさん
09/03/08 17:03:17
>>237
だね。
>>238みたいになんでも自分で作るとたまに間違うことがあるし、
馬鹿馬鹿しいプライドで心がねじ曲がってしまう。
240:デフォルトの名無しさん
09/03/08 17:17:39
エンドユーザの立場から一言。
プログラマの方のお考えはごもっともです。
しかし、sortコマンド打つのが簡易で合理的な発想だと思えるのですが。
たかだかちょっとしたソートも自分で書けない人だらけにしてしまったのは
「素人はソートなんてやらなくていい」という発想のせいだと思えるのですが。
241:デフォルトの名無しさん
09/03/08 17:22:21
単純なテキストファイルで単純なソートなら sort(1) でもいいんだろうけど
242:デフォルトの名無しさん
09/03/08 17:24:54
FYI
■libcでqsort()を再帰を使って実装してる香具師は怠慢だろ…常識的に考えて
URLリンク(d.hatena.ne.jp)
243: ◆TWARamEjuA
09/03/08 18:49:15 BE:1742944-BRZ(10000)
そーっとしといてやれよ。
244:デフォルトの名無しさん
09/03/08 20:19:13
>>230
シェル言語ってのは地味に需要がある。
MSがUNIX/Linuxへの対抗心むき出しでWindows PowerShellなんぞ作ってるくらいだから。
UNIX/Linuxを普段使ってる人ってのはシェルを対話的に利用するのに慣れている。
だから、さて何か組もうかって時もシェル言語が第一選択になる。
それでダメな時に別の言語を選ぶ。
UNIXの世界ではシェルでできることはシェルで、というのが昔から暗黙の了解なので
いきなりPerlやPythonでやろうとするのは、コンピュータの世界にWindowsから入った人くらいだろう。
それは例えて言うなら、自家用車を持ってるのにリムジンをレンタルしてドライブするようなもんだ。
245:デフォルトの名無しさん
09/03/08 22:44:41
ワンライナーはsed,awk,sortの方が楽なことが
多いな。例えばいくらオプションでsplitを暗黙
にさせても[]書かされる時点で、$1,$2でいい
awkにはかなわない。
もちろんガッツり書くならスクリプト言語。
246:デフォルトの名無しさん
09/03/09 17:17:27
>>244
1行目は同意だが、あとはいつの時代の話だよと思うな。
そりゃ配布物配ろうとか思ったらまずshを選択するだろうが、
例えばWebアプリケーション作る時にshを第一選択肢に上げるか?
hello world以外は特にsh使う場面って思いつかないんだが。
247:デフォルトの名無しさん
09/03/09 17:48:50
>>246
普通にファイル処理やテキスト処理には使うし、
処理を自動化するのにも使うし、
定期的にどっかのサイトにアクセスして、特定の情報だけを記録するとか、
その程度の用途には当たり前に使うと思うが。
本格的なプログラミングか、ワープロとか表計算みたいに出来合いのアプリで済ませるか、
二者択一だったらパソコンライフなんて送れねーよ。
それとも、プログラミングってのはアプリとwebの開発のためだけにあんのか?
248:デフォルトの名無しさん
09/03/09 17:54:32
小規模ならまずシェルで出来ないか考えるよな
249:デフォルトの名無しさん
09/03/09 17:54:45
>>247
例外は認めないのかよw
普遍的な事のように書くから変な誤解受けるんだろ。
んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?
「UNIXの世界ではふつー」とかじゃ理由にならんだろ。
例えば毎秒起動とかだったらさすがに少々面倒でもshを第一選択とするのが吉だと思うが。
250:デフォルトの名無しさん
09/03/09 17:58:02
>>249
>んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?
同じことができるならそれでいい。
ただし、より面倒臭くなることはあるだろう。
何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。
251:デフォルトの名無しさん
09/03/09 18:06:37
トリッキーなことしなくても普通にシェルでできるなら、それが一番簡単なんじゃね?
コマンド並べれば動くから
難しいナンチャラ理論やらウンタラ指向やらも考えなくて済む
プログラマでないエンドユーザや管理者にも使えるのは大きなメリットだと思うな
252:デフォルトの名無しさん
09/03/09 18:07:23
>>250
要するに余計面倒な時だけsh使うでもいいわけね。
>>244はとてもそういう論調には見えないけど。
そういう俺はよくshスクリプト書くがな。
253:デフォルトの名無しさん
09/03/09 18:10:49
>>252
w3m -dump URLリンク(www.media-k.co.jp) | grep '´_'
254:デフォルトの名無しさん
09/03/09 18:11:49
>>250
> 何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。
Perlプログラミングに没頭してる合間とかだったら、AWKの方が少々短くても
Perlのワンライナーを選択することはあるな。
短く書けるっつったってせいぜい数バイトだろ>>228。頭切り替える方が面倒だわ。
255:デフォルトの名無しさん
09/03/09 18:13:28
>>254
Perlに没頭してるあなたにとってはPerlでやるほうが簡単なんでしょうね
別にそれはそれでいいのでは?
だからといって、それはあなた個人の特殊事情で簡単に感じるだけなのだから、
シェルでやるほうが手間が少ない人にまで強要すべきことではないでしょう
256:デフォルトの名無しさん
09/03/09 18:15:10
>>255
いつ強要したんだよww俺はこうだって言っただけじゃん。
逆に>>244なんかshで出来ることにPerl使う奴は外道みたいな書き方じゃん。
257:デフォルトの名無しさん
09/03/09 18:17:24
この人論点が分かってないからトンチンカンな事を言うのかね。
「何事もshが第一選択にするのが普通、じゃなきゃ外道」
みたいな主張がおかしいと言ってるだけなんだが。
258:デフォルトの名無しさん
09/03/09 18:22:07
>>257
話がかみ合わない理由って案外簡単なんじゃない?
普通にUNIX系OS使ってる人にとってshって標準的な道具だから、
シェルで作業するってのは鉛筆で文字を書くのと同じくらい簡単で当たり前なんだよ。
だから、どうしても他の物を試す前にshで、っていう発想になるだけでしょ。
259:デフォルトの名無しさん
09/03/09 19:01:03
いったい、シェルの話をしているのかシェルスクリプトの話をしているのか
はっきりさせてくれ。
260:デフォルトの名無しさん
09/03/09 19:09:12
つーかPerlの話しようぜ
261:デフォルトの名無しさん
09/03/09 19:20:03
>>259-260の流れわろた
262:デフォルトの名無しさん
09/03/09 19:41:35
この現代に、WEBアプリ以外に何があるの?
世界じゅうどこを見て回っても、WEBアプリしか無いんだから
awk も sh もいらん。perl しか選択の道は無いだろ。
263:デフォルトの名無しさん
09/03/09 19:43:50
最近の家庭電化製品はマイコン内臓でずいぶん賢くなった。
しゃべる電子レンジのファームウエアを awk や sh で書けると思ってんの?
264:デフォルトの名無しさん
09/03/09 19:56:31
宗教の勧誘みたいw
265:デフォルトの名無しさん
09/03/09 20:00:33
shのほうが慣れてるからsh使うという人が、昔は多かった。
イマドキのPerlerには、Perlのワンライナーのほうが慣れてる人が多いんだろうね。
266:デフォルトの名無しさん
09/03/09 20:06:24
>>265
perlの人は
ls
と打たずに
opendir(DIR,'.');
@file = sort readdir(DIR);
foreach(@file){
$time = localtime ((stat($_))[9]);
print "$time"."\t"."$_\n";
}
closedir(DIR);
とやるわけですね?
簡単なことをいちいち
perl ふがほげ
perl うんたらかんたら
ってやるのは不自然なんですけど
267:デフォルトの名無しさん
09/03/09 20:10:37
lsで済むことならlsじゃねえの普通
Windowsユーザならlsなんぞ打たずにファイラとかエクスプローラだろうしな
でも、スクリプトの話じゃなかったのか
268:デフォルトの名無しさん
09/03/09 20:13:40
ファイルの行数調べるのも「Perlでどうやろうか」とか考えちゃうのね
cat hoge | wc -l
とせずに
269:デフォルトの名無しさん
09/03/09 20:14:54
そこは
wc -l <hoge
catとか使わないな
270:デフォルトの名無しさん
09/03/09 20:15:05
>>267
シェルとシェルスクリプトに何の違いがあんの?
コマンドが単発か複数かの違いだけじゃん?
271:デフォルトの名無しさん
09/03/09 20:15:32
ファイルに記述するか
その場でうちこんで終わりかの違いじゃね
272:デフォルトの名無しさん
09/03/09 20:17:15
シェル言語の有用性認めないなら
シェル言語使わなけりゃいいじゃん
そこまで言うならPerlだけで暮らせ
273:デフォルトの名無しさん
09/03/09 20:18:57
bashのコマンド使わないでperlだけで暮らしたらさぞ便利だろうねw
274:デフォルトの名無しさん
09/03/09 20:23:47
Windowsユーザの9割はbashなんて使ってないけどね
275:デフォルトの名無しさん
09/03/09 20:26:16
>>274
この話ではWinユーザは無関係と思われ
UNIXの操作ではシェルが母国語みたいなもんなのに
簡単な用事でも外国語使いたがる変人だけが対象
276:デフォルトの名無しさん
09/03/09 20:30:51
それって、いもしないキャラを作り上げてない?
277:デフォルトの名無しさん
09/03/09 20:40:09
awk '/UNIX/ || /Linux/' hoge
perl -ne 'print if /UNIX/ || /Linux/' hoge
シェルを普通に使いこなしてる人なら最初の方が明らかに簡単だろ?
打鍵数だけじゃなく、構文的にも。
「何でもPerl」ってやりかたが変だってのは、そういうこと。
shは古い、awkやgrepは低機能だと文句言いながら、より難しくやってる人たちを変だと言ってるだけさ。
で、シェルとシェルスクリプトをやたらに区別したがってる奴がいるが、本質は同じだろ。
シェル使って作業して、コマンドを複数使って仕事しようとすると、シェルスクリプトと言われるだけで。
278:デフォルトの名無しさん
09/03/09 21:04:33
>>277
その例なら
grep '(UNIX|LINUX)' hoge
かなあ
awkなんて使わないよ
279: ◆TWARamEjuA
09/03/09 21:09:44 BE:1960463-BRZ(10000)
my @textfiles = grep /txt$/, qx|ls -l|;
でもえぇやん。。。
280:デフォルトの名無しさん
09/03/09 21:13:16
>>278
環境によって動かないとおもいまつ
GNU grep 2.5.3
では少なくとも×
grep -e UNIX -e Linux hoge
これなら動きます
ただし、awk使うのと難しさに大差ありません
281:デフォルトの名無しさん
09/03/09 21:15:29
例を挙げれば挙げるほど
Perlより簡単な方法が出てくる件
282:デフォルトの名無しさん
09/03/09 21:21:06
>>280
ありゃ
egrepならいいのかな?
283:デフォルトの名無しさん
09/03/09 21:21:44
>>282
そうでつね
284:デフォルトの名無しさん
09/03/09 21:29:38
ここまでの流れを見た率直な感想
Bシェルとかgrepとかawkとかsedなんて前時代の遺物だと思ってたけど・・・
今でも十分に使えんじゃん
285:デフォルトの名無しさん
09/03/09 21:45:28
結局どうやるのがもっとも効率的かを的確に判断できるように
あらゆるスキルを磨いとけってこった。
286:デフォルトの名無しさん
09/03/09 22:15:16
専用のコマンドの方が使い勝手がいいのは当然だよね
それでも sed や awk を使うのでは1行で済まない場合は
(シェルスクリプト組むような場合は)、Perl の方がシンプルになってくる
287:デフォルトの名無しさん
09/03/09 22:19:03
ワンライナーの話をしてるのに
なんでshのコマンドラインとワンライナーを比べるんだか・・・。
ネジ緩んでるの?後者は一応スクリプトだぞ。
コマンドはスクリプトで書くのが大変or不可能なことをするために
存在するんだからwcとか例に持ってくるのは愚の骨頂。
288:デフォルトの名無しさん
09/03/09 23:24:23
>>286
簡単なことだけならシェルスクリプトの方がシンプルだと思うが
>>287
それって自分の首絞めてないか?
コマンド単体で強力ならそれを利用したスクリプトも強力なわけで
289:デフォルトの名無しさん
09/03/09 23:42:01
>>287
ワンライナーってコマンドラインの延長じゃねーの?
質的な違いなんてねーよ
290:デフォルトの名無しさん
09/03/09 23:48:37
質問です!
Perlとsedとawkとbashはどれがいちばんつおいのですか?
291:デフォルトの名無しさん
09/03/09 23:57:59
perlで話題が無いからって、そこまで引っ張ることないだろ(w
292:デフォルトの名無しさん
09/03/10 00:00:57
じゃあ無理やり話題作りを。
問:以下のシェルスクリプトをPerlに直しなさい。
#!/bin/sh
o=$(echo "$@" | sed 's/ /+/g' | sed 's/ /+/g')
w3m "URLリンク(www.google.co.jp)"$o"&meta=lr%3D&aq=f&oq="
293:292
09/03/10 00:08:22
ちなみに、
sed 's/ /+/g' | sed 's/ /+/g'
の部分は
sed 's/[ ]/+g'
でも同じですが、
全角スペースと半角スペースを列記すると見た目にわかりにくくなるので、
問題文ではあえて別々に処理しとります。
294:デフォルトの名無しさん
09/03/10 00:15:36
sedやw3mがシェルスクリプトの一部だというなら
perlも仲間に入れてあげなよ
295:デフォルトの名無しさん
09/03/10 00:18:46
perlだけは絶対入れない。絶対ニダ
296:デフォルトの名無しさん
09/03/10 00:21:18
sedとかawkでやると楽な事とperlでやるのが楽な事の境界線を
判断するのは難しいよな
297:デフォルトの名無しさん
09/03/10 01:53:00
まーあれだ、シェルがどーこーとかほざいてる奴らが言ってるのはどうせbashだろ。
糞linuxごときの標準シェルなんぞどーでもえーわ
298:デフォルトの名無しさん
09/03/10 06:31:06
どーでもえーことに熱くなれるっていいネ!!
299:デフォルトの名無しさん
09/03/10 11:47:12
Linux板のシェルスクリプトスレはここほど釣れなかった
からといってここに八つ当たりしなくてもねえ。
300:デフォルトの名無しさん
09/03/10 22:07:54
RSSから指定期間の祝日を取得するスクリプトを書いてる。
ある程度の日付の範囲をもって複数の祝日を取得するときは問題なく動作するんだけど、ある特定の祝日を一つに絞って実行すると上手く動作しない。
printをあちこちかませて調べてるんだけどどうも$keyが上手く取れてない様子。通常はURLが入るんだけどNGの場合はXMLのタグ名がなぜか入ってきてNGになってしまう。
上手く動かすには何が足らないんだろ?
use LWP::UserAgent;
use XML::Simple;
&Holiday ("2009-02-01", "2009-04-01"); # OK
&Holiday ("2009-03-20", "2009-03-21"); # NG
sub Holiday {
my $feed_base = 'URLリンク(www.google.com)';
my $sdate = $_[0]; # この日を含む開始日
my $edate = $_[1]; # この日を含まない終了日
my $query = "start-min=${sdate}&start-max=${edate}";
my $feed_url = $feed_base . '?' . $query;
my $ua = LWP::UserAgent->new;
my $res = $ua->get( $feed_url );
if( $res->is_success ){
my $xml_parser = XML::Simple->new();
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
my $holidays_data = $xml_parser->XMLin( $res->content );
foreach my $key ( keys %{ $holidays_data->{ entry } } ){
#print "$key\n";
my $holiday_day = $holidays_data->{ 'entry' }{ "$key" }{ 'gd:when' }{ startTime };
print $holiday_day , "\n";
}
}else{
die $res->status_line;
}
}
301:デフォルトの名無しさん
09/03/10 23:08:10
質問です。
以下のコードを実行するとhoge_fooという出力を期待していたのですがfooとしか表示されません。
おそらく_が何か演算子としての働きをしているんだと思いますが、
一体これはどういう意味を持つ演算子なんでしょうか?教えてください。
Perlのバージョン:This is perl, v5.8.8 built for MSWin32-x86-multi-thread
$hoge="hoge";
$foo="foo";
print "$hoge_$foo\n"; # 出力:foo
print "$hoge\_$foo\n"; # 出力:hoge_foo
302:301
09/03/10 23:10:45
$hoge="hoge";
$foo="foo";
$hoge_="まさか・・";
print "$hoge_$foo\n";
print "$hoge\_$foo\n";
どうみても誤解釈です。ほんとうにありがとうございました。
303:デフォルトの名無しさん
09/03/10 23:11:02
>>301
3行目で$home_ を展開してる。
サンプルコードの最初に
$hoge_ = "HOGE";
て入れてみると、3行目の出力が「HOGEfoo」になる。
304:デフォルトの名無しさん
09/03/10 23:11:34
あ、>>302で解決してますね
305:301
09/03/10 23:17:29
>>303,304
レスどうもありがとうございました。
306:デフォルトの名無しさん
09/03/11 10:31:12
くだすれスンマセン
($self->{year},$self->{month},$self->{day}) = ( gmtime time + $time_difference * 3600 )[5,4,3]
この [5,4,3]っていうのはどういうことなのですか?
こういう書き方の呼称がわからないのでググれなくて
307:デフォルトの名無しさん
09/03/11 10:50:28
slice
308:デフォルトの名無しさん
09/03/11 13:46:55
list
309:デフォルトの名無しさん
09/03/11 18:19:50
>>306
ググる前にマニュアルを読めばいいと思うよ。
URLリンク(perldoc.jp)
310:デフォルトの名無しさん
09/03/11 18:31:28
>>309
perldata読めばいいってはじめからわかってたら困らんだろ。
311:デフォルトの名無しさん
09/03/14 10:04:59
少しお聞きしたいのです。
以下のようなソースがありまして、
$| = 1;
print "Start\n";
$i = 0;
while($a = <>){
print "Loop: $a $i\n";
$i++;
}
print "End\n";
コマンドラインから perl test.pl などとして起動すると、
Ctrl+Z(ENTER)でEOFを渡して(よくわかってない?)中断して終了できますよね。
しかし、EOF(0x1a)を、
ファイルで渡したり(perl test.pl < test.txt)、Delphi等のプログラムから渡したりすると
上記プログラムでは終了してくれなす。
これを終了してくれるようにするにはどうしたらよいでしょうか?
312:デフォルトの名無しさん
09/03/14 10:06:38
>>311
捕捉
> EOF(0x1a)を、ファイルで渡したり
これは、バイナリエディタで 74 65 73 0D 0A 74 65 73 74 0D 0A 1A 0D 0A のように記述しました。
313:デフォルトの名無しさん
09/03/14 11:13:25
シグナル打ち込め
314:デフォルトの名無しさん
09/03/14 11:24:01
>>311
1A は関係ないと思う。
1A は有っても無くても終了するはずだよ。
でないと UNIX などは大変なことになる。
1A は Windows だけの習慣。UNIX のテキストファイルには普通 1A は無いからね。
原因は何か他にあるんじゃないの?
315:311
09/03/14 12:15:10
ごめん、環境かいてなかった。
OS: Windows Vista SP1 32bit
perlは体分前に入れたものなので古い
This is perl, v5.8.3 built for MSWin32-x86-multi-thread
(with 8 registered patches, see perl -V for more detail)
>>314
ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します
プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事
URLリンク(maxxdelphisite.free.fr)
1AってそもそもEOFじゃないんのかな?
316:デフォルトの名無しさん
09/03/14 12:27:16
>>315
先ず先に<>はSTDINとARGV両方を示す事を理解しろ。
プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、
ARGVがあれば、暗黙のうちに<>は<ARGV>として挙動する。
従って
====
while(<>){ print "ARGV: $_" }
while( ($_=<>) !~/^$/ ){ print "STDIN: $_"}
====
をhoge.plとして保存して以下の様に実行した場合、
perl hoge.pl < hoge.pl
は、ARGVの中身を全てプリントした後にSTDINの処理をする
(STDIN処理は、何も入力せずにreturnで終了)。
外部ファイルにシグナルを入れて流し込むのが仮に可能だと
しても、それをどのタイミングで使うかは書き手に任される訳だから、
素直に終了フラグを立てるのが普通では無いの?
317:デフォルトの名無しさん
09/03/14 13:49:03
なんか変なのが沸いた
>>プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、
へー
318:デフォルトの名無しさん
09/03/14 13:55:55
ファイルハンドルがって意味じゃねえの?
それでも言葉不足だけどw
perl hoge.pl < hoge.pl
は、
while(<ARGV>){ print ; }
でも
while(<STDIN>){ print ; }
動くよ。
319:デフォルトの名無しさん
09/03/14 13:57:02
最終行「でも動くよ。」
320:デフォルトの名無しさん
09/03/14 14:08:58
知ったかぶり者を論うのやめろ。荒れるから。
321:へんなの
09/03/14 14:09:01
あーすまん。
言葉も変だし、5.8までと5.10で挙動が違うわ、>>316。
>>316の例とかは全面撤回(5.10では動く)
322:デフォルトの名無しさん
09/03/14 14:28:14
CPANやperldoc.jpでのPODトランスレータは何を使っていますか?
Pod::HTML, Pod::HtmlEasy, Pod::Xhtml, Pod::Tree::HTML,
Pod::Simple::HTML, Pod::Simple::XHTML...と、色々試していますが、
L<Foo>やら=item * <Bar::Baz>やらマルチバイト文字やら、
一部に対応しているものがありますが、全部に対応したものはないように
感じました。
323:デフォルトの名無しさん
09/03/14 17:02:33
>>315
>ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します
>プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事
結局どうなの?終了するの?無限ループするの?どっちなの?
結局、何がしたいの?どういう動作を期待してるの?
324:デフォルトの名無しさん
09/03/14 19:47:30
>>311 が使ってるOSでは、0x1a を送っても 0x1a にすぎず EOF にはならない。
どうしてもそれを望むなら OS を CP/M に換えるといい
325:デフォルトの名無しさん
09/03/14 21:48:07
I love you
326:デフォルトの名無しさん
09/03/16 20:40:31
二重のforeach修飾子は使えないのでしょうか?
perl -E '
@tmp=([1,2,3],[4,5,6],[7,8,9]);
for (@tmp){
for (@{$_}){say}
}'
出力
1
2
3
(以下略)
という構文をforeach修飾子を使って、以下のように書いたのですが、
perl -E '
@tmp=([1,2,3],[4,5,6],[7,8,9]);
say for @{$_} for @tmp;'
コンパイルエラーになってしまいます。
このような二重のforeach修飾子は使えないのですか?
それともコードが間違っているのでしょうか?
perlのバージョンは
v5.10.0 built for x86_64-linux-thread-multi
です。
327:デフォルトの名無しさん
09/03/16 20:59:27
修飾子はひとつしかつけられません。(perlsyn参照)
Any simple statement may optionally be followed by a SINGLE modifier,
just before the terminating semicolon (or block ending).
328:デフォルトの名無しさん
09/03/16 21:15:11
rand()で、0が出る確率というのはあるのでしょうか?
もしくはrand()で出る一番小さな数字というのがあれば教えて頂けないでしょうか。
329:326
09/03/16 21:19:15
>>327
ありがとうございます。
参考になりました。
330:デフォルトの名無しさん
09/03/16 21:51:39
>328
perldoc -f rand
331:デフォルトの名無しさん
09/03/16 23:58:47
$data = "19:09:34 hoge 294";
if($data =~ /\d\d:\d\d:\d\d \d*/){
print "マッチ\n";
}else{
print "マッチせず\n";
}
「数字数字:数字数字:数字数字 いくつかの数字」という文にだけヒットさせたいんですが、
何故か余計な文字の入っている上の文でもヒットしてしまいます。
どうしてヒットしてしまうんでしょうか?
環境:This is perl, v5.8.8 built for MSWin32-x86-multi-thread
332:331
09/03/17 00:01:27
*だと\dが0の場合も含まれるんでした。
*を+にしたらうまくいきました。
333:デフォルトの名無しさん
09/03/17 00:42:36
関数のreturn値って成功の場合1で、失敗の場合0が普通なのでしょうか?
標準関数はこのパターンが多いような気がします。
シェルスクリプトの場合だとたいてい逆ですよね?
334:デフォルトの名無しさん
09/03/17 07:18:18
成功の場合に真を、失敗の場合に偽を返す
って考えれば Perlの関数の多くも コマンドの終了コードも同じ
335:デフォルトの名無しさん
09/03/17 08:34:52
↑
アフォ?
336:デフォルトの名無しさん
09/03/17 16:16:53
>>333
そだよ
だからsystem関数の使い方には注意
Perl6では、system関数の戻り値もPerlの流儀になる
337:デフォルトの名無しさん
09/03/17 20:36:43
引数がAから始まって、後が全部数字かどうかチェックするのって
if($ARGV[0] =~ /^A+[0-9]$/)
でいいのかな
338: ◆TWARamEjuA
09/03/17 20:38:57 BE:3920966-BRZ(10001)
>>337
おしいかも。
/^A[0-9]+$/
でもその前にchomp入れた方がよいかも♪
339:デフォルトの名無しさん
09/03/17 20:47:23
おおお、なんと優しい
ありがとーw
340:デフォルトの名無しさん
09/03/17 23:20:12 BE:309540375-PLT(54324)
/\AA[0-9]+\z/
341:デフォルトの名無しさん
09/03/18 04:15:45
xms
342:デフォルトの名無しさん
09/03/18 09:46:26
\d+はダメなの?
343:311
09/03/18 10:41:45
>>316
時間が空いてすいません。
^Z(1A)はシグナルなのでそもそもファイルからは渡せないもんなんでしょうか?(単にデータとして受け取られる)
問題は、通常のプログラムから標準入力を渡した場合なのですが、これもファイルから渡したのと同様になる
ものなのでしょうか?
つまり、何かのデータをフラグと見立てて、それを検出したら終了、というような作業が必要なものか、と。
344:311
09/03/18 10:44:13
>>323
期待する動作は、プログラムで1Aを送ると終了して欲しい、ということです。
ターミナルやコマンドプロンプトなどで、^Zを送ったときと同じような動作を期待しています。
345:デフォルトの名無しさん
09/03/18 10:44:39
>>342
\d や \w はロケールや UTF-8 フラグによってマッチする文字が変わる。例えば全角数字。
$ は改行の直前にもマッチするので、"A10\n" =~ /^A[0-9]+$/ が真となってハマる初心者多し。
^ は /m が指定されていない限り文字列先端にしかマッチしないので、\A だとやや偏執的
とも感じる。用心深いに越した事はないけれど、/\AA よりは /^A の方が見た目がスッキリ
して読みやすい。
URLリンク(perldoc.jp)
URLリンク(perldoc.jp)
346:デフォルトの名無しさん
09/03/18 11:35:38
>>344
1Aが入ってきたら終わるように書けばいいだけ。
347:デフォルトの名無しさん
09/03/18 16:01:22
Perl業界におけるPerl 6の立ち位置がよく分からないんですが、
雰囲気的にはどんな感じなんでしょうか?
348:デフォルトの名無しさん
09/03/18 16:24:04
>>347
Web業界に限って言えば様子見ムード。
349:デフォルトの名無しさん
09/03/18 16:28:27
Parrot1.0が出ましたが、これ使うと何が出来るようになるんですか?
他言語との連携が楽になるだけ?
350:デフォルトの名無しさん
09/03/18 16:40:10
>>344
CP/Mからの呪縛。
DOS(Windows)とUNIXそれぞれの、改行コード、終端コード、
テキストモード、バイナリモードについて、ググるなりして理解するのが先。
351:デフォルトの名無しさん
09/03/18 18:44:37
>>345
d
352:デフォルトの名無しさん
09/03/18 20:17:40
>>344
だから 0x1a が EOF と思ってる時点で間違ってる
まずここを理解しろよ
CTRL-Z 押下は EOF を送るための特殊な操作であって、
それが歴史的な理由で CTRL-Z (0x1a)になってるだけであって
0x1a を送れば EOF になるわけじゃない。
353:デフォルトの名無しさん
09/03/19 01:24:01
>>344
if (ナントカ eq "\x1a") { exit }
こういう発想は思いつかんの?
354:311
09/03/19 07:08:15
>>346 >>352-353
理解しました。ありがとう。
355:デフォルトの名無しさん
09/03/20 02:20:00
@a = ('1','2','3','4','5','6')
@b = ('2','3')
という配列があった時に、@aから@bを削除して
@c = ('1','4','5','6')
を作りたいのです。ループ回すしか無いのでしょうか?
大崎氏(URLリンク(www.din.or.jp))の、
# 配列 @array から重複した要素を取り除く
{
my %count;
@array = grep(!$count{$_}++, @array);
}
みたいな華麗な手法があるなら知りたいです。
356:デフォルトの名無しさん
09/03/20 03:24:57
@count{@b} = @b;
@array = grep(!defined($count{$_}), @a);
357:デフォルトの名無しさん
09/03/20 05:09:05
@c = grep{!((join ',', @b) =~ /(?:^|[^0-9])$_(?:[^0-9]|$)/)} @a;
すごく…力わざです…
358:デフォルトの名無しさん
09/03/20 06:47:02
>>355
みたいなじゃなくてそれ使えよ
359:デフォルトの名無しさん
09/03/20 16:49:14
>>355
use Array::Utils;
@a = ('1','2','3','4','5','6');
@b = ('2','3');
@c = Array::Utils::array_diff(@a, @b); # (1,4,5,6)
360:デフォルトの名無しさん
09/03/20 16:52:41
>>359
最近ではそういうのを華麗というのか?
361:デフォルトの名無しさん
09/03/20 17:25:05
モダン(笑)
362:デフォルトの名無しさん
09/03/21 21:33:12
教えてください。恥ずかしいんですが...
sample.html
--------------------
<html>
2009-03-20
</html>
--------------------
yyyy-mm-dd.pl
--------------------
#!/usr/bin/perl
use Time::Local;
($s, $mi, $h, $d, $mo, $y, $w) = localtime(time);
$lastupdate = sprintf("%04d-%02d-%02d", $y + 1900, $mo +1, $d);
$yesterday = sprintf("%04d-%02d-%02d", $y + 1900, $mo +1, $d-1);
s/$yesterday/$lastupdate/g sample.html;
--------------------
363:362
09/03/21 21:34:06
(続き)
sample.html内の2009-03-20を2009-03-21に置換したいのですが、
これじゃだめなんですよね? どうしたらいいでしょうか。
ちなみに、ワンライナーっていうんですよね、それで
$ perl -i -p -e 's/2009-03-20/2009-03-21/g;' sample.html
みたいにすると置換できましたが、s/foo/bar/のfoo, barの部分に
変数を使いたいんです。
目的は、社内LANで公開しているweb(html)内の最終更新日時の表示を、
ちょっとした理由から、毎朝午前5時とかに、その日の日付に変えること、です。
よろしくお願いします。
364:デフォルトの名無しさん
09/03/21 21:45:51
>>363
javascriptじゃだめなの?
365: ◆TWARamEjuA
09/03/21 21:51:44 BE:3484984-BRZ(10001)
04月01日だと、$yesterdayに04月00日が生成される伊予柑♪
366:362
09/03/21 22:00:24
しくしく。。。いじわるですね。。。というか遊ばれていますね。。。
javascriptでもいけるんでしょうか。
それから、おっしゃるとおり04月00日になりそうですね。
perlで行くとしたら、そこは勉強して、何とか回避策を考えようと思います。
WSH, perl, あと何だろう、いくつか候補を考えたのですが、perlは
まったくといっていい初心者です。sedも。正規表現は理解はしている
つもりですが使ったことがあまりないです。
どんな手段でもよいのですが、何となくperlがよさそうだと思って、
この板に来てしまいました。。。
あらためて、どんな手段(言語、手段、ツール)がいいかを含めて
教えてください。<(_ _)>
367:デフォルトの名無しさん
09/03/21 22:11:34
>>362
1) SSIで最終更新日時を書くのが楽
2) Perlでやるなら、File::Slurpで読んでDateTimeで計算するのが楽
かね。
そもそも、
A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいいのか、
B) sample.htmlの最終更新日時をただ表示すればよいのか(上記1.でよい)、
そのあたりの要件がはっきりしません。
更新日時についても、営業日でなくて暦日で良いのか、とか。
ちょっとまってね、これから書くから。
368:デフォルトの名無しさん
09/03/21 22:15:53
明らかにSSIが楽。
369:デフォルトの名無しさん
09/03/21 22:19:42
# YYYY-MM-DDをその翌日に置き換える場合
# ただし13月32日とかも引っ掛かって甘いので注意
# しかも、最終更新日以外でも、くだんの正規表現に引っ掛かった値が変換されるので注意
use strict;
use warnings;
use File::Slurp;
use DateTime;
my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして
my $file = read_file($file_name, array_ref => 1);
LINE:
foreach my $line (@$file) {
$line =~ s{
(\d{4}) - (\d{2}) - (\d{2})
}{
DateTime->new(year => $1, month => $2, day => $3)
->add(days => 1)
->ymd();
}xmse;
}
write_file($file_name, $file);
370:362
09/03/21 22:19:54
すみません...
そもそも、から行きますと、
A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいい
です。
営業日ではなく暦日でOKです。
土日祝日もインフラが停止しなければ365日毎朝更新したいです。
というのは、会社のデータベースからあるまとまった形のデータを
Excel形式で落としてきて、それにパスワードをかけて、所定のフォルダに
アップロードし、それを地方拠点にイントラウェブで提供します。
最終更新日を更新したいというのは、そのアップロードの案内ページなんです。
データを落としてきて、パスワードをかけて、所定のフォルダにアップロード
するところまでは、マクロとMS-DOSのバッチファイルとタスクスケジューラと、
恥ずかしいうにょうにょなやり方でどうにか実現しました。
が、そうしたところ、案内のhtmlファイルも自動で日付を変えられるだろうと、
偉い人から言われまして...
371:369
09/03/21 22:22:40
Template-Toolkit(Template)とかHTML::Templateを使う手もあるね。
ただ、>>370の書き方を見ると、
土日でもアップロードされたデータが更新されているなら、
touch sample.html
してアップロード案内ページだけ最終更新日時を変えれば、
A)はB)と同じになるよね。
そうすればSSIでもやれるんじゃないかな?
372:362
09/03/21 22:22:46
>>369さんありがとうございます。
さっそく明日試してみます。
SSIについては鯖管さんに相談してみます。
そういうとこ、小回りのきかない、相談窓口も親身になってくれない
会社です。。。
373:369
09/03/21 22:26:43
うい、367=369=371れす。
鯖管は別なのか……。
まあ、SSIを検討してみてよ。日曜なのに大変だね。
もしPerlでどうしてもやりたいなら、>>369を使う場合、
DateTimeとかFile::Slurpは標準では入っていないから、
CPANから導入出来るかも聞いておいて。
374:デフォルトの名無しさん
09/03/21 22:29:14
あー、LINE:も要らないし(逐行処理の名残)、そもそもよく考えたら
my $file = read_file($file_name, scalar_ref => 1);
して
$file =~ s{略}{略}xmseg;
すりゃよかったか。
しつこくてごめん。
375:デフォルトの名無しさん
09/03/21 22:33:23
さらにしつこいが、scalar_refするなら$$fileを置換に突っ込むんだった罠。
チラ裏。
>>322が気になった今日この頃。比較表とかないかな?
376:362
09/03/21 22:40:12
重ね重ね、ありがとうございます。
日付を表記するのに、yyyy-mm-ddは、そのhtmlファイルでその更新日の
部分だけにしてあります。よくわからないなりに、ここだけは見つかるように、
ここだけの形にしておかなければいけないだろうと思いました。
CPANからの導入についても明日確認してみます。
正規表現の本もperlの本も、いつか勉強しなければと積ん読になっています。
(恥ずかしながら)
ところで私、普段はぜんぜん違う板の住人です。切羽詰まってここに来ました。
こんなに速くレスをいただけるとは思っていませんでした。
本当にありがとうございます。
perl、勉強しますね。今はお金とか在庫とかの勘定ばかりやっていますが、
小学生の頃はベーマガとかで勉強したクチです。
おやすみなさい。
377:デフォルトの名無しさん
09/03/21 22:41:04
PBPとtokuhiromの受け売りだが、
13月32日に引っかけないためにはRegexp::Commonを使おう
378:デフォルトの名無しさん
09/03/22 00:28:52
>>369
これはちょっとマズいんじゃないの?
コメントでは YYYY-MM-DD と書いてるけど、実際の処理が
\d{4}-\d{2}-\d{2] では、全然年月日じゃない文字列にもマッチしかねない。
もちろん年月日かどうか完璧な判定はできないけど、
>>362 にあるようにマッチさせる文字列が昨日の日時でいいなら
そういう風に限定すべき
379:デフォルトの名無しさん
09/03/22 01:19:26
某所で再びFizzBuzz問題がはやっているようなのでPerlで書いてみました!添削してください!
perl -e 'for ($n=1;$n<16;$n++) {my$res;!(($n%3||($res="Fizz"))&&($n%5||($res=$res."Buzz")))||($res&&print "$res\n")||(print "$n\n");}'
380:戦犯369
09/03/22 02:48:29
>>378
thxです。
ついでに、sample.htmlのエンコードを考慮してみた。
# UTF-8(BOMなし)で保存してね
use strict;
use warnings;
use utf8;
use DateTime;
use Encode::Guess;
use File::Slurp;
# ファイルの中身を変数に突っ込む
my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして
my $file = read_file($file_name, scalar_ref => 1);
# ファイルのエンコードを類推して、UTF-8に変換する
# 決め打ちならこんなことをせず、use Encodeしてdecode, encodeする
my $encoding = guess_encoding($$file, qw(cp932 euc-jp utf8));
die "Can't guess"
unless ref $encoding;
if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') {
$$file = $encoding->decode($$file);
}
# 昨日のYYYY-MM-DDを得る
my $yesterday = DateTime->now(time_zone => 'local')
->add(days => -1)
->ymd();
# つづく
381:戦犯369
09/03/22 02:49:50
# つづき
# >>362式なら
# my (undef, undef, undef, $day, $month, $year) = localtime();
# my $yesterday = sprintf("%04d-%02d-%02d", $year + 1900, $month + 1, $day - 1);
# ファイルの中身で昨日のYYYY-MM-DDに合致すれば変換する
$$file =~ s{
($yesterday)
}{
# ファイルに書いてある最終更新年月日(昨日)を、
my ($year, $month, $day) = split q{-}, $1;
# 翌日(つまり今日)に変換する
DateTime->new(year => $year, month => $month, day => $day)
->add(days => 1)
->ymd();
# >>362式なら
# sprintf("%04d-%02d-%02d", $year, $month, $day + 1);
}xmseg;
# ファイルのエンコードを元に戻す
if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') {
$$file = $encoding->encode($$file);
}
write_file($file_name, $file);
__END__
まあ、
SSI > テンプレート使用 > ベタ置換
の順が楽なんだろうけど。
382:デフォルトの名無しさん
09/03/22 02:57:58
なにを持って善しと成すのかわからんけど、俺も作ってみた
perl -e 'for(1..15){my$r;$_%3or$r="Fizz";$_%5or$r.="Buzz";$r or$r=$_;print"$r\n"}'
添削してくだちぃ
383:デフォルトの名無しさん
09/03/22 03:12:33
個人的には、勉強するためならいきなりCPANに頼るのはどうかと思った。
いきなりDateTimeを使わずにsprintfでやった方がいいし、
いきなりFile::Slurpを使わずにopen関数を使った方がいいと思うけど、
面倒くさすぎて放り投げられるとPerlスキーとしては寂しいので、
CPANに依存してみた。今は反省している。
FizzBuzzについては、
1. 要件を実現出来ているんなら、
2. ワンライナーなら、
3. FizzBuzzでゴルフしたり難読化選手権を開くんじゃなければ、
多少腕白でもいいと思うけどね、俺は。
敢えてPBP的に見ても、
a. C的なforでなくforeachを使おうとか、
b. $_でなくてちゃんとforeach my $num (1 .. 15)にしようとか、
c. ""で括らなくていいときは''で括ろうとか、
そんなつまらない指摘しか出来ないけど。
あとはあれか、>>379なら、C的なforをどうしても使うときは、
$n <= 15の方が直感的とかか。
384:デフォルトの名無しさん
09/03/22 03:20:37
あ、うそ、ごめん。
>>381の二つめの>>362式は、3月32日になるw
ゆえに素直にDateTime使おう。
385:379
09/03/22 03:36:54
>>382-383
ありがとうございます!>>382さんのコードの方がPerlっぽくていいですね。
ぼくのはJavaとかでも使えるテクしか使ってないや。
最近Perlはワンライナーしか書かなくなってさっぱり鈍ってしまった。
386: ◆TWARamEjuA
09/03/22 10:10:15 BE:6861097-BRZ(10001)
1日前ってそんなに難しいのかしら?
time - 86400
でよさそうな。。。
387:デフォルトの名無しさん
09/03/22 10:34:11
うるう秒をちゃんと扱わないシステムならな
388:デフォルトの名無しさん
09/03/22 11:15:10
>>387
UNIX時はどれも閏秒は算定してないと思うが。
システムによって現在のUNIX時が食い違ったら困るだろ。
389:デフォルトの名無しさん
09/03/22 13:00:39
超頭悪い会話が繰り広げられている
390:デフォルトの名無しさん
09/03/22 13:15:46
>>389
>>389
391:362
09/03/23 05:38:24
おはようございます。
ご報告が遅くなりました。
>>381さんに教えていただいたスクリプトを昨日、会社で使って
(ファイル名など一部変えました)、まだ1日(1回)だけですがテストとしては
うまく動いたようです。
今朝出社してうまく書き換わっているかどうか。これから出勤です。
うまくいったら引き続き使います。
ではみなさま、また縁がありましたらどうぞよろしくお願いします。
392:デフォルトの名無しさん
09/03/23 07:49:00
>>389
仕様上はどちらでもいいことになっているが、先発製品との互換上、
どのシステムもうるう秒は算定していない。
うるう秒はいつ発生するか算定できないからどっかから情報取得する必要があるし、
tarファイルを移転する時とか、NTP使う時とか困るだろ。
よほど金融系のシステムとかでなければ、NTPクライアントを随時走らせておけば大きな支障はない。
393:デフォルトの名無しさん
09/03/23 09:22:29
いちおうtzfile(5)とか見ればわかるけどうるう秒扱えるようにはなって
いるんだよね。
実用上はうるう秒のたびに時計を進めたり戻したりして1日の秒数は
一定としてしまうのが楽な場合がほとんどだから設定した例は自分の
周りでは見たことない。
天文とかは過去のある時刻との間の時間みたいのをきっちり出せない
と困りそうだけど。
394:デフォルトの名無しさん
09/03/23 09:23:10
うるう秒を勘案するシステムは存在しないってこと?
395:デフォルトの名無しさん
09/03/23 13:06:04
>>394
一般的なUNIXtimeの扱いの話であって、
そういったシステムが存在しないとは誰も言ってない。
極端な話、協定世界時を管理してるシステムなんかは当然勘案しなきゃ困るでしょ。
396:526
09/03/24 19:51:11
ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。
debian etch の上で、perl-tk をいれて触っています。
どうにも日本語が表示されませんので、どなたか詳しい人、アドバイスをお願いします。
perlは、 v5.8.8
perl-tkは、804.027-7
です。
よろしくお願いします。
397:デフォルトの名無しさん
09/03/25 04:25:03
エスパーじゃないんだからさ、それじゃ答えようがないよ。
とりあえず>>4
あとやったこと書け
398:デフォルトの名無しさん
09/03/25 14:49:23
ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。
昨日から体の具合が悪いんですが、何かの病気でしょうか?
どなたか詳しい人、アドバイスをお願いします。
どんな薬を飲めばいいですか?医者に診せたほうがいいですすかね・・・
何科の医者に行けばいいですか?
よろしくお願いします。
399:デフォルトの名無しさん
09/03/25 14:53:25
エスパーじゃないんだからさ、それじゃ答えようがないよ。
400:デフォルトの名無しさん
09/03/25 17:06:54
@test
赤、A、あ、 #$test{0}
黄、A、い、 #1
青、A、あ、 #2
赤、B、あ、 #3
赤、C、い、 #4
青、A、あ、 #5
例えばこういう配列があったとして
各項目ごとに一番多い文字列(赤 A あ)をそれぞれ取り出したいんですがどのようにすればいいんでしょうか?
401:デフォルトの名無しさん
09/03/25 17:28:24
「こういう配列」
402:デフォルトの名無しさん
09/03/25 17:36:06
>>400
my @dat = ( 'red,A,a', 'yellow,A,b', 'blue,A,a', 'blue,B,a' ) ;
my @cache ;
for ( @dat ){ my $cnt = 0 ; $cache[$cnt++]->{$_} ++ for split /,/ ; }
printf "%s\n", sort { $_->{$b} <=> $_->{$a} } keys %{$_} for @cache ;
日本語? => 自分で考えて
同じ個数の物があったら? => 知らん。
403:デフォルトの名無しさん
09/03/25 23:32:24
○○.cgiのプログラムで、
「exec △△.pl $param1」とexecを使用して呼び出しても、
呼び出し先の△△.plが実行されないです。
環境が原因と思うのですが、
初心者で何が原因かわからないです。
404:デフォルトの名無しさん
09/03/26 12:16:36
>>400
二次元配列のようでもあるし、コメント見るとハッシュにしてるし…
せめてPerlの書式で書いてくれ
405:400
09/03/26 18:21:17
>>402
レスありがとうございます。
ただちょっと仕様を変更したので、普通の配列の中から一番多い要素を取り出すものに変えようと思ったのですが、
初心者なため>>402のコードでわからない部分があり、改良することができません。
どなたか配列の中で一番多い要素を取り出すサブルーチンを書いていただけないでしょうか。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5389日前に更新/164 KB
担当:undef