Perl初心者スレ(マジレス回答)
複数のRSSフィードを結合して一つのRSSを生成したい。 その際、「生成されたフィード記事のリンクURLすべてを任意のリンク先に指定する。」 このやり方を教えてください。 XML::FeedPP、XML::TreePPというモジュールを用い、下記のCGIプログラムを使用して自動更新する1つのフィードを生成するところまでは出来ました。 しかし、他の部分はチョロチョロと変えることができるのですが、記事リンクだけはどうしても変えることができません。全部の記事リンクを、ある1つのリンクに変換したいだけです。 #!/usr/bin/perl use XML::TreePP; use XML::FeedPP; my $feed = XML::FeedPP::RDF->new(); $feed->merge( "結合したいrssフィード1" ); $feed->merge( "結合したいrssフィード2" ); my $now = time(); $feed->sort_item(); $feed->pubDate( $now ); my $atom = $feed->to_file( "index.rdf", "UTF-8" ); print "Content-type: text/plain\n\n"; print "出力完了\n"; 使ってるレンタルサーバーはロリポップです。 複数のフィード(RSS、Atomなど)をまとめるCGI http://blog.audiofan.net/archives/491385.html [Perl] XML::FeedPP - RSS・RDF・Atomフィードの解析・生成・変換・結合 http://www.kawa.net/works/perl/feedpp/feedpp.html XML::FeedPP https://metacpan.org/pod/XML::FeedPP#feed-remove_item-index-or-link http://search.cpan.org/ ~kawasaki/XML-FeedPP-0.43/lib/XML/FeedPP.pm ttp://s1.gazo.cc/up/88224.jpg こういった10行で一組のデータの中に --- 市民の... yerles warrior --- というパターンが多くあります。 マッチ検索したいのは --- 市民の... dog warrior --- というパターンです。 "市民"という文字を見つけたら 2行下に "dog"という文字があるならば その、"市民の..."を出力して欲しいです。 ファイル読んで単純マッチするぐらいしか今はできません open (my $in , "<" , "./cdatan_5_101.s2"); while (<in>){ if (/yerles/){print "matched\n"} } close $in; } 凄い。ありがとう。 出てきたshiftとか勉強してみます 感謝 どこにshiftの出番があるのか?と思ったらそう言うことか。 普通に配列に突っ込んで、マイナスのインデクスでアクセスすりゃいいやん。 $ perl -Mvars=@a -lne 'push @a, $_ ; next if !/dog/ ; next if $a[-3] !~ /市民/ ; print $a[-3]' File メモリ喰いが気になるのなら、 $ perl -Mvars=%h -lne '$h{$.} = $_ if /市民/ ; next if !/dog/ ; next if ! defined $h{$. - 2} ; print $h{$. - 2}' File とか、で節約すりゃいい。、、、けど、今時そんなの気にする必要もないだろ 上のワンライナーでやってる事は、 $ perl -MO=Deparse -Mvars...略 でわかる。 恰好をつけるなら、リングバッファでも書くところですが、回答としては、あんまりだと思ったので。 2行固定なら、別に使わなくても。 perl -ne '($_, $x, $y) = ($x, $y, $_); $y =~ /dog/ && /市民/ && print' File 何も考えなくていいなら、正規表現でバッサリ。 perl -e 'print((local $/ = <>) =~ /(^.*市民.*\n).*\n.*dog/gm)' File >>300 1ヵ月以上もお前のレスにレスがつかないのはなぜか分かる? お前みたいなゴミクズは誰も必要としてないからだよ。 一般社会ではあからさまに無視するわけにもいかないから当たり障りのない対応をしてもらってると思うけど、 お前ハッキリ言って迷惑だから。 ゴミクズはネットでもリアルでもできるだけ社会と接点持つな。 Test Summary Report ------------------- t/config-finder.t (Wstat: 512 Tests: 0 Failed: 0) Non-zero exit status: 2 Parse errors: Bad plan. You planned 26 tests but ran 0. Files=86, Tests=923, 636 wallclock secs ( 2.64 usr 1.67 sys + 247.77 cusr 297.98 csys = 550.05 CPU) Result: FAIL Failed 1/86 test programs. 0/923 subtests failed. Makefile:945: recipe for target 'test_classic' failed make: *** [test_classic] Error 255 PETDANCE/ack-2.12.tar.gz /usr/bin/make test -- NOT OK //hint// to see the cpan-testers results for installing this module, try: reports PETDANCE/ack-2.12.tar.gz Running make install make test had returned bad status, won't install without force Failed during this command: PETDANCE/ack-2.12.tar.gz : make_test NO Windous上のcygwinとLinuxでCPANのackをインストールしているところでつまずきました 上のエラーはcygwinの方のエラーです これは、curlを使えば回避できるそうですが http://d.hatena.ne.jp/katz_24/20130210/1366387522 setup.exeを利用したインストールでも何故かインストールができずに手詰まりになりました ack-2.12.tar.gz を回答してみても訳が分かりません ackをインストールする手はありますか? make test had returned bad status, won't install without force まけ出来てるのならいんすこ自体は可能 force installでcygwinの方に入れました 正常に動作します ありがとうございました Linuxの方は、手っ取り早く sudo aptitude install ack-grep しました おかげさまで両方にackが揃いました 感謝します xmlを取得して中身を s|。|。<br>|g; して句読点ごとに改行させたかったのですがどうしても出来ません なにか理由があるのでしょうか 初心者なもんで変な質問をしていたらすいません エスパーじゃないんだから、そんな質問で答えれる訳ないだろ。 せめてサンプルとなる簡単なxmlを出せよ・・・ 申し訳ないです >>306 デコードはしています >>307 申し訳ありません wikipedia.simpleapi.net/api?keyword=Test&output=xml >>308 テストした結果、普通に置き換えできます。 取得方法に問題があるんだろう。 ってか、こんな質問の仕方じゃスレ全部埋まるわ・・・ 問題が起きてるサンプルコード出してみ >>308 ちげーよ utf8のファイルをeucのスクリプトでマッチしようとしたんじゃないの、ってこと >>310 shift-jisのスクリプトでマッチさせようとしました 不味かったでしょうか >>311 なら、どっちかの文字コードにencodeして合わせる > perl -e "print (5+5)/3" 10 なんで? print -e "print((5+5)/3)" >>314 http://perldoc.jp/docs/perl/5.18.1/perlfunc.pod > 括弧を使うときには、単純な、(しかし、ときには驚く結果となる規則が 適用できます: > 関数に見えるならば、それは関数で、優先順位は関係ありません。 (略) > Perl に -w スイッチを付けて実行すれば、こういったものには警告を 出してくれます。 2000年には既にwarnings実装してんのに なんで未だに、-w推薦文章なんか残してんだろーね? -Mwarningsのエイリアスって訳でもねーし。 【誤】print -e "print ((5+5)/3)" 【正】perl -e "(print(5+5)) / 3" ついでに -w と -Mwarnings は別物。-Mwarnings で -w の代わりになるわけではない。 >>318 -w ≠ warningsは常識だろ。 で、「use Unicodeは、use Jcodeの代りじゃない」ってレベルの事を言ってるぞ、おまえさん。 -wが石頭だから、より制御しうるwarningsを実装したんだろが。 5.20のperllexwarnがスッキリしててワラタ。 再帰中に再帰の深さを出したいんだけどlocal使っていい? local $::count = $::count + 1; もっと普通の方法ある? 引数で渡す sub foo { my ($arg, $count) = @_; ...; foo($arg, $count) if $count++ < 10; } ありがとーーー。 複製される変数の数には変わりがないよね、たぶん。 上はグローバル変数と言うのが気に入らなくて、下は引数で扱う値が増えるのが気に入らないが。 while(@all){ ((shift @all) eq 'cut') and last; } whileを修飾子として書くと落ちるんだが誰か理由を教えてくれー ((shift @all) eq 'cut') and last while(@all); evalでも落ちた 英数混じった文字列の中から2桁の数字にマッチさせたいのですが、 /\d\d/だと3桁以上の数字の前2桁にもマッチしてしまいます。 /^(\d\d)\D|\D(\d\d)\D|\D(\d\d)$|^(\d\d)$/ こんなことするより簡単な方法ないでしょうか? % perl -le 'print q{22} =~ /[^\d]\d{2}[^\d]/' % perl -le 'print q{22} =~ /(?<!\d)\d{2}(?!\d)/' 1 % perl -le 'print q{22} =~ /(?:^|\D)\d{2}(?:$|\D)/' 1 /(?<!\d)\d{2}(?!\d)/ これが期待通りの結果が得られました。 (?<!)とか(?!)とかこれまで使ったこと無かったので勉強になりました。 ありがとうございました。 以下のような日付が下から上に並んでいるoriginal.txtがあるとします。 これを、日付を逆順にしたoutput.txtに整形するプログラムを作りたいです。 Windowsで、Batch fileとPerlで作れたらと考えています。よろしくお願いします。 <original.txt> ########## 20141203 ########### DNINITIENK FDKHJKDKKSK ・・・・・ ########## 20141202 ########### TUNINJKDF NIGHALKDK ・・・・・・ ########## 20141201 ########### ABCDEFGHIJKE LMNOPQRSTUV ・・・・・ <output.txt> ########## 20141201 ########### ABCDEFGHIJKE LMNOPQRSTUV ・・・・・・ ########## 20141202 ########### TUNINJKDF NIGHALKDK ・・・・・・ ########## 20141203 ########### DNINITIENK FDKHJKDKKSK ・・・・・・ >>332 \bだと英字と数字の境目は単語の区切りにならないみたい。 centosで元から入ってるperlとは別にソースインストールしたperlを別に入れました。 新しくインストールしたperlで以前から入っていたCPANモジュールを使いたい場合、再度入れなおす必要ありますか? >>334 perl -Mvars=%h -ane '$a = $F[1] if @F == 3 ; $h{$a} .= $_ }{ print $h{$_} for sort { $a <=> $b } keys %h’ original.txt >>336 モジュールの共用は避けるべき >>334 use 5.016; use warnings; my $boundary = qr/^#+\s+\d+\s+#+\s*$/; open(my $in, "<", "original.txt") or die; my @data; my $chunk = ''; while(<$in>){ if (/$boundary/ and (length($chunk) > 0)){ push @data, $chunk; $chunk = ''; } $chunk .= $_; } if (length($chunk) > 0){ push @data, $chunk; } $in->close; open(my $out, ">", "output.txt") or die; $out->print(reverse @data); $out->close; 単純に逆にするだけか perl -00pe '$_ = join q{}, reverse ( split /(?=^#)/m)' my $initial_title_ = "\$" . "$initial_threads" . "_begin"; $initial_title_ = eval $initial_title_; 1行に短くなりませんか? my $initial_title_ = eval "\$${initial_threads}_begin"; こういうこと? >>342 ありがとう eval使うのが3つあったから 6行が3行になったよ $seach_wordに日本語を入れたいのですが、それだとマッチしません。どうすればよいでしょうか? w3m -dump -cols 160 http://peace.2ch.net/test/read.cgi/tech/1349538519/ | ~/Perl_instance/resSearch.pl #!/usr/bin/env perl use strict; use warnings; use utf8; my $seach_word = ">1" ; my $found_res = 0; my $res = ""; while (<>) { if (/^\d/x) { # out put, flash if ( $found_res == 1 ) { print $res; $found_res = 0; } $res = ""; } else { # searching if (/$seach_word\b/x) { $found_res = 1; } } # buffer lines $res .= $_; } あ、 binmode STDIN , ":utf8": で binmode STDIN , ":utf8"; binmode STDOUT , ":utf8"; my $seach_word = "日本語" ; で同様のコマンド叩いて、つまり344が拾えるはずが 何故かヒットしません <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> w3m -dump -cols 160 http://peace.2ch.net/test/read.cgi/tech/1349538519/ |nkf -g UTF-8 UTF-8しか扱わないのにちょっとエンコード回りは複雑だ webサイトの表形式データ(横方向は5列、縦方向は不定で100行ぐらい)を取得するのに、 正規表現の繰り返しマッチング m//g を使って、結果を配列に入れてるんだけど、 もっと簡単に取ってくるモジュールはないでしょうか? >>350 >webサイトの表形式データ の形式が分からんとなんとも。 >>346 ヒント助かった。 use Encode qw/encode decode/; my $enc = 'UTF-8'; sub d($) { decode($enc, shift) } sub e($) { encode($enc, shift) } my $seach_word = "日本語"; my $found_res = 0; my $res = ""; while (<>) { if (/^\d/x) { if ( $found_res == 1 ) { print $res; $found_res = 0; } $res = ""; } else { my $seach_word_ = e$seach_word; if (/$seach_word_/x) { $found_res = 1; } } $res .= $_; } >>350 >>351 例えば、こんな表です http://ke.kabupro.jp/hist/20150107.htm 今はHTMLのソースを見て、証券コードを正規表現で抽出するために、 =~ m!<tr><th><a\shref[^>]+>(\d{4})<\/a>!ig などとして配列へ入れているのですが、泥臭いです。 もっとスマートに取得できるモジュールは無いかと思った次第です。 (続き) 例えば統計計算用のRでは readHTMLTableというモジュール(パッケージ?)があり、表形式のデータを含んだurlを指定すれば、簡単に取得出来るのですが。 >>353 HTML::TableExtract http://search.cpan.org/ ~msisk/HTML-TableExtract-2.12/lib/HTML/TableExtract.pm Web::Scraper http://search.cpan.org/ ~miyagawa/Web-Scraper-0.38/lib/Web/Scraper.pm my $tmp = { $a => sub { $_ = 処理A}, $b => sub { $_ = 処理B}, $c => sub { $_ = 処理C}, }; ループ中に↑のように書いている場合、一つの変数に対して複数の処理($a に 処理A' を追加)を 加えたい場合、どのように書くのでしょうか? 凄い初歩的な質問だと思うのですが真剣に行き詰まってます 教えてください _HOGE_ こんな表記の変数ってなんて表現するんですか? またネットでこういう変数について調べたいときは、 どのように検索したらヒットしますでしょうか。 Perl __ で検索しても全然それらしい記事が発見できず _HOGE_は変数じゃないからヒットしないのが正解 もしかして:ヒアドキュメント なるほど・・・独自のプログラム記述なんでしょうかね・・・ Perlの変数記述方法じゃないことがわかって少し安心しました もう一回解析してきます >>361 さんの回答で先入観が排除され、 意味がわかりました。 $mes =~ s/_HOGE_/$name/g; 文字列に埋め込まれた_HOGE_を別の変数に代入されてる文字列と置換させていました。 ありがとうございました。 なんでも受け付けるからって、 __HOGE__ をヒアドキュメントとして使ってる人は、単に 特殊リテラルを理解してない人。 質問に超絶遅レスするなら、 __HOGE__は、ほんとうに HOGE と書かれていたなら、 特殊リテラルのまねっこ。 DATA, END などなら、perldoc.jp で perldata から「特殊なリテラル」の項を 参照すること。 ヒアドキュメントのデリミタを print <<die; dieなんてしないよ die ってしたら混乱するでしょ。それと同じレベルで特殊リテラルの 記載に類似(もしくはそのまま)させて使ったら、あかんでしょ。 print <<__END__; dieなんてしないよ __END__ って主旨? 絶対にありえない単語を区切りにしないと、区切りとしての役目にならんだろが __END__を区切りにしてしまったら、__END__という単語が使えなくなるだろ じゃあ __HOGE__ にするわ。絶対ありえん単語だし。 >>368 実行してみろよ、動くぞ。 use strict ; use warnings ; while(<DATA>){ print ; } print <<__DATA__; これがヒア __DATA__ __DATA__ 特殊リテラル ID.パス付きのHPの更新通知プログラムをつくり実行したところ (certificate verify failed)とハマりました。 おそらくSSL関係でつまっています。 簡単に教えてくれる方お願いします。 $mech->get('https://*****' ); ↑指摘されたラインです SSLかと思うのですが、SSLについて知識があまりないため、 ダメだった理由をわかりやすく教えていただけませんか? あと、ユーザーIDやパスワードの前にpitgetを書いてあると どうなるのでしょうか? 説明下手でごめんなさい。 特定のディレクトリ(test)からファイルを読み込む処理を 実装しようと思っています。 while(<./test/*>){ #〜ファイル読み込み処理 } はOKなのに $hoge = "./test/*"; while(<$hoge>){ #〜ファイル読み込み処理 } がうまくいかない理由はなぜなのでしょうか? $hogeを可変にしたいのですがどうすればよいでしょうか? 突然の質問で申し訳ありませんが、宜しくお願いします。 $hoge = "./test/*"; これは文字だからです。(演算子に対するアドレス(ポインタ)ではありません)。 $hoge = "test"; while(<./$hoge/*>) >>373 出来ました!ありがとうございます 今日かなり悩んでいました おかげ様でスッキリしました 下のようにリストのリストを作成したいがcpanか何かで実現できないでしょうか? > (list (list 1 2) (list 3 4)) ((1 2) (3 4)) > (first (list (list 1 2) (list 3 4))) (1 2) > (second (list (list 1 2) (list 3 4))) (3 4) my @car = (1, 2); my @cdr = (3, 4); my @both = (@car, @cdr); print "\@car is @car\n"; # -> @car is 1 2 print "\@cdr is @cdr\n"; # -> @cdr is 3 4 print "\@both is @both\n";# -> @both is 1 2 3 4 printf "%s\n" , $both[0]; # -> 1 printf "%s\n" , $both[1]; # -> 2 printf "%s\n" , $both[2]; # -> 3 printf "%s\n" , $both[3]; # -> 4 Lisper な人? 多分、こういうことをお望みかな。 #!/usr/bin/perl use Data::Dumper; my @car = (1, 2); my @cdr = (3, 4); my @both = ( \@car, \@cdr); print( Dumper( \@both)); ごめん、アクセス方法も書かなきゃね。 #!/usr/bin/perl my @car = (1, 2); my @cdr = (3, 4); my @both = ( \@car, \@cdr); print("$both[0]->[0]\n"); print("$both[0]->[1]\n"); print("$both[1]->[0]\n"); print("$both[1]->[1]\n"); >>377 ありがとう perlのリファレンス表記がこの機会に少し分かりました my @car = (1, 2); my @cdr = (3, 4); my @both = ( \@car, \@cdr); print("$both[0]->[0]\n"); print("$both[0]->[1]\n"); print("$both[1]->[0]\n"); print("$both[1]->[1]\n"); print("@{$both[0]}\n"); print("@{$both[1]}\n"); 971 名前:名無しさん@七周年[] 投稿日:2006/11/11(土) 00:56:10 ID:M8+ahUZV0 自称スーパープログラマー某 強烈加齢臭 メール見ない メール無視 ドキュメント見ない ドキュメント無視 説明聞かない 説明無視 話聞かない 話無視 ガム→むっちゃー むっちゃー むっちゃー むっちゃー 煎餅→バリバリバリバリバリバリ 菓子パン→モグモグモグモグモグモグモグモグモグモグ カップアイス→むっちゃー むっちゃー ペロペロペロペロ フロアすべてに響き渡る 超ばかでかいくしゃみ 当然手でおさえない 異音と異振動 ドスーン!ドスーン! ドカーン!ドカーン! バコーン!バコーン! ズドン!ズドン! 机が近いとマウスポインターが飛ぶ 誤操作誘発 書類だしたりしまうだけでドカンドカン 30秒ごとに口と鼻から異音 ふんっっ! ふんっっ! 備品破壊 貸与P C 破壊 他人のもの破壊 奴の作ったスクリプトとプログラムは使えない バグ製造機 電話や共有携帯電話 キーボードが油ベタベタ 奴に電話とPCとコンソールは触らせてはいけない HTMLファイルの特定文字列を大文字から小文字へ置き換えたいです。 具体的には、name= あれ、途切れちゃったのでダブルクォートでおかしくなったので、無しで書きます。 HTMLファイルの特定文字列を大文字から小文字へ置き換えたいです。 具体的には、name=A10AB を name=a10ab とnameの部分のみ置き換えたいです。 s{ name=" ([^"]+) " }{ 'name="' . lc($1) . '"' }egx >>382 eで関数を使えるんですね。ありがとうございました。 perl コマンドラインからモジュールを読み込みたいんですが、 perl -mM Win32::Clipboard -e "" だと Can't open perl script "Win32::Clipboard": Invalid argument と怒られます。 Perl64\lib\Win32\Clipboard.pm は存在しているのですが・・・ なんで -m と -M 重ねてるの?それと隙間開けずにやってみ -MWin32::Clipboard ↑ perl -mM Win32::Clipboard だと M.pm を読み込んだ後 Win32::Clipboard という名のファイルをperlスクリプトとして実行しようとしてるっぽい >>385 できました。 ありがとうございました。 どうでもいいけど、質問の回答に「なんで○○なの」と質問で返すのはみっともない わからないから質問してるのにね ここは初心者スレだし よっぽど回答に自信が無いように見える なんで? なんで? なんで? ことあるごとに、「なんで」っていうヤツ バカっぽい イライラする ムカツク >>389 「なんで」を追求する楽しさがわからないの? 質問を質問でかえすやついるよな 俺「なぜ変更したんですか?」 先輩「なぜ、その変更に疑問を抱くの?」 ・・・ 文脈にもよるわな マニュアルにはっきり書いてあるようなことと違うことやっているなら「お前ちゃんと読んでないのか?」ってなるし どう説明したら理解できるのか探るためにどう考えてどこに疑問を持ったのか確認することもあるし そういう文脈を無視して 質問したら質問が返ってきた = おかしい は短絡的だね >>392 めんどくさい人って思われてるよw 誰もあんなに聞きにこなくね? read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる