Écrivez un morceau de code pour sortir le numéro de ligne de l'instruction d'impression / sortie elle-même (sous la forme «Bonjour tout le monde, de la ligne X!»)

25

Le défi

Écrivez un programme qui génère Hello World, from line X!, où Xest le numéro de ligne, dans le code source, de l'instruction d'impression proprement dite.

Les règles

  • Dans ce contexte, nous voulons que le premier numéro de ligne de l'instruction qui produit la chaîne soit affiché pourstdout
  • Vous devez éviter de simplement chercher dans votre code source sous forme de chaîne (fichier ou quine) pour trouver le numéro de ligne
  • Si des espaces ou des instructions supplémentaires (qui n'interrompent pas le flux du code) sont ajoutés au code source, ils doivent être reflétés au moment de l'exécution (après la compilation, le cas échéant)

Recommandations

Si fourni par le langage, vous pouvez utiliser des exceptions / traces de pile pour atteindre cet objectif. Faites de votre mieux pour utiliser du code portable sur différents systèmes / implémentations, mais notez que ce n'est pas une exigence. L'utilisation de variables définies comme __LINE__, bien que permise par les règles, est déconseillée.

Le gagnant

  • Il s'agit d'un concours de popularité (terminé le 10 juin 2014), où la réponse votée le plus haut par la communauté sera déclarée gagnante sur la base des votes en cours à l'époque.

  • Lors du vote, veuillez considérer la créativité de la réponse de quelqu'un, son caractère élaboré ou intéressant . et les difficultés / contraintes du langage de programmation utilisé

Percée
la source
Qu'entendez-vous par "le premier numéro de ligne"? Parlez-vous de ce qui devrait se produire si l'instruction s'étend sur plusieurs lignes?
user2357112 prend en charge Monica
@ user2357112 oui, juste pour résoudre toute ambiguïté si quelqu'un avait besoin d'utiliser une instruction milti-line.
Percée du
Le titre est très explicite, mais peut-être un peu long.
primo
1
Les réponses à toutes ces questions sont ennuyeuses car c'est une si mauvaise question. C'est comme si le demandeur ne connaissait pas l'existence de LINE . En fait, je me suis inscrit spécifiquement pour voter contre, je pensais que c'était si mauvais.
dave
1
@Markasoftware si une ligne était ajoutée avant, la sortie ne changerait pas pour refléter cela.
primo

Réponses:

48

Sinclair Basic

10 PRINT "Hello world, from line ";PEEK 23621;"!"

Bonjour tout le monde, à partir de la ligne 10!

Cela fonctionnera pour n'importe quelle ligne en PEEKing à l'adresse stockant le numéro de ligne actuel, donc les éléments suivants fonctionneront également:

341 PRINT "Hello world, from line ";PEEK 23621;"!"

Bonjour tout le monde, à partir de la ligne 341!

kitcar2000
la source
Et du même coup, Timex / Sinclair BASIC!
Gabe
Je ne prétends pas connaître cette langue, mais ne pouvez-vous pas laisser de côté STR$si vous remplacez les +signes par des points-virgules?
M. Lister
@MrLister Oui, cela fonctionnerait certainement, mais j'utilise toujours +s par habitude.
kitcar2000
40

DE BASE

Je pense que cela fait tout ce qui était demandé:

10 PRINT "Hello World, from line 10!"
ossifrage délicat
la source
5
If any additional whitespace or statements (which do not interrupt the flow of the code) is added to the source code, it should be reflected at run-time (after compiling if applicable). L'intention est là. De plus, c'est la première ligne de la source, pas la 10e.
Bill Woodger
30
Il peut s'agir de la première ligne du code source, mais c'est toujours la ligne 10 .
squeamish ossifrage
13
Je crois que cela tombe fermement dans la catégorie qui n'est plus drôle . C'est vraiment sans imagination et sans intérêt, bien qu'il réponde littéralement à l'exigence. Pourquoi cela a-t-il autant de votes positifs? (J'ai downvoted)
Tim S.
18
C'est une excellente réponse car elle prend un avantage idiot mais spécifique d'un aspect du langage BASIC qui n'est pas communément trouvé dans d'autres langues (en particulier les langues modernes). Ce n'est peut-être pas le plus populaire (le temps nous le dira), mais je peux à peine voir à quel point c'est moins intéressant que d'utiliser une constante telle que __LINE__ ou d'obtenir des informations de débogage à partir du cadre de pile actuel (comme la plupart des autres réponses le font actuellement).
Nick
2
Intelligent, mais je serais déçu si rien d'autre ne finissait avec plus de votes positifs que celui-ci.
agweber
35

Java

public class Hello{
    public static void main(String[] args) {
        System.out.println("Hello World, from line "+new Exception().getStackTrace()[0].getLineNumber()+"!");
    }
}
Bébé
la source
1
Je préfèreThread.currentThread().getStackTrace()
Cruncher
3
Thread.getStackTrace () appelle (new Exception ()). GetStackTrace () s'il est appelé sur le thread actuel, c'est donc la même chose
DHall
1
bizarre .... 2x même réponse et 2 montants de votes différents ... (pourrait être utilisé comme source RNG ...) (même ici: codegolf.stackexchange.com/a/30058/10801 )
masterX244
@ masterX244 ces deux réponses ne sont pas exactement identiques; celui-ci utilise la getLineNumber()méthode sur la trace de la pile, tandis que la réponse à laquelle vous avez lié l'utilise toString()pour trouver le numéro de ligne.
Percée du
9
@ masterX244, il convient également de noter que cette réponse est apparue 2 heures plus tôt. La deuxième fois que je vois une réponse, elle n'est pas aussi intéressante que la première.
primo
30

Perl

close STDERR;
open FOOBAR,">",\$_;


print!warn,'Hello World, from line ',/(\d+)\.$/,'!';

Pas aussi court que d'utiliser __LINE__ , mais peut-être plus intéressant.

warnest un outil de débogage, qui envoie une instruction à STDERR, indiquant dans quel fichier et sur quelle ligne l'avertissement a été émis ... sauf s'il STDERR a été précédemment fermé ou est autrement inaccessible, auquel cas l'avertissement est émis vers le dernier fichier ouvert handle - c'est un comportement non documenté. Je ne sais pas si ce serait mieux classé comme une fonctionnalité ou un bug.

Ici, STDERRest fermé et un nouveau descripteur de fichier identifié comme FOOBARétant ouvert et routé vers la variable $_. Ceci est ensuite analysé pour récupérer le numéro de ligne de l'avertissement, qui est incorporé dans l'instruction d'impression.

primo
la source
3
Oui, c'est définitivement plus intéressant :)
Tal
27

C ++

#include <iostream>
#include <utility>
#include <type_traits>

#define __(A,B,C,...) B##C##A
#define _(A,...) __(__VA_ARGS__, A)
template<unsigned...Is> struct v;
template<unsigned I0, unsigned... Is> struct v<I0, Is...>:v<I0-1,I0-1, Is...> {};
template<unsigned...Is> struct v<0,Is...>:std::integral_constant<unsigned, sizeof...(Is)> {};

int main() {
  std::cout << "Hello world from line " << v<_(EXTRACT,_(Q,_,E,_,$$main$$,),_(@22,,_,_),_(Z,N,L,I,_,,L),__STACK_TRACE__)>::value << "\n";
}

exemple en direct

Yakk
la source
2
C'est ... la magie
Paladine
1
Il m'a fallu un… long moment pour voir comment cela fonctionnait. Soo beaucoup de harengs rouges! C'est délicieux.
sehe
1
Alors, comment ça marche?
0x499602D2
16

Lua

print("Hello world, from line "..debug.getinfo(1).currentline.."!")
mniip
la source
16

C #

C # 5.0 [CallerLineNumber]fait l'affaire:

using System;
using System.Linq;
using System.Runtime.CompilerServices;
namespace LineNumberConsole
{
    class Program
    {
        public static void Main()
        {
            Console.WriteLine("Hello World, from line {0}!", ToRoman(GetLineNumber()));
            Console.ReadLine();
        }

        private static int GetLineNumber([CallerLineNumber] int sourceLineNumber = 0)
        {
            return sourceLineNumber;
        }

        private static string ToRoman(int number)
        {
            // TODO: Copy some source code from http://pastebin.com/w0hm9n5W
            // Skipped here for brevity
            return number.ToString();
        }
    }
}

Sortie

Hello World, from line X!
Thomas Weller
la source
Une raison particulière d'utiliser des chiffres romains?
Cole Johnson
4
Lorsque la ligne d'impression est la ligne 10, la question est interprétée littéralement. Xen chiffres romains est 10.
Οurous
Les chiffres romains sont une belle touche!
NPSF3000
15

C

#include <stdio.h>
main(){
printf("Hello World, from line %d!", __LINE__);
}
grignoteur
la source
L'utilisation de variables définies comme LINE , bien qu'autorisée par les règles, est déconseillée.
vaxquis
@vaxquis, oui mais ma réponse est antérieure à la modification de la question
gnibbler
c'est toujours une solution moche et trop évidente OMI. Je me demande pourquoi les gens ont posté toutes sortes de variantes de cette solution dans toutes les langues du monde (y compris PHP, D, Perl) au lieu d'essayer même de faire quelque chose de drôle à distance ou intrigant?
vaxquis
14

Python

Exemple (10 lignes, 213 caractères):

import sys
import traceback
lineno = None
while True:
    try:
        print 'Hello World, from line %d!' % lineno
        break
    except:
        lineno = traceback.tb_lineno(sys.exc_info()[2])
        continue

Essayez en ligne ici . Un code sans modification de flux et des espaces peuvent être ajoutés et le programme affichera le nombre de lignes mis à jour. De même, cet extrait de code peut également être utilisé n'importe où dans un programme existant. Production attendue:

Hello World, from line 6!

Un autre exemple (essayez en ligne ici) pour montrer que cela fonctionne lorsque du code / espace est ajouté. Production attendue:

Down we go...
Gotta catch 'em all.
Down we go...
Hello World, from line 11!
Awesome!
Percée
la source
12

Javascript

function getLine(n) {
   try {
      to
   } catch (dat) {
      var stack = dat.stack.split('\n');
       for (var i = 0; i < stack.length; i++) {
           if (~stack[i].indexOf ('getLine')) break;          
       }
      return dat.stack.split ('\n')[i + ~~n].match (/:(\d+)/)[1] - ~~window.hasOwnProperty ('__commandLineAPI')
   }
}
//Line 12
console.log ('Hello World, from line ' + getLine(1) + ' !')

Remarque: les expressions, évaluées à partir de la console de développement Chrome seront enveloppées dans une withinstruction. Nous devons donc décrémenter la ligne d'une unité si tel est le cas

C5H8NNaO4
la source
2
pile de données , hehe. Vérifié en travaillant sur Firefox.
Percée du
1
@Breakthrough :) Oui, cela fonctionne sur plusieurs navigateurs (testé uniquement avec les derniers Chrome, FF, IE). Chrome a besoin d'un traitement spécial lorsqu'il est évalué à partir de la console, car il encapsule chaque instruction dans une withclause.
C5H8NNaO4
2
Nom d'utilisateur intéressant mais ambigu. Du glutamate monosodique, peut-être? (BTW, je pense faire une question sur l'ADN et les acides aminés, dont l'acide glutamique en est un.)
Level River St
@steveverrill Selon google, vous avez raison !
kitcar2000
@ kitcar2000 Probablement. Mais il existe d'autres composés moins connus avec cette formule: le méthylaspartate de sodium ou le nitropentanoate, par exemple.
Level River St
11

Python 3

import hashlib
with open(__file__) as f:
    line_num = 0
    for line in f.readlines():
        line = line.rstrip() # make it work with or without newline at the end
        line_num += 1
        if hashlib.sha256(bytes(line, "UTF-8")).hexdigest()[0:6] == 'cc46f7':
            print('Hello world, from line {}!'.format(line_num)) # cc46f7

Bonjour tout le monde, à partir de la ligne 8!

Ce code à lecture automatique contient un hachage auto-référencé. La somme SHA256 de la dernière ligne (avec les espaces de début et sans espaces de fin) commence par cc46f7... . Lorsqu'il hache la printligne, il constate que le hachage correspond à la valeur magique qu'il recherche.

Tim S.
la source
ne pourriez-vous pas simplement mettre line_num = à -1 et avoir l'impression en dehors de la boucle et faire le tour du hachage magique?
dave
1
@dave pas sûr de te suivre. Le hachage magique est ce qui rend cette solution intelligente.
Tim S.
+1 pour l'interprétation littérale de mes règles :) Très intelligent.
Percée du
5
@Stefan Ce site est cependant consacré aux pires pratiques. ;)
Tim S.
1
@sehe Très probablement, cela était dû à des problèmes d'espace. Je n'avais pas de nouvelle ligne à la fin du fichier quand je l'ai fait. J'ai ajouté une ligne pour supprimer les espaces à la fin de la ligne avant de hacher. Cela devrait fonctionner de manière plus cohérente maintenant. (assurez-vous également que vous ne convertissez pas les espaces en onglets) J'ai essayé de le télécharger sur ideone pour vous montrer une version en direct, mais il ne peut pas y lire son propre fichier.
Tim S.
9

GNU COBOL

Eh bien, ils ont dit que cela ne pouvait pas être fait. En fait, c'est moi qui ai dit que cela ne pouvait pas être fait. Maintenant c'est fait, et une fonction de langage obsolète a été réimplémentée en utilisant la méthode appliquée.

La question dit:

Si des espaces ou des instructions supplémentaires (qui n'interrompent pas le flux du code) sont ajoutés au code source, ils doivent être reflétés au moment de l'exécution (après la compilation, le cas échéant).

N'importe quelle quantité de trucs peut être inséré avant les trois DISPLAYs qui provoquent le début de la sortie, et rien après leDISPLAY s "interrompra le flux du code", donc c'est OK.

COBOL avait un TRACEverbe (instruction) qui listait simplement les numéros de ligne source au fur et à mesure de leur exécution (pas d'accès au numéro de ligne dans le programme). Bien que d'utilisation limitée, j'ai inclus une implémentation de TRACE.

   ID Division.
   Program-ID. HIWHERE.
   ENVIRONMENT DIVISION.
   configuration section.
          source-computer. TinkerToy with debugging mode.
   Procedure Division.
   Declaratives.
   Debug-Declaratives Section.
       Use For Debugging on a b
       .
   Debug-Declaratives-Paragraph.
       Display Debug-Line "!"
       .
   End Declaratives
       .
   Main-Program Section.
       DISPLAY "Perform"
       Display "Hello World, from line " no advancing Perform b
       display "GO TO"
       Display "Hello World, from line " no advancing GO TO a
       .
   a.
       dISPLay "Fall through"
       Display "Hello World, from line " no advancing. b.
   The-Last-bit-OF-the-PROGRAM.
       GOBACK
       .

La sortie est

Perform
Hello World, from line     18!
GO TO
Hello World, from line     20!
Fall through
Hello World, from line     23!

Pour montrer la puissance et la flexibilité de l'écriture de la langue, cet exemple utilise à la fois des casse mixte, entièrement en minuscules et entièrement en majuscules. Peu importe, car lors du traitement, tout est "plié" en MAJUSCULE.

La seule façon COBOL standard d'obtenir un numéro de ligne source dans le programme en cours d'exécution, à partir du programme en cours d'exécution, est d'utiliser a DEBUGGING DECLARATIVE. Dans un SECTION, strictement dans un paragraphe dans unSECTION , d'un tel déclaratif, vous avez accès au registre spécial DEBUG-LINE. Il contient le numéro de ligne source du verbe (instruction) qui a provoqué le transfert du contrôle vers un nom de procédure particulier (paragraphe ou SECTION).

Donc avec PERFORM , ou GO TO, ou "tomber" dans le paragraphe dans les déclarations de débogageSECTION est exécuté.

OK mais DISPLAY ne provoque pas de transfert de contrôle.

Aucun problème. Mettez-le sur la même ligne que le transfert de contrôle.

Problème, car si "des espaces ou des instructions supplémentaires (qui n'interrompent pas le flux du code) sont ajoutés au code source, ils doivent être reflétés au moment de l'exécution (après avoir compilé le cas échéant)".

Donc, mettez-le sur la même ligne mais devant un transfert de contrôle, divisez le contenu duDISPLAY en deux morceaux (rappelez-vous, "Dans ce contexte, nous voulons que le premier numéro de ligne de l'instruction qui génère la chaîne soit affiché" ) et sortir la première partie avant le transfert de contrôle, et la deuxième partie, depuis leDEBUG-LINE , une fois à l'intérieur de la procédure de débogage.

Le dernier bit délicat est pour la "chute" (les "procédures" peuvent être PERFORMéditées, peuvent être la cible d'un GO TO, ou peuvent être entrées simplement en étant la ligne suivante le long). Dans ce cas, mettez le DISPLAY sur la ligne qui définit la procédure, mais devant la définition .

Les noms des "procédures" ( aet b) ont été considérablement raccourcis pour leur permettre de tenir sur la même ligne source que le DISPLAY. Strictement, un nom de procédure COBOL devrait commencer quelque part de la colonne huit à la colonne 11. Cependant, la syntaxe est, de nos jours, beaucoup plus détendue à ce sujet. Dans la mesure où je peux définir un nom de procédure sur la même ligne qu'un code. Même intégré dans le code. Des soins et un arrêt complet occasionnel sont nécessaires.

dans le PROCEDURE DIVISION chaque point d'arrêt indiqué est requis, et pas plus.

Compiler:

cobc -x -g hiwhere.cbl

Pour exécuter (linux):

COB_SET_DEBUG=Y ./hiwhere

Enfin, le retour de TRACE (sans READY / RESET).

   ID Division.
   Program-ID. tRacE.
   ENVIRONMENT DIVISION.
   configuration section.
          source-computer. TinkerToy with debugging mode.
   Procedure Division.
   Declaratives.
   Debug-Declaratives Section.
       Use For Debugging on a
       .
   Debug-Declaratives-Paragraph.
       Display Debug-Line
       .
   End Declaratives
       .
   Main-Program Section.
  *    Just append "perform a" to a single-line statement.
       DISPLAY "1" . perform a
       Display "2" . perform a
       display "3" . perform a
  *    Or prepend "perform a." for a multi-line statement, or a
  *    statement which won't "come back". 
       perform a. GOBACK
       .
   a.
       CONTINUE
       .

La sortie est:

1
    17
2
    18
3
    19
    20

Où 1, 2 et 3 sont sortis des trois instructions DISPLAY, et 17, 18, 19 et 20 sont les numéros de ligne des lignes "exécutables" (sans débogage).

Bill Woodger
la source
8

Java

Utilisation du comportement de la trace de pile d'Exception pour obtenir la ligne actuelle. tant que Printstatement n'est pas modifié en plusieurs lignes ou que le fichier de classe est modifié, cela devrait fonctionner

public class PrittLnbr
{
    public static void main(String[] args)
    {
        System.out.println("Hello World, from line "+new Error().getStackTrace()[0].toString().split(":")[1]+"!");
    }
}
masterX244
la source
8

Python

import traceback, inspect
frame = inspect.currentframe()
print("Hello World, from line "+traceback.format_stack(frame)[0].split()[3][:-1]+"!")  
Hannes Karppila
la source
6

Perl

print 'Hello World, from line '.__LINE__.'!';
Tal
la source
13
Il s'agit également d'une solution PHP valide.
MrLore
6

Java

public class HelloFrom {
    public static void main(String[] args) {
        System.out.println("Hello World, from line " + Thread.currentThread().getStackTrace()[1].getLineNumber() + "!");
    }
}
Cineris
la source
techniquement le même que moi ( codegolf.stackexchange.com/a/30058/10801 )
masterX244
2
En quelque sorte, sauf en utilisant le thread actuel au lieu de créer une nouvelle erreur pour obtenir la trace de la pile. Il n'y a pas d'erreur;)
Cineris
6

Python

import inspect
print ("Hello world from line %d!" % (inspect.getlineno(inspect.currentframe())))

Sortie

Hello World from line 2!
Ricardo A
la source
1
Meilleur Python jusqu'à présent!
kirbyfan64sos
6

Befunge

Fait juste pour le plaisir.

>00g1+:00p"v"\10v  
    v-*45g00p\g <  
#v+1_$10g1vv,,,,<  
^<p000p01+<#>,,,^  
>" enil morf ,oll"v
@.,,,,,,,,,<^,"He"<

Conditionnel: le coin supérieur gauche du code doit être 0 <x <20 et 0 <= y <62; et les deux premières cellules doivent être vides.

Exemple:

                         v                  

                         0                  
                         0                  
                         0                  
                         p                  
                         0                  
                         1                  
                         0                  
                         p                  
                         >00g1+:00p"v"\10v  
                             v-*45g00p\g <  
                         #v+1_$10g1vv,,,,<  
                         ^<p000p01+<#>,,,^  
                         >" enil morf ,oll"v
                         @.,,,,,,,,,<^,"He"<

Produirait:

Bonjour, de la ligne 10

AndoDaan
la source
Aucune idée de ce que c'était, mais je crois que votre revendication de sortie, alors +1 ;-)
ysap
1
Pour ceux qui remettent en question le pouvoir du puissant Befunge, essayez-le ici: quirkster.com/iano/js/befunge.html
Justin
6

C

En utilisant une macro variadique, nous pouvons créer une fonction d'impression qui ajoute automatiquement le numéro de ligne à la fin d'une instruction printf arbitraire, et imprime toujours sur stdout.

test.c:

#include <stdio.h>

#define printfl(format, ...) fprintf(stdout, format " From line %d\n", ##__VA_ARGS__, __LINE__)

int main() {
    printfl("Hello World! I have %d argument(s).", 1);
    return 0;
}

les sorties:

% ./test
Hello World! I have 1 argument(s). From line 6

Remarque: J'ai dévié du modèle pour démontrer que printfl est toujours une fonction variadique valide; si vous vous souciez vraiment du format de la sortie, vous pouvez toujours changer les littéraux que j'utilise.

Walker Mills
la source
Cela ne fonctionne que si vous utilisez une chaîne de format constant. Il échoue si vous transmettez une autre expression pour la chaîne de format.
Snowbody
5

Frapper

#
# some comments to fill some lines...
#
echo "Hello World, from line $LINENO!"

Sortie

Hello World, from line 4!
kitcar2000
la source
@professorfish ... qu'est-ce qui ne va pas avec MON style pour montrer MA réponse? Vous devriez au moins expliquer pourquoi vous manipulez mes illustrations ... :-P
2
ai-je changé le code? si je l'ai fait, je suis désolé. J'étais juste inquiet que les utilisateurs non-bash ne puissent pas dire quel était le code source et quelle était la sortie
1
Et tout le monde à part moi aime voir ses trucs changer sans commenter pourquoi? Lieu étrange ...
3
C'était essentiellement un correctif de formatage. Il n'y a rien de vraiment mal avec ces AFAIK
L'utilisation de variables définies comme LINE , bien qu'autorisée par les règles, est déconseillée.
vaxquis
5

void main ()
{
    import std.stdio;
    writefln("Hello World, from line %d", __LINE__);
}
Hugo Dubé
la source
L'utilisation de variables définies comme LINE , bien qu'autorisée par les règles, est déconseillée.
vaxquis
5

C ou C ++ et AWK

lineno.c:

// code or comments
// ....
#error Hello World, from line
// other code or comments

Usage:

gcc lineno.c 2>&1 | awk '{ split($0,a,":"); ; printf("%s %s!\n", gensub(".*#error ","",1), a[2]); exit; }'

Sortie:

Bonjour, le monde, de la ligne 3

Remarques:

  • Aucun code écrit par l'utilisateur ne recherche le fichier.
  • g ++ fonctionnera sur un fichier c ++.
Ken A
la source
4

Type d'ennui dans Ruby:

puts "Hello World, from line #{__LINE__}!"

Ce n'est pas de la triche, non?

Ajedi32
la source
Non, ce n'est pas de la triche! Ce défi sera évidemment beaucoup plus facile dans certaines langues et plus difficile dans d'autres, cependant, c'est pourquoi je l'ai posté :) (je vois maintenant pourquoi l'inclusion d'un critère de notation est si importante)
Percée du
L'utilisation de variables définies comme LINE , bien qu'autorisée par les règles, est déconseillée.
vaxquis
1
@vaxquis Oui, cette déclaration a été ajoutée après cette réponse.
Ajedi32
4

Javascript

Une ligne utilisant la trace de pile.

(function (o) { console.log("Hello World, from line " + (Error.captureStackTrace(o) || o.stack.match(/\d+/)[0] - !!__commandLineAPI) + "!"); })({});
joelrobichaud
la source
3

Cobra

class Program
    def main
        print 'Hello World, from line [System.Diagnostics.StackFrame(true).getFileLineNumber]!'
Οurous
la source
3

Rubis

File.write "hello.rb", "x=2\n"+"x+=1\n"*rand(rand(100))+'puts "Hello World, from line #{x}!"'
system "ruby hello.rb"
File.delete "hello.rb"
afuous
la source
3

PowerShell

Mouvement pas cher

Function LemmeGetDatError() {
    "Too busy chuggin along"
    "Then all of a sudden, I meet a new programmer"
    "And he's all like"
    Write-Output "$(Try {"Hello World from"; Throw "error" } Catch {$_.ScriptStackTrace.Split(":")[1]})"
}

LemmeGetDatError
SomeShinyMonica
la source
3

Powershell

$l=(Get-PSCallStack | ForEach{$_.Location})[0].split(' ')[-1]; "Hello World, from line $l!"

Et:

try{ I AM ERROR. } catch { $l=$error[0].InvocationInfo.ScriptLineNumber; "Hello World, from line $l!" }

Les deux fonctionnent comme ceci:

PS C:\MyFolder> .\helloworld.ps1
Hello World, from line 1!
DarkAjax
la source
+1, mais Write-Hostn'écrit pas sur stdout. Le simple fait de passer la chaîne l'enverra à stdout. Par exemple"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Rynant
@Rynant Bon point! Je mettrai à jour mes réponses pour considérer que ...
DarkAjax
3

Python

import traceback

print 'Hello World, from line %i!' % traceback.extract_stack()[0][1]

Court et doux.

Hoons
la source
3

Perl

Un autre Perl:

use warnings;

$SIG{__WARN__} = sub { ($line = shift) =~ s/\D//g; };

$x=$x+1; print "Hello World, form line $line!\n";
DarkAjax
la source